Amiga-Request@cs.odu.edu (Amiga Sources/Binaries Moderator) (06/28/90)
Submitted-by: Matt Dillon <@uunet.uu.net:overload!dillon> Posting-number: Volume 90, Issue 182 Archive-name: unix/uucp-1.06d/part04 #!/bin/sh # This is a shell archive. Remove anything before this line, then unpack # it by saving it into a file and typing "sh file". To overwrite existing # files, type "sh file -c". You can also feed this as standard input via # unshar, or by typing "sh <file", e.g.. If this archive is complete, you # will see the following message at the end: # "End of archive 4 (of 12)." # Contents: uucp2/src/GUtil/gnote.c uucp2/src/GUtil/uuserdump.c # uucp2/src/anews/followup.c uucp2/src/anews/reply.c # uucp2/src/dmail/do_lists.c uucp2/src/dmail/range.c # uucp2/src/lib/config.c uucp2/src/lib/list_sort.c # uucp2/src/news/postnews.c uucp2/src/unix/tarsplit.c # uucp2/src/unix/uudecode.c uucp2/src/uucico/modem.c # uucp2/src/uucico/uucp.c uucp2/src/uucico/uux.c # Wrapped by tadguy@xanth on Thu Jun 28 08:21:21 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'uucp2/src/GUtil/gnote.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/GUtil/gnote.c'\" else echo shar: Extracting \"'uucp2/src/GUtil/gnote.c'\" \(3473 characters\) sed "s/^X//" >'uucp2/src/GUtil/gnote.c' <<'END_OF_FILE' X X/* X * GNOTE.C X * X * $Header: Beta:src/uucp/src/GUtil/RCS/gnote.c,v 1.1 90/02/02 11:58:55 dillon Exp Locker: dillon $ X * X * (C) Copyright 1989-1990 by Matthew Dillon, All Rights Reserved. X * X * GNOTE hellofile notefile X * X * Allow the user to enter a note and append it to notefile. See X * Getty. Password entry should have a '*' in front of the executable X * name for Getty to provide automatic stdin/stdout X * X */ X X#include <stdio.h> X#include <time.h> X#include "protos.h" X#include "version.h" X XIDENT(".01"); X Xchar *GetLine(); Xvoid PutDaChar(); Xvoid FlushChars(); X Xmain(ac, av) Xchar *av[]; X{ X time_t t; X char *ptr; X FILE *fi; X X time(&t); X X if (ac < 3) { X printf("gnote: expect 2 arguments, got %d\n", ac - 1); X fflush(stdout); X Delay(50*2); X exit(1); X } X printf("%s %s", Ident, ctime(&t)); X if (fi = fopen(av[1], "r")) { X char buf[128]; X while (fgets(buf, sizeof(buf), fi)) { X short len = strlen(buf); X if (len > 0 && buf[len-1] == '\n') X --len; X buf[len++] = 13; X buf[len++] = 10; X buf[len++] = 0; X fputs(buf, stdout); X } X fclose(fi); X } X fflush(stdout); X X if ((fi = fopen(av[2], "a")) == NULL) { X puts("couldn't open note file"); X fflush(stdout); X Delay(50*2); X exit(1); X } X fprintf(fi, "**NOTE** %s", ctime(&t)); X X while (ptr = GetLine()) { X if (strcmp(ptr, ".") == 0) X break; X if (strncmp(ptr, "**NOTE**", 8) == 0) X fprintf(fi, " "); X fprintf(fi, "%s\n", ptr); X } X puts("Thank you, hanging up in 8 seconds"); X fflush(stdout); X fclose(fi); X Delay(50*8); X return(0); X} X X Xchar * XGetLine() X{ X static char buf[256]; X static char tab[256]; X short col = 0; X short i = 0; X short limit = 5*60; /* 5 minute idle timeout */ X short lcnt = 0; X short c; X X for (;;) { X c = GetDaChar(); X if (c == EOF) { X clearerr(stdin); X ++lcnt; X if (lcnt == limit - 30) { X puts("\r\n(idle, hangup in 30)\r\n"); X fflush(stdout); X } X if (lcnt == limit) X break; X continue; X } X lcnt = 0; X X switch(c) { X case 10: X case 13: X PutDaChar('\r'); X PutDaChar('\n'); X FlushChars(); X buf[i] = 0; X return(buf); X case 8: X case 127: X if (i) { X short n = 1; X --i; X if (buf[i] == 9) X n = tab[i]; X col -= n; X while (n--) { X PutDaChar('\010'); X PutDaChar(' '); X PutDaChar('\010'); X } X } X break; X case 'x'&0x1F: X PutDaChar('^'); X PutDaChar('X'); X PutDaChar('\r'); X PutDaChar('\n'); X i = 0; X break; X case 'r'&0x1F: X PutDaChar('\r'); X PutDaChar('\n'); X FlushChars(); X buf[i] = 0; X printf("%s", buf); X fflush(stdout); X break; X case 9: X if (i < sizeof(buf) - 2) { X tab[i] = 8 - (col & 7); X col += tab[i] - 1; /* because we ++ below */ X } X /* fall through */ X default: X if (i < sizeof(buf) - 2) { X PutDaChar(c); X buf[i++] = c; X ++col; X } else { X PutDaChar('g' & 0x1F); X } X break; X } X } X return(NULL); X} X Xvoid XFlushChars() X{ X PutDaChar(256); X} X Xvoid XPutDaChar(c) X{ X static char buf[256]; X static short len; X X if (c == 256 || len == sizeof(buf)) { X if (len) X write(1, buf, len); X len = 0; X } X if (c != 256) X buf[len++] = c; X} X X XGetDaChar() X{ X static char buf[256]; X static short idx, len; X X if (idx == len) { X if (read(0, buf, 0) < 0) X FlushChars(); X idx = 0; X len = read(0, buf, sizeof(buf)); X if (len <= 0) { X len = 0; X return(EOF); X } X } X return((int)buf[idx++]); X} X END_OF_FILE if test 3473 -ne `wc -c <'uucp2/src/GUtil/gnote.c'`; then echo shar: \"'uucp2/src/GUtil/gnote.c'\" unpacked with wrong size! fi # end of 'uucp2/src/GUtil/gnote.c' fi if test -f 'uucp2/src/GUtil/uuserdump.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/GUtil/uuserdump.c'\" else echo shar: Extracting \"'uucp2/src/GUtil/uuserdump.c'\" \(4092 characters\) sed "s/^X//" >'uucp2/src/GUtil/uuserdump.c' <<'END_OF_FILE' X X/* X * UUSERDUMP.C X * X * $Header: Beta:src/uucp/src/GUtil/RCS/uuserdump.c,v 1.1 90/02/02 11:58:57 dillon Exp Locker: dillon $ X * X * (C) Copyright 1989-1990 by Matthew Dillon, All Rights Reserved. X * X * UUSERDUMP filename X * X * KEY THINGS ABOUT UUSER: USED AS STDIN/STDOUT X * X * Currently UUSER: works only with single sessions started X * by Getty (this has to do with how UUSER: deals with carrier X * detect). THIS WILL BE FIXED. X * X * (1) Use Level 1 I/O if you can (read/write) X * read() returns 0 on timeout, -1 on carrier lost X * otherwise, read() returns the immediate number of X * data bytes ready up to the amount you requested. X * (i.e. if you read(0,buf,256) you can get anywhere from X * -1, 0, 1 to 256 back). X * X * write() returns the number you wrote or -1 (lost carrier) X * X * To 'poll' data ready you can read(0, NULL, 0) .. reading X * 0 bytes returns 0 (data ready) or -1 (data not ready). X * NOTE: 0 (data ready) will be returned if carrier is lost X * when you read 0 bytes... this is so your program thinks X * data is ready and when it does a real read it finds that X * carrier was lost! X * X * (2) If you want to use Level 2 I/O (stdio) I suggest you use X * it for writing only. If you really want to use it for X * reading remember that the timeout will cause an EOF X * condition which must be cleared (clrerr()). And you X * must call ferror() to determine whether an EOF is an X * EOF (timeout()) or an actual error (lost carrier). X */ X X#include <stdio.h> X#include "protos.h" X#include "version.h" X XIDENT(".01"); X Xchar buf[256]; Xshort i; X Xint Xbrk() X{ X return(0); X} X Xmain(ac, av) Xchar *av[]; X{ X short i; X char c; X short n; X FILE *fi = fopen(av[1], "r"); X X onbreak(brk); X /* X * set output to line buffering (stdio), else it will use X * file buffering! Which is bad if we want to catch ^S/^C X */ X X setvbuf(stdout, NULL, _IOLBF, 0); X X X if (ac == 1) X exit(1); X X if (fi == NULL) X printf("Info file %s not available\r\n", av[1]); X X printf("Dumping info file (suggest capture), hit Enter when ready\n"); X fflush(stdout); X X /* X * Getty uses the R1000 option, so there is a one second timeout X * on reads when no data is present. If data is present, UUSER: X * returns the number of bytes immediately available regardless of X * how many you requested. X */ X X for (i = 0; i < 60; ++i) { X n = read(0, &c, 1); X if (n < 0) /* lost carrier */ X exit(1); X /* success */ X if (n > 0 && (c == 10 || c == 13)) X goto skip; X /* timeout */ X } X exit(1); Xskip: X while (fgets(buf, 256, fi)) { X short len = strlen(buf); X if (CheckControl()) X break; X if (len > 0 && buf[len-1] == '\n') X --len; X buf[len++] = 13; X buf[len++] = 10; X buf[len++] = 0; X fputs(buf, stdout); X } X fclose(fi); X X printf("End of dump, any key to disconnect\n"); X fflush(stdout); X for (i = 0; i < 60; ++i) { X n = read(0, &c, 1); X if (n == 0) /* 1 second timeout */ X continue; X break; /* any key or lost cd */ X } X return(0); X} X X/* X * Here we use a UUSER: trick ... requesting 0 bytes in a read() X * incurs NO timeout. 0 is returned if data is ready, -1 if data X * is not ready. X * X * Another way to do it is to dump a seconds worth of data, then X * call read() (which blocks for up to 1 second if no data is X * ready, but the user doesn't see that because we've already queued X * a second's worth of data). The first method is better because X * there is finer granularity (that is, the one used below) X */ X XCheckControl() X{ X char c = 0; X short n; X X if (read(0, NULL, 0) == 0) { /* returns 0=data ready, -1=not rdy */ X read(0, &c, 1); X if (c == ('s'&0x1F)) { /* ^S */ X for (;;) { X n = read(0, &c, 1); X if (n < 0) /* lost carrier */ X exit(1); X if (n == 0) /* timeout */ X continue; X break; /* got a key */ X } X return(0); X } X if (c == ('c'&0x1F)) /* ^C */ X return(1); X } X return(0); X} X END_OF_FILE if test 4092 -ne `wc -c <'uucp2/src/GUtil/uuserdump.c'`; then echo shar: \"'uucp2/src/GUtil/uuserdump.c'\" unpacked with wrong size! fi # end of 'uucp2/src/GUtil/uuserdump.c' fi if test -f 'uucp2/src/anews/followup.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/anews/followup.c'\" else echo shar: Extracting \"'uucp2/src/anews/followup.c'\" \(4278 characters\) sed "s/^X//" >'uucp2/src/anews/followup.c' <<'END_OF_FILE' X X/* X * FOLLOWUP.C X */ X X#include "news.h" X#include <time.h> X Xstatic char Buf[256]; X Xchar *findheader(); X Xstatic char *TempFileName = "T:anews.post.tmp"; X X/* X * NOTE: fp can be NULL X */ X Xvoid Xfollowup(cmd, fp, group) Xint cmd; XFILE *fp; Xconst char *group; X{ X FILE *fo = fopen(TempFileName, "w"); X char *ptr; X char *nodename = FindConfig(NODENAME); X char *system_name = FindConfig(NEWSFEED); X char *user = FindConfig(USERNAME); X char *domain = FindConfig(DOMAINNAME); X char *realname = FindConfig(REALNAME); X int yes = 0; X time_t t = time(NULL); X int seq = GetSequence(0); X static char *envuser; X static char *envrealname; X X if (fo == NULL) { X printf("can't create %s\n", TempFileName); X return; X } X X if (nodename == NULL || system_name == NULL || user == NULL || realname == NULL) { X printf("Incomplete Configuration, one of:\n"); X printf("\t%s %s %s %s\n", NODENAME, NEWSFEED, USERNAME, REALNAME); X fclose(fo); X return; X } X if (domain == NULL) X domain = ".UUCP"; X X /* X * Enviroment variable overides X */ X X if (envuser == NULL) X envuser = MallocEnviro("USER"); X if (envrealname == NULL) X envrealname = MallocEnviro("REALNAME"); X if (envuser) X user = envuser; X if (envrealname) X realname = envrealname; X X /* X * Create news file X */ X X fprintf(fo, "Path: %s!%s\n", nodename, user); X fprintf(fo, "From: %s@%s%s (%s)\n", user, nodename, domain, realname); X fprintf(fo, "Newsgroups: %s\n", group); X X fprintf(fo, "Subject: "); X if (fp) X fprintf(fo, "Re: "); X if (ptr = findheader(fp, "Subject:")) { X if (strncmpi(ptr, "re:", 3) == 0) X ptr += 3; X while (*ptr == ' ' || *ptr == 9) X ++ptr; X fprintf(fo, "%s", ptr); X free(ptr); X } X fputs("\n", fo); X X fprintf(fo, "Message-Id: <%04d.AA%04d@%s%s>\n", seq, seq, nodename, domain); X fprintf(fo, "Date: %s", ctime(&t)); X fprintf(fo, "Followup-To: %s\n", group); X fprintf(fo, "Expires: \n"); X fprintf(fo, "Keywords: \n"); X X fprintf(fo, "Distribution: "); X if (ptr = findheader(fp, "Distribution:")) { X fprintf(fo, "%s", ptr); X free(ptr); X } else { X fputs("world", fo); X } X fputs("\n", fo); X X /* X * upper case, include text X */ X X fputs("\n", fo); X X if (fp && cmd >= 'A' && cmd <= 'Z') { X rewind(fp); X while (fgets(Buf, sizeof(Buf), fp) && Buf[0] != '\n'); X while (fgets(Buf, sizeof(Buf), fp)) { X fprintf(fo, ">"); X fputs(Buf, fo); X } X } X fputs("\n", fo); X X /* X * append signature X */ X X { X FILE *fi; X X sprintf(Buf, "%s.signature", user); X fi = openlib(Buf); X if (fi == NULL) X fi = openlib(".signature"); X X if (fi) { X fputs("--\n", fo); X while (fgets(Buf, sizeof(Buf), fi)) X fputs(Buf, fo); X fclose(fi); X } else { X puts("Warning, no .signature file!"); X } X } X X fclose(fo); X X /* X * Edit the file X */ X X sprintf(Buf, "%s %s", GetConfig(NEWSEDITOR, GetConfig(EDITOR, "dme")), TempFileName); X system(Buf); X X /* X * want to post this? X */ X X cooked(stdin); X printf("Do you want to post this? 'y' or 'n' :"); X fflush(stdout); X while (fgets(Buf, sizeof(Buf), stdin)) { X if (strcmp(Buf, "y\n") == 0 || strcmp(Buf, "yes\n") == 0) { X yes = 1; X break; X } X if (strcmp(Buf, "n\n") == 0 || strcmp(Buf, "no\n") == 0) { X break; X } X printf("'y' or 'n' please: "); X fflush(stdout); X } X raw(stdin); X if (yes) { X sprintf(Buf, "%s %s \"%s!rnews\"", GetConfigProgram(UUX), TempFileName, system_name); X system(Buf); X } X remove(TempFileName); X} X X/* X * Finds the requested header in the file. Deletes extra space at the end X * and resulting string does not have a newline. X */ X Xchar * Xfindheader(fp, hdr) XFILE *fp; Xchar *hdr; X{ X int len = strlen(hdr); X X if (fp == NULL) X return(NULL); X X rewind(fp); X X while (fgets(Buf, 256, fp) && Buf[0] != '\n') { X if (strncmp(Buf, hdr, len) == 0) { X char *ptr = Buf; X char *ret = malloc(strlen(ptr + len) + 1); X X while (ptr[len] == ' ' || ptr[len] == 9 || ptr[len] == '\n') X ++len; X strcpy(ret, ptr + len); X for (len = strlen(ret) - 1; len >= 0; --len) { X if (ret[len] != ' ' && ret[len] != 9 && ret[len] != '\n') X break; X } X ++len; X ret[len] = 0; X return(ret); X } X } X return(NULL); X} X END_OF_FILE if test 4278 -ne `wc -c <'uucp2/src/anews/followup.c'`; then echo shar: \"'uucp2/src/anews/followup.c'\" unpacked with wrong size! fi # end of 'uucp2/src/anews/followup.c' fi if test -f 'uucp2/src/anews/reply.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/anews/reply.c'\" else echo shar: Extracting \"'uucp2/src/anews/reply.c'\" \(3184 characters\) sed "s/^X//" >'uucp2/src/anews/reply.c' <<'END_OF_FILE' X X/* X * REPLY.C X * X * Reply to sender of article (creates, edits a file, then pipes it through X * sendmail) X */ X X#include "news.h" X#include <time.h> X Xstatic char Buf[256]; X Xchar *findheader(); Xchar *findheaderNoNull(); X Xstatic char *TempFileName = "T:anews.post.tmp"; X X/* X * NOTE: fp can be NULL X */ X Xvoid Xreply(cmd, fp, group) Xint cmd; XFILE *fp; Xconst char *group; X{ X FILE *fo = fopen(TempFileName, "w"); X char *ptr; X char *user = FindConfig(USERNAME); X char *realname = FindConfig(REALNAME); X int yes = 0; X time_t t = time(NULL); X int seq = GetSequence(0); X static char *envuser; X static char *envrealname; X X if (fo == NULL) { X printf("can't create %s\n", TempFileName); X return; X } X X if (user == NULL || realname == NULL) { X printf("Incomplete Configuration, one of:\n"); X printf("\t%s %s\n", USERNAME, REALNAME); X fclose(fo); X remove(TempFileName); X return; X } X X /* X * Enviroment variable overides X */ X X if (envuser == NULL) X envuser = MallocEnviro("USER"); X if (envrealname == NULL) X envrealname = MallocEnviro("REALNAME"); X if (envuser) X user = envuser; X if (envrealname) X realname = envrealname; X X /* X * Create email template that can be sent through sendmail, handle X * signature and optional included text. X */ X X { X char *to; X X if ((to = findheader(fp, "Reply-To:")) == NULL) X to = findheader(fp, "From:"); X if (to) { X fprintf(fo, "To: %s\n", to); X free(to); X } else { X fprintf(fo, "To: \n"); X } X } X fprintf(fo, "Cc: \n"); X fprintf(fo, "Subject: "); X X if (fp) X fprintf(fo, "Re: "); X if (ptr = findheader(fp, "Subject:")) { X char *xp = ptr; X if (strnicmp(xp, "re:", 3) == 0) X xp += 3; X while (*xp == ' ' || *xp == 9) X ++xp; X fprintf(fo, "%s", xp); X free(ptr); X } X fputs("\n", fo); X X fputs("\n", fo); X X if (fp && cmd >= 'A' && cmd <= 'Z') { X rewind(fp); X while (fgets(Buf, sizeof(Buf), fp) && Buf[0] != '\n'); X while (fgets(Buf, sizeof(Buf), fp)) { X fprintf(fo, ">"); X fputs(Buf, fo); X } X } X fputs("\n", fo); X X /* X * append signature X */ X X { X FILE *fi; X X sprintf(Buf, "%s.signature", user); X fi = openlib(Buf); X if (fi == NULL) X fi = openlib(".signature"); X if (fi) { X fputs("--\n", fo); X while (fgets(Buf, sizeof(Buf), fi)) X fputs(Buf, fo); X fclose(fi); X } else { X puts("Warning, no .signature file!"); X } X } X X fclose(fo); X X /* X * Edit the file X */ X X sprintf(Buf, "%s %s", GetConfig(NEWSEDITOR, GetConfig(EDITOR, "dme")), TempFileName); X system(Buf); X X /* X * want to post this? X */ X X cooked(stdin); X printf("Do you want to send this? 'y' or 'n' :"); X fflush(stdout); X while (fgets(Buf, sizeof(Buf), stdin)) { X if (strcmp(Buf, "y\n") == 0 || strcmp(Buf, "yes\n") == 0) { X yes = 1; X break; X } X if (strcmp(Buf, "n\n") == 0 || strcmp(Buf, "no\n") == 0) { X break; X } X printf("'y' or 'n' please: "); X fflush(stdout); X } X X raw(stdin); X if (yes) { X sprintf(Buf, "%s < %s -f %s", GetConfigProgram(SENDMAIL), TempFileName, user); X system(Buf); X remove(TempFileName); X } else { X printf("File left as %s\n", TempFileName); X } X} X END_OF_FILE if test 3184 -ne `wc -c <'uucp2/src/anews/reply.c'`; then echo shar: \"'uucp2/src/anews/reply.c'\" unpacked with wrong size! fi # end of 'uucp2/src/anews/reply.c' fi if test -f 'uucp2/src/dmail/do_lists.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/dmail/do_lists.c'\" else echo shar: Extracting \"'uucp2/src/dmail/do_lists.c'\" \(4162 characters\) sed "s/^X//" >'uucp2/src/dmail/do_lists.c' <<'END_OF_FILE' X X/* X * DO_LISTS.C X * X * $Header: Beta:src/uucp/src/dmail/RCS/do_lists.c,v 1.1 90/02/02 12:03:33 dillon Exp Locker: dillon $ X * X * (C) Copyright 1985-1990 by Matthew Dillon, All Rights Reserved. X * X * Global Routines: DO_SETLIST() X * DO_LIST() X * DO_SELECT() X * DO_DEFER() X * X * Static Routines: None. X * X * LIST associated commands. X * X */ X X#include <stdio.h> X#include "dmail.h" X X Xdo_setlist(str) Xchar *str; X{ X int i, fw, idx, localecho = 1; X int sac = 1; X X push_break(); X if (ac > sac && strcmp (av[sac], "-s") == 0) { X ++sac; X localecho = 0; X } X hold_load(); X if (ac > sac) { X Listsize = 0; X for (i = sac; i < ac; ++i) { X fw = atoi(av[i]); X if (fw > 4096) X fw = 4096; X if (fw < 0 || (*av[i] < '0' || *av[i] > '9')) X fw = 20; X else X ++i; X if (i >= ac) X continue; X idx = get_extra_ovr (av[i]); X if (idx < 0) { X printf ("To many entries, cannot load: %s\n", av[i]); X fflush (stdout); X continue; X } X header[Listsize] = idx; X width[Listsize] = fw; X ++Listsize; X } X } X nohold_load(); X pop_break(); X if (localecho) { X puts (""); X printf ("Entry Width Field\n\n"); X for (i = 0; i < Listsize; ++i) X printf ("%-6d %-5d %s\n", i, width[i], Find[header[i]].search); X puts (""); X } X return (1); X} X X X/* X * Pre-position # 0 > Current article X * 1 - Read already X */ X Xdo_rlist() X{ X int num = 20; X int istart = Current, iend = Current; X short dir = 1; X short try; X char buf[64]; X X if (av[1]) X num = atoi(av[1]); X if (num < 0) { X dir = -1; X num = -num; X } X for (try = 0; try < 2 && num; ++try, (dir = -dir)) { X int i; X if (dir < 0) { X for (i = Current; i >= 0 && num; --i) { X if (Entry[i].no && !(Entry[i].status & ST_DELETED)) { X istart = i; X --num; X } X } X } else { X for (i = Current; i < Entries && num; ++i) { X if (Entry[i].no && !(Entry[i].status & ST_DELETED)) { X iend = i; X --num; X } X } X } X } X if (istart != iend) { X sprintf(buf, "%d-%d", Entry[istart].no, Entry[iend].no); X ac = 2; X av[1] = buf; X return(do_list()); X } else { X return(-1); X } X} X Xdo_list() X{ X int i, j; X static char curr[10] = { " " }; X X if (ac == 1) { X av[1] = "all"; X ++ac; X } X if (push_base()) { X push_break(); X pop_base(); X PAGER (-1); X pop_break(); X return (-1); X } X PAGER (0); X FPAGER ("\n "); X for (j = 0; j < Listsize; ++j) { X if (width[j]) { X sprintf (Puf, "%-*.*s", X 2 + width[j], X 2 + width[j], X Find[header[j]].search); X FPAGER (Puf); X } X } X FPAGER ("\n"); X rewind_range (1); X while (i = get_range()) { X i = indexof(i); X if (Entry[i].no && ((Entry[i].status & ST_DELETED) == 0)) { X curr[0] = (Entry[i].status & ST_TAG) ? 'T' : ' '; X curr[1] = (i == Current) ? '>' : ' '; X curr[2] = (Entry[i].status & ST_READ) ? 'r' : ' '; X curr[3] = (Entry[i].status & ST_STORED) ? 'w' : ' '; X sprintf (Puf, "%s%-3d", curr, Entry[i].no); X FPAGER (Puf); X for (j = 0; j < Listsize; ++j) { X if (width[j]) { X sprintf(Puf, " %-*.*s", X width[j], X width[j], X Entry[i].fields[header[j]]); X FPAGER (Puf); X } X } X FPAGER ("\n"); X } X } X FPAGER ("\n"); X PAGER (-1); X pop_base(); X return (1); X} X X X Xdo_select(str, mode) Xchar *str; X{ X int ret = 1; X int localecho = 1; X int avi = 1; X int scr; X X if (ac == 1) X return (1); X X SelAll = 0; X X if (strcmp (av[avi], "-s") == 0) { X localecho = 0; X ++avi; X --ac; X } X switch (ac) { X case 2: X SelAll = 1; X if (localecho) X puts ("SELECT ALL"); X ret = m_select (Nulav, mode); X break; X case 1: X break; X default: X ret = m_select (av + avi, mode); X scr = indexof(0); X if (scr > 0 && localecho) X printf ("%d Entries selected\n", Entry[scr].no); X break; X } X if (ret < 0 && localecho) { X puts ("Null field"); X return (-1); X } X return (1); X} X X Xdo_defer() X{ X register int i, j; X X push_break(); X j = 1; X for (i = 0; i < Entries; ++i) { X if (Entry[i].no) X Entry[i].no = (Entry[i].status & ST_READ) ? 0 : j++; X } X pop_break(); X return (1); X} X END_OF_FILE if test 4162 -ne `wc -c <'uucp2/src/dmail/do_lists.c'`; then echo shar: \"'uucp2/src/dmail/do_lists.c'\" unpacked with wrong size! fi # end of 'uucp2/src/dmail/do_lists.c' fi if test -f 'uucp2/src/dmail/range.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/dmail/range.c'\" else echo shar: Extracting \"'uucp2/src/dmail/range.c'\" \(3191 characters\) sed "s/^X//" >'uucp2/src/dmail/range.c' <<'END_OF_FILE' X X/* X * RANGE.C X * X * $Header: Beta:src/uucp/src/dmail/RCS/range.c,v 1.1 90/02/02 12:03:54 dillon Exp Locker: dillon $ X * X * (C) Copyright 1985-1990 by Matthew Dillon, All Rights Reserved. X * X * Global Routines: REWIND_RANGE() X * GET_RANGE() X * SINGLE_POSITION() X * X * Static Routines: None. X * X * X */ X X#include <stdio.h> X#include "dmail.h" X X Xstatic int range_ac; Xstatic int in, start, end; X Xstruct RANOP { X char *name; X int status, kstatus; X}; X Xstatic struct RANOP Ranop[] = { X "all", 0, 0, X "tag", ST_TAG, ST_DELETED, X "wri", ST_STORED, ST_DELETED, X "del", ST_DELETED, 0, X "mar", ST_READ, ST_DELETED, X "unt", 0, ST_DELETED | ST_TAG, X "unw", 0, ST_DELETED | ST_STORED, X "und", 0, ST_DELETED, X "unm", 0, ST_DELETED | ST_READ, X NULL , 0, 0 }; X Xvoid Xrewind_range(beg) X{ X Silence = 0; X range_ac = beg; X X if (range_ac >= ac) { X start = (Current >= 0) ? Entry[Current].no : 0; X end = start; X in = 1; X } else { X in = 0; X } X} X X Xget_range() X{ X register char *ptr; X register int i; X static int status; /* Status items required */ X static int kstatus; /* Status items which cannot be present */ X Xagain: X if (in && start <= end) { X i = indexof(start++); X if (i < 0 || (Entry[i].status & status) != status || X (Entry[i].status & kstatus)) X goto again; X return (start - 1); X } X in = status = kstatus = 0; X if (range_ac >= ac) X return (0); X ptr = av[range_ac++]; X if (*ptr == '-') { X if (xstrncmp (ptr, "-s", 2) == 0) { X Silence = 1; X goto again; X } X start = 1; X ++ptr; X goto dash; X } X if (*ptr < '0' || *ptr > '9') { X start = 1; X end = 0; X for (i = 0; Ranop[i].name; ++i) { X if (xstrncmp (ptr, Ranop[i].name, 3) == 0) { X status = Ranop[i].status; X kstatus = Ranop[i].kstatus; X goto imprange; X } X } X goto again; X } X start = atoi(ptr); X while (*(++ptr)) { X if (*ptr == '-') { X ++ptr; X goto dash; X } X } X if (range_ac >= ac) X return (start); X if (*av[range_ac] == '-') { X ptr = av[range_ac++] + 1; X goto dash; X } X return (start); Xdash: X if (*ptr) { X end = atoi(ptr); X goto imprange; X } X if (range_ac >= ac) { X end = 0; X goto imprange; X } X end = atoi(av[range_ac++]); Ximprange: X if (end == 0) { X end = indexof (0); X if (end < 0) X return (0); X end = Entry[end].no; X } X if (start > end) { X printf ("Bad Range: %s\n", av[range_ac - 1]); X return (0); X } X in = 1; X goto again; X} X X Xsingle_position() X{ X int old = Current; X X switch (ac) { X case 1: X break; X case 2: X if (*av[1] == '\0' || (*av[1] == ' ' && strlen(av[1]) == 1)) X break; X Current = indexof (atoi(av[1])); X if (Current < 0) { X Current = old; X puts ("Out of Range, 0 will take you to the last entry"); X return (-1); X } X break; X default: X puts ("Range not implemented (yet?)"); X return (-1); X } X while (Current < Entries && Entry[Current].no == 0) X ++Current; X if (Current >= Entries) { X Current = old; X puts ("No More Messages"); X return (-1); X } X position_current(); X return (1); X} X X END_OF_FILE if test 3191 -ne `wc -c <'uucp2/src/dmail/range.c'`; then echo shar: \"'uucp2/src/dmail/range.c'\" unpacked with wrong size! fi # end of 'uucp2/src/dmail/range.c' fi if test -f 'uucp2/src/lib/config.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/lib/config.c'\" else echo shar: Extracting \"'uucp2/src/lib/config.c'\" \(3478 characters\) sed "s/^X//" >'uucp2/src/lib/config.c' <<'END_OF_FILE' X X/* X * CONFIG.C X * X * $Header: Beta:src/uucp/src/lib/RCS/config.c,v 1.1 90/02/02 12:08:37 dillon Exp Locker: dillon $ X * X * (C) Copyright 1989-1990 by Matthew Dillon, All Rights Reserved. X * X * Extract fields from UULIB:Config X */ X X#include <stdio.h> X#include <stdlib.h> X#include <fcntl.h> X#include "config.h" X XPrototype char *FindConfig(const char *); XPrototype char *GetConfig(const char *, char *); XPrototype char *GetConfigDir(char *); XPrototype char *GetConfigProgram(char *); XPrototype char *MakeConfigPath(const char *, const char *); XPrototype char *MallocEnviro(const char *); XPrototype FILE *openlib(const char *); XPrototype FILE *openlib_write(const char *); X X#define CTLZ ('z'&0x1F) X Xstatic char *ConfBuf = NULL; X Xchar * XFindConfig(field) Xconst char *field; X{ X char *str; X short flen = strlen(field); X X if (ConfBuf == NULL) { X FILE *fi; X fi = fopen("S:UUConfig", "r"); X if (fi == NULL) X fi = fopen("UULIB:Config", "r"); X if (fi) { X long buflen; X fseek(fi, 0L, 2); X buflen = ftell(fi); X fseek(fi, 0L, 0); X if (buflen > 0 && (ConfBuf = malloc(buflen + 1))) { X fread(ConfBuf, buflen, 1, fi); X ConfBuf[buflen] = CTLZ; /* can't use \0 */ X for (str = ConfBuf; *str; ++str) { X char *bup; X if (*str == '\n') { /* make separate strs */ X *str = 0; X /* remove white space at end */ X for (bup = str - 1; bup >= ConfBuf && (*bup == ' ' || *bup == 9); --bup) X *bup = 0; X } X } X } else { X ConfBuf = NULL; X } X } else { X fprintf(stderr, "Couldn't open S:UUConfig or UULIB:Config\n"); X } X } X if (ConfBuf == NULL) X return(NULL); X /* X * Search ConfBuf for Field<space/tab> X */ X X for (str = ConfBuf; *str != CTLZ; str += strlen(str) + 1) { X if (*str == 0 || *str == '#') X continue; X if (strncmp(str, field, flen) == 0 && (str[flen] == ' ' || str[flen] == '\t')) { X str += flen; X while (*str == ' ' || *str == 9) X ++str; X return(str); X } X } X return(NULL); X} X Xchar * XGetConfig(field, def) Xconst char *field; Xchar *def; X{ X char *result = FindConfig(field); X X if (result == NULL) X result = def; X return(result); X} X Xchar * XGetConfigDir(field) Xchar *field; X{ X char *result = FindConfig(field); X X if (result == NULL) X result = field + strlen(field) + 1; X return(result); X} X Xchar * XGetConfigProgram(field) Xchar *field; X{ X char *result = FindConfig(field); X if (result == NULL) X result = field; X return(result); X} X Xchar * XMakeConfigPath(field, trailer) Xconst char *field; Xconst char *trailer; X{ X static char Buf[512]; X char *result = GetConfigDir(field); X short len = strlen(result) - 1; X X if (len > 0 && result[len] == '/' || result[len] == ':') X sprintf(Buf, "%s%s", result, trailer); X else X sprintf(Buf, "%s/%s", result, trailer); X return(Buf); X} X Xchar * XMallocEnviro(envname) Xconst char *envname; X{ X int fd; X int len; X char *tmp = malloc(strlen(envname) + 32); X X sprintf(tmp, "ENV:%s", envname); X fd = open(tmp, O_RDONLY); X free(tmp); X X if (fd < 0) X return(NULL); X len = lseek(fd, 0L, 2); X lseek(fd, 0L, 0); X if (len >= 0) { X tmp = malloc(len + 1); X read(fd, tmp, len); X tmp[len] = 0; X } else { X tmp = NULL; X } X close(fd); X return(tmp); X} X XFILE * Xopenlib(filename) Xconst char *filename; X{ X return (fopen(MakeConfigPath(UULIB, filename), "r")); X} X XFILE * Xopenlib_write(filename) Xconst char *filename; X{ X return (fopen(MakeConfigPath(UULIB, filename), "w")); X} X END_OF_FILE if test 3478 -ne `wc -c <'uucp2/src/lib/config.c'`; then echo shar: \"'uucp2/src/lib/config.c'\" unpacked with wrong size! fi # end of 'uucp2/src/lib/config.c' fi if test -f 'uucp2/src/lib/list_sort.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/lib/list_sort.c'\" else echo shar: Extracting \"'uucp2/src/lib/list_sort.c'\" \(3949 characters\) sed "s/^X//" >'uucp2/src/lib/list_sort.c' <<'END_OF_FILE' X X/* X * LIST_SORT.C X * X * list_sort(list, compare_routine) -> sorted_list X * X * Assumes a list of structures, with a pointer to "next" as the first X * field. It reorders the list into ascending order, and returns the X * new first node's address. It is order N log(N). X * X * The compare routine should return positive if the items are in order, X * and non-positive if they are not. If the compare routine returns zero X * in case of equality, the sort will be stable. X */ X X/* This routine depends upon compiler-dependant struct layout, but this X * assumption is likely to be fairly commonly valid. X */ X X#define _LIST_SORT_C X X#include <stdio.h> X#include "version.h" X XIDENT(".01"); X Xtypedef struct node_struct { X struct node_struct *next; X} node_type; X Xtypedef int (*cf_type)(node_type *, node_type *); X XLocal node_type *list_sort(node_type *, cf_type); X Xnode_type * Xlist_sort(node_type *list, cf_type cmp) X{ X struct node_struct *new[2]; /* back of new stuff */ X struct node_struct *old[2]; /* front of old stuff */ X int n; /* current new list */ X int o; /* current old list */ X long m, hm; /* m is merge length, hm is half of that */ X long count[2]; /* counts entries drawn from "old" lists */ X node_type front[2]; /* artificial front-of-list */ X X /* X * The basic notion of this sort is to make sorted sublists longer and X * longer by merging. On the Nth pass through the list, sorted X * sublists of length 2^(N-1) are produced. Eventually, the entire X * list is sorted, in log2(N)+1 passes through the list. There is X * extra bookkeeping overhead, but minimal extra storage space needed. X * Counts and clever pointer management substitute for extra "glue" X * nodes. X * X * while more than one list X * while not at end of composite lists X * for each merge_length(m) block X * merge lists onto current output list X * toggle current output list X */ X X front[0].next = 0; X front[1].next = list; X X for (hm = 0, m = 1; front[1].next != 0; hm = m, m <<= 1) { X /* log2(N)+1 times through (since m doubles every time) */ X X new[0] = &front[0]; old[0] = front[0].next; X new[1] = &front[1]; old[1] = front[1].next; X n = 0; X count[0] = count[1] = 0; X X for (;;) { X /* X * N times through (each time through consumes X * one item from one or the other of the old lists) X */ X X if (old[0] == 0) { X /* X * First composite input list exhausted... X * copy second list onto output, quitting X * if second list is at end. X */ X X new[n] = new[n]->next = old[1]; X if ((old[1] = old[1]->next) == 0) X break; X if (++count[1] >= hm) X n = 1 - n, count[0] = count[1] = 0; X } else if (old[1] == 0) { X /* X * Second composite input list exhausted... X * copy first list onto output, quitting X * if first list is at end. X */ X X new[n] = new[n]->next = old[0]; X if ((old[0] = old[0]->next) == 0) X break; X if (++count[0] >= hm) X n = 1 - n, count[0] = count[1] = 0; X } else if (count[0] >= hm) { X /* X * First logical input list exhausted... X * copy second list onto output, swapping X * output list if second input list ends. X */ X X new[n] = new[n]->next = old[1]; X old[1] = old[1]->next; X if (++count[1] >= hm) X n = 1 - n, count[0] = count[1] = 0; X } else if (count[1] >= hm) { X /* X * Second logical input list exhausted... X * copy first list onto output, swapping X * output list if first input list ends. X */ X X new[n] = new[n]->next = old[0]; X old[0] = old[0]->next; X if (++count[0] >= hm) X n = 1 - n, count[0] = count[1] = 0; X } else { X /* X * Compare the two items at the heads of X * the input lists, and put the smaller X * on the current output list. X */ X X o = (*cmp)(old[0], old[1]) > 0; X new[n] = new[n]->next = old[o]; X old[o] = old[o]->next; X ++count[o]; X } X } X new[0]->next = new[1]->next = 0; X } X return front[0].next; X} X END_OF_FILE if test 3949 -ne `wc -c <'uucp2/src/lib/list_sort.c'`; then echo shar: \"'uucp2/src/lib/list_sort.c'\" unpacked with wrong size! fi # end of 'uucp2/src/lib/list_sort.c' fi if test -f 'uucp2/src/news/postnews.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/news/postnews.c'\" else echo shar: Extracting \"'uucp2/src/news/postnews.c'\" \(3427 characters\) sed "s/^X//" >'uucp2/src/news/postnews.c' <<'END_OF_FILE' X X/* X * POSTNEWS.C X * X * POSTNEWS <newsfile -f user -r "realname" -R reffile (BATCH news poster) X * -x file (delete file when done) X * X * If not specified, obtains user/realname from USERNAME and REALNAME X * enviroment variables. If either does not exist then gets it from X * the UserName and RealName config entries. X * X * If -R is specified the reffile is included in the header list (usually X * contains References: generated by DNews) X */ X X#include <stdio.h> X#include <stdlib.h> X#include <time.h> X#include "config.h" X#include "version.h" X XIDENT(".03"); X Xchar TmpBuf[2048]; Xchar *DelFile[32]; Xshort Di; X Xvoid PostNews(); X Xmain(ac, av) Xchar *av[]; X{ X short i; X char *from = NULL; X char *real = NULL; X char *reffile = NULL; X FILE *rfi; X X for (i = 1; i < ac; ++i) { X char *ptr = av[i]; X if (*ptr == '-') { X X ptr += 2; X X switch(ptr[-1]) { X case 'f': X if (*ptr == 0) X ptr = av[++i]; X from = ptr; X break; X case 'r': X if (*ptr == 0) X ptr = av[++i]; X real = ptr; X break; X case 'R': X if (*ptr == 0) X ptr = av[++i]; X reffile = ptr; X break; X case 'x': X if (*ptr == 0) X ptr = av[++i]; X DelFile[Di++] = ptr; X break; X default: X printf("Unknown option: %s\n", ptr - 2); X exit(1); X } X } else { X printf("Illegal argument: %s\n", ptr); X exit(1); X } X } X if (i > ac) { X puts("Expected argument to option"); X exit(1); X } X if (from == NULL) X from = GetUserName(); X if (real == NULL) X real = GetRealName(); X X if (reffile) X rfi = fopen(reffile, "r"); X else X rfi = NULL; X X LockFile("PostNews-UPDATE"); X PostNews(stdin, rfi, from, real); X UnLockFile("PostNews-UPDATE"); X X if (rfi) X fclose(rfi); X X while (--Di >= 0) X remove(DelFile[Di]); X X return(0); X} X Xvoid XPostNews(fi, rfi, user, realname) XFILE *fi; XFILE *rfi; Xchar *user; Xchar *realname; X{ X char *nodename = FindConfig(NODENAME); X char *system_name = FindConfig(NEWSFEED); X char *domain = FindConfig(DOMAINNAME); X int seq = GetSequence(0); X char tfname[32]; X time_t t = time(NULL); X FILE *fo; X X sprintf(tfname, "T:post-%d", seq); X X if (nodename == NULL || system_name == NULL || user == NULL || realname == NULL) { X puts("Incomplete configuration! can't post news"); X return; X } X if (domain == NULL) X domain = ".UUCP"; X X fo = fopen(tfname, "w"); X if (fo == NULL) { X printf("Unable to create %s\n", tfname); X return; X } X X /* X * Create the actual news file to fo, copying appropriate sections of infile. X */ X X fprintf(fo, "Path: %s!%s\n", nodename, user); X fprintf(fo, "From: %s@%s%s (%s)\n", user, nodename, domain, realname); X fprintf(fo, "Message-ID: <%s.%04d@%s%s>\n", user, seq, nodename, domain); X X /* X * user headers X */ X X while (fgets(TmpBuf, sizeof(TmpBuf), fi) && TmpBuf[0] != '\n') X fputs(TmpBuf, fo); X X /* X * system headers (news program -R option to postnews) X * (usually References:) X */ X X if (rfi) { X while (fgets(TmpBuf, sizeof(TmpBuf), rfi)) X fputs(TmpBuf, fo); X } X X /* X * more headers X */ X X fprintf(fo, "Date: %s", ctime(&t)); X X /* X * remainder of message X */ X X fprintf(fo, "\n"); X X while (fgets(TmpBuf, sizeof(TmpBuf), fi)) X fputs(TmpBuf, fo); X X fclose(fo); X X sprintf(TmpBuf, "%s %s \"%s!rnews\"", GetConfigProgram(UUX), tfname, system_name); X system(TmpBuf); X remove(tfname); X} X END_OF_FILE if test 3427 -ne `wc -c <'uucp2/src/news/postnews.c'`; then echo shar: \"'uucp2/src/news/postnews.c'\" unpacked with wrong size! fi # end of 'uucp2/src/news/postnews.c' fi if test -f 'uucp2/src/unix/tarsplit.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/unix/tarsplit.c'\" else echo shar: Extracting \"'uucp2/src/unix/tarsplit.c'\" \(4031 characters\) sed "s/^X//" >'uucp2/src/unix/tarsplit.c' <<'END_OF_FILE' X X/* X * TARSPLIT.C X * X * $Header: Beta:src/uucp/src/compress/RCS/tarsplit.c,v 1.1 90/02/02 11:48:06 dillon Exp Locker: dillon $ X * X * TarSplit -- split up tar files (creating directories as needed) X * X * usage: TarSplit [pathname] X * X * semantics: splits up tar file taken from stdin (or pathname, if X * specified) and creates the files therein under the working data X * directory. X * X * AmigaDOS Version - no support for stdin. X */ X X#include <stdio.h> X#include "version.h" X XIDENT(".00"); X X#ifdef AMIGA X#include <stdlib.h> X#include <exec/types.h> X#ifdef LATTICE X#include <proto/all.h> X#else X#include "protos.h" X#endif Xtypedef int bool ; Xbool ChkSumOK() ; X#include <libraries/dosextens.h> X#else X#include <modes.h> X#include <bool.h> X#define DIRMODE (S_IREAD | S_IWRITE | S_IEXEC | S_IOREAD | S_IOEXEC) X#endif X#define TBLOCK 512 X#define NAMSIZ 100 X Xunion hblock { X char dummy[TBLOCK]; X struct header { X char name[NAMSIZ]; X char mode[8]; X char uid[8]; X char gid[8]; X char size[12]; X char mtime[12]; X char chksum[8]; X char linkflag; X char linkname[NAMSIZ]; X } dbuf; X}; X X#define BLKSIZE (sizeof (union hblock)) X#define HARDLINK '1' X#define SYMBLINK '2' X#define NORMAL '\0' X Xvoid DoFile(); X Xmain(argc, argv) Xint argc; Xchar *argv[]; X{ X FILE *TarFP; X union hblock TarBlock; X X#ifndef AMIGA X /* make the compiler happy about formatted I/O for longs... */ X pflinit(); X#endif X X switch(argc) { X#ifndef AMIGA X case 1: X TarFP = stdin; X break; X#endif X case 2: X if ((TarFP = fopen(argv[1], "r")) == NULL) { X fprintf(stderr, "TarSplit: can't open %s\n", argv[1]); X exit(1); X } X break; X default: X fprintf(stderr, "usage: TarSplit [pathname]\n"); X exit(1); X } X X for (;;) { X if (fread((char *)&TarBlock, BLKSIZE, 1, TarFP) == NULL) { X fprintf(stderr, "TarSplit: premature EOF\n"); X exit(1); X } else if (IsZero(&TarBlock)) { X while (fread((char *)&TarBlock, BLKSIZE, 1, TarFP) != NULL) X ; X break; X } else X DoFile(&TarBlock, TarFP); X } X X} X Xbool XIsZero(block) Xunion hblock *block; X{ X int i; X char *cblock; X X cblock = block->dummy; X for (i = 0; i < TBLOCK; i++) X if (*cblock++ != '\0') X return(FALSE); X X return (TRUE); X X} X Xvoid XDoFile(block, TarFP) Xunion hblock *block; XFILE *TarFP; X{ X long FSize; X char FName[NAMSIZ], *RefName; X int i; X bool IsDir, OpenOK; X FILE *NewFP; X X if (!ChkSumOK(block)) { X fprintf(stderr, "TarSplit: bad checksum, name %s?\n", X block->dbuf.name); X exit(1); X } X X switch(block->dbuf.linkflag) { X case HARDLINK: X case SYMBLINK: X fprintf(stderr, "TarSplit: can't handle links\n"); X exit(1); X case NORMAL: X break; X default: X fprintf(stderr, "TarSplit: unknown linkflag\n"); X exit(1); X } X X#ifdef AMIGA X if (sscanf(block->dbuf.size, "%12lo", &FSize) != 1) { X#else X if (sscanf(block->dbuf.size, "%12O", &FSize) != 1) { X#endif X fprintf(stderr, "TarSplit: bad size\n"); X exit(1); X } X X for (i = 0, RefName = block->dbuf.name; *RefName; i++, RefName++) X FName[i] = *RefName; X X if (IsDir = (*(RefName - 1) == '/')) { X FName[i - 1] = '\0'; X if (strcmp(FName, ".") == 0) X OpenOK = TRUE; X else X#ifdef AMIGA X { X BPTR Lock; X OpenOK = (Lock = CreateDir(FName)) != 0; X UnLock(Lock) ; X } X#else X OpenOK = mknod(FName, DIRMODE) == 0; X#endif X } else { X FName[i] = '\0'; X OpenOK = (NewFP = fopen(FName, "w")) != NULL; X } X X if (!OpenOK) { X fprintf(stderr, "TarSplit: can't create %s\n", FName); X exit(1); X } X X for (; FSize > 0; FSize -= TBLOCK) { X if (fread((char *)block, BLKSIZE, 1, TarFP) == NULL) { X fprintf(stderr, "TarSplit: premature EOF\n"); X exit(1); X } X if (!IsDir) X fwrite(block->dummy, 1, X (FSize > TBLOCK ? TBLOCK : (int) FSize), NewFP); X } X X if (!IsDir) X fclose(NewFP); X} X Xbool XChkSumOK(block) Xunion hblock *block; X{ X long Accum, ChkSumVal; X int i; X X#ifdef AMIGA X sscanf(block->dbuf.chksum, "%8lo", &ChkSumVal); X#else X sscanf(block->dbuf.chksum, "%8O", &ChkSumVal); X#endif X for (i = 0; i < 8; i++) X block->dbuf.chksum[i] = ' '; X X Accum = 0; X for (i = 0; i < TBLOCK; i++) X Accum += 0xff & block->dummy[i]; X X return(Accum == ChkSumVal); X X} END_OF_FILE if test 4031 -ne `wc -c <'uucp2/src/unix/tarsplit.c'`; then echo shar: \"'uucp2/src/unix/tarsplit.c'\" unpacked with wrong size! fi # end of 'uucp2/src/unix/tarsplit.c' fi if test -f 'uucp2/src/unix/uudecode.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/unix/uudecode.c'\" else echo shar: Extracting \"'uucp2/src/unix/uudecode.c'\" \(3321 characters\) sed "s/^X//" >'uucp2/src/unix/uudecode.c' <<'END_OF_FILE' X X/* X * UUDECODE.C X * X * $Header: Beta:src/uucp/src/compress/RCS/uudecode.c,v 1.1 90/02/02 11:48:08 dillon Exp Locker: dillon $ X * X * uudecode [input] X * X * create the specified file, decoding as you go. X * used with uuencode. X */ X X#include <stdio.h> X#include "version.h" X XIDENT(".00"); X X#ifdef UNIX X# include <pwd.h> X# include <sys/types.h> X# include <sys/stat.h> X#endif X X#ifdef VMS X# include <types.h> X# include <stat.h> X#endif X X/* single character decode */ X#define DEC(c) (((c) - ' ') & 077) X Xvoid outdec(); Xvoid decode(); Xvoid xerror(); X Xvoid Xmain(argc, argv) Xchar **argv; X{ X FILE *in, *out; X#ifdef UNIX | VMS X struct stat sbuf; X#endif X int mode; X char dest[128]; X char buf[80]; X X /* optional input arg */ X if (argc > 1) { X if ((in = fopen(argv[1], "r")) == NULL) { X xerror(argv[1]); X exit(1); X } X argv++; argc--; X } else X in = stdin; X X if (argc != 1) { X printf("Usage: uudecode [infile]\n"); X exit(2); X } X X /* search for header line */ X for (;;) { X if (fgets(buf, sizeof buf, in) == NULL) { X fprintf(stderr, "No begin line\n"); X exit(3); X } X if (strncmp(buf, "begin ", 6) == 0) X break; X } X sscanf(buf, "begin %o %s", &mode, dest); X X#ifdef UNIX X /* handle ~user/file format */ X if (dest[0] == '~') { X char *sl; X struct passwd *getpwnam(); X char *index(); X struct passwd *user; X char dnbuf[100]; X X sl = index(dest, '/'); X if (sl == NULL) { X fprintf(stderr, "Illegal ~user\n"); X exit(3); X } X *sl++ = 0; X user = getpwnam(dest+1); X if (user == NULL) { X fprintf(stderr, "No such user as %s\n", dest); X exit(4); X } X strcpy(dnbuf, user->pw_dir); X strcat(dnbuf, "/"); X strcat(dnbuf, sl); X strcpy(dest, dnbuf); X } X#endif /* UNIX */ X X /* create output file */ X out = fopen(dest, "w"); X if (out == NULL) { X xerror(dest); X exit(4); X } X#ifdef UNIX | VMS X chmod(dest, mode); X#endif X X decode(in, out); X X if (fgets(buf, sizeof buf, in) == NULL || strcmp(buf, "end\n")) { X fprintf(stderr, "No end line\n"); X exit(5); X } X exit(0); X} X X/* X * copy from in to out, decoding as you go along. X */ X Xvoid Xdecode(in, out) XFILE *in; XFILE *out; X{ X char buf[80]; X char *bp; X int n; X X for (;;) { X /* for each input line */ X if (fgets(buf, sizeof buf, in) == NULL) { X printf("Short file\n"); X exit(10); X } X n = DEC(buf[0]); X if (n <= 0) X break; X X bp = &buf[1]; X while (n > 0) { X outdec(bp, out, n); X bp += 4; X n -= 3; X } X } X} X X/* X * output a group of 3 bytes (4 input characters). X * the input chars are pointed to by p, they are to X * be output to file f. n is used to tell us not to X * output all of them at the end of the file. X */ X Xvoid Xoutdec(p, f, n) Xchar *p; XFILE *f; X{ X int c1, c2, c3; X X c1 = DEC(*p) << 2 | DEC(p[1]) >> 4; X c2 = DEC(p[1]) << 4 | DEC(p[2]) >> 2; X c3 = DEC(p[2]) << 6 | DEC(p[3]); X if (n >= 1) X putc(c1, f); X if (n >= 2) X putc(c2, f); X if (n >= 3) X putc(c3, f); X} X X X/* fr: like read but stdio */ Xint Xfr(fd, buf, cnt) XFILE *fd; Xchar *buf; Xint cnt; X{ X int c, i; X X for (i=0; i<cnt; i++) { X c = getc(fd); X if (c == EOF) X return(i); X buf[i] = c; X } X return (cnt); X} X X/* X * Return the ptr in sp at which the character c appears; X * NULL if not found X */ X Xchar * Xindex(sp, c) Xregister char *sp, c; X{ X do { X if (*sp == c) X return(sp); X } while (*sp++); X return(NULL); X} X Xvoid Xxerror(err) Xchar *err; X{ X printf("Can not open file \"%s\"\n", err); X} X END_OF_FILE if test 3321 -ne `wc -c <'uucp2/src/unix/uudecode.c'`; then echo shar: \"'uucp2/src/unix/uudecode.c'\" unpacked with wrong size! fi # end of 'uucp2/src/unix/uudecode.c' fi if test -f 'uucp2/src/uucico/modem.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/uucico/modem.c'\" else echo shar: Extracting \"'uucp2/src/uucico/modem.c'\" \(3827 characters\) sed "s/^X//" >'uucp2/src/uucico/modem.c' <<'END_OF_FILE' X X/* X * MODEM.C X * X * (C) Copyright 1989-1990 by Matthew Dillon, All Rights Reserved. X * X * $Header: Beta:src/uucp/src/uucico/RCS/modem.c,v 1.1 90/02/02 11:56:00 dillon Exp Locker: dillon $ X */ X X#include "includes.h" X#include "uucp.h" X#include "log.h" X XPrototype void openline(void); XPrototype int get_baud(void); XPrototype void modem_init(void); XPrototype int dial_nbr(const char *); XPrototype void reset_modem(void); X X/* X * NOTE: modem stuff pretty much ignored if we are run from X * a getty. X */ X X#define MULTIMODEM /* I have a multi-modem */ X Xextern int Getty; Xextern int IgnoreCD; X X X Xvoid Xopenline() X{ X signal(SIGINT,sigint); X IgnoreCD |= 4; Xstart_again: X chkabort(); X if (instr("CONNECT", 7)) X goto start_again; X X X#ifdef MULTIMODEM X X#else X set_baud(get_baud()); X#endif X Delay(120); /* sleep 2 seconds */ X X IgnoreCD &= ~4; X} X X#ifndef MULTIMODEM X Xint Xget_baud() X{ X/* We've seen the CONNECT message, now we must see what baud rate X we've connected with */ X/* gather input until \r then see if it's 300, 1200, or 2400 */ X/* this is for hayes compatibles */ X X int data; X char rate[10]; X int rate_inx = 0; X X DEBUG(2,"looking for baud rate\n",0); X X while ( ((data = xgetc(BYTE_TO)) != EOF) && ((char)data != '\r')) { X if ((char)data == ' ') continue; X rate[rate_inx++] = (char)data; X } X DEBUG(2, "found baud rate of %s\n", rate); X if (strncmp(rate,"1200",4) == 0) return 1200; X if (strncmp(rate,"2400",4) == 0) return 2400; X if (rate_inx == 0) return 300; X return 1200; /* default */ X} X X#endif X Xvoid Xmodem_init() X{ X reset_modem(); X} X X/* X * Simple dialer routine. Needs replacement with a full blown X * script driven dialer. Next week maybe :-). FIXME. X */ X Xint Xdial_nbr(nbr) Xconst char *nbr; X{ X char *dial; X int i; X X IgnoreCD |= 4; X X dial = malloc(strlen(nbr) + 16); X X dial[0] = 0; X if (strncmp(nbr, "AT", 2) != 0 && strncmp(nbr, "at", 2) != 0) X strcpy(dial, "ATDT"); X strcat(dial, nbr); X strcat(dial, "\r"); X X DEBUG(2,"dialing %s\n", dial); X X twrite(dial, strlen(dial)); X X i = instr("CONNECT", 7); X X if (i == 0) /* for those modems which don't bring CD up */ X Delay(50); /* immediately */ X X IgnoreCD &= ~4; X X free(dial); X X return (i); X} X X/* X * RESET_MODEM() X * X * If run from a Getty we do NOT reset the modem, which would X * disconnect an already connected connection. X * X * Note that the delay between CloseSerial() and OpenSerial() only X * serves to give the Getty, if running, time to lock the port and X * begin a disconnect sequence. X */ X Xvoid Xreset_modem() X{ X if (Getty) /* called from a getty */ X return; X DEBUG(4, "Beg-Reset\n", 0); X CloseSerial(); /* drop dtr */ X Delay(50*3); /* delay 3 seconds */ X DEBUG(4, "End-Reset-1\n", 0); X OpenSerial(); /* re-open serial */ X DEBUG(4, "End-Reset-2\n", 0); X} X X#ifdef NOTDEF X X if (GettyCmd(DeviceName, DeviceUnit, '0', NULL) == 0) X return; X X /* X * Getty doesn't exist, we have to reset the modem ourselves! X */ X X IgnoreCD |= 4; X X#ifdef MULTIMODEM X set_baud(19200); X X if (CheckCarrier()) { X Delay(60); X twrite("+++", 3); X Delay(120); X } X twrite("ATH0\r", 5); X instr("OK\r\n", 4); X twrite("ATZ\r", 4); X instr("OK\r\n", 4); X twrite("ATZ\r", 4); X instr("OK\r\n", 4); X X /*amiga_closeopen();*/ X sprintf(init, "%s\r", "ATM0S0=2X4$BA0"); X if (debug > 0) X init[3] = '1'; X twrite(init, strlen(init)); X instr("OK\r\n",4); X#else X twrite("+++", 3); X Delay(60); X twrite("ATH0\r", 5); X Delay(120); X twrite("ATZ\r", 4); X Delay(60); X twrite("ATZ\r", 4); X Delay(60); X sprintf(init, "%s\r", "ATS2"); X twrite(init, strlen(init)); X Delay(60); X#endif X IgnoreCD &= ~4; X} X X#endif X END_OF_FILE if test 3827 -ne `wc -c <'uucp2/src/uucico/modem.c'`; then echo shar: \"'uucp2/src/uucico/modem.c'\" unpacked with wrong size! fi # end of 'uucp2/src/uucico/modem.c' fi if test -f 'uucp2/src/uucico/uucp.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/uucico/uucp.c'\" else echo shar: Extracting \"'uucp2/src/uucico/uucp.c'\" \(4098 characters\) sed "s/^X//" >'uucp2/src/uucico/uucp.c' <<'END_OF_FILE' X X/* X * UUCP.c written by William Loftus X * Copyright 1988 by William Loftus. All rights reserved. X * X * $Header: Beta:src/uucp/src/uucico/RCS/uucp.c,v 1.1 90/02/02 11:56:13 dillon Exp Locker: dillon $ X * X */ X X#include <stdio.h> X#include <stdlib.h> X#include <string.h> X#include "version.h" X XIDENT(".01"); X Xchar to_buf[128]; Xchar from_buf[128]; Xchar path[128]; Xchar user[8]; X Xchar command_file[128]; Xint seq; X Xvoid BuildReceiveFile(); Xvoid BuildSendFile(); Xvoid read_ctl(); Xchar *expand_file(); Xchar *strchr(); Xchar *getcwd(); X X#define TRUE 1 X#define FALSE 0 X XCXBRK() X{ X return(0); X} X Xvoid Xmain(argc,argv) Xint argc; Xchar **argv; X{ X int to_bang, from_bang; X X if (argc != 3) { X printf("Usage: UUCP from_file to_file\n"); X exit(1); X } else { X strcat(from_buf, argv[1]); X strcat(to_buf, argv[2]); X } X X getcwd(path,128); X X if (chdir(GetConfigDir(UUSPOOL))) { X printf("Couldn't change current working directory to %s\n", GetConfigDir(UUSPOOL)); X exit(1); X } X X read_ctl(); X X seq = GetSequence(2); X if (seq < 0) { X chdir(path); X exit(1); X } X X from_bang = (int)strchr(from_buf,'!'); X to_bang = (int)strchr(to_buf,'!'); X X if (from_bang && to_bang) { X printf("Can not specify a remote system in both arguments.\n"); X chdir(path); X exit(1); X } X X if (from_bang) { X BuildReceiveFile(); X } X X if (to_bang) { X BuildSendFile(); X } X X chdir(path); X exit(0); X} X Xvoid XBuildSendFile() X{ X FILE *fp; X char system_name[32]; X int bang; X X strcpy(from_buf,expand_file(from_buf)); X X bang = (int)strchr(to_buf,'!'); X bang = bang - (int)to_buf; X X strncpy(system_name,to_buf,bang); X X system_name[bang] = '\0'; X X if (!is_in_L_sys_file(system_name)) { X printf("System \"%s\" not in L.sys file.\n", system_name); X chdir(path); X exit(1); X } X X system_name[7] = '\0'; X X sprintf(command_file,"C.%sA%04d", system_name, seq++); X X LockFile(command_file); X X fp = fopen(command_file,"w"); X X if (fp) { X /* srcnam desnam who flags temp mode who */ X fprintf(fp,"S %s %s %s %s %s %s %s\n", X from_buf, X to_buf + bang + 1, X user, X "-c", X from_buf, X "0666", X user X ); X fclose(fp); X } else { X UnLockFile(command_file); X perror(command_file); X chdir(path); X exit(1); X } X UnLockFile(command_file); X printf("Command queue for transfer to %s.\n", system_name); X} X Xvoid XBuildReceiveFile() X{ X FILE *fp; X char system_name[32]; X int bang; X X strcpy(to_buf,expand_file(to_buf)); X X bang = (int)strchr(from_buf,'!'); X bang = bang - (int)from_buf; X X strncpy(system_name,from_buf,bang); X X system_name[bang] = '\0'; X X if (!is_in_L_sys_file(system_name)) { X printf("System \"%s\" not in L.sys file.\n", system_name); X chdir(path); X exit(1); X } X X system_name[7] = '\0'; X X sprintf(command_file,"C.%sA%04d", system_name, seq++); X X LockFile(command_file); X X fp = fopen(command_file,"w"); X if (fp) { X /* srcnam desnam who flags */ X fprintf(fp,"R %s %s %s %s\n", X from_buf + bang + 1, X to_buf, X user, X "-c" X ); X fclose(fp); X } else { X UnLockFile(command_file); X perror(command_file); X chdir(path); X exit(1); X } X UnLockFile(command_file); X printf("Command queue for transfer from %s.\n", system_name); X} X Xstatic char name[128]; X Xchar * Xexpand_file(file_name) Xchar *file_name; X{ X char *colon; X X colon = strchr(file_name,':'); X if ((colon != (char*)NULL) && (colon != file_name)) { X return(file_name); X } else { X if (path[strlen(path)-1] != ':') { X sprintf(name,"%s/%s",path,file_name); X return name; X } else { X sprintf(name,"%s%s",path,file_name); X return name; X } X } X} X X#define CTL_DELIM " \t\r\n" X X/* X * Read the control file and grab a few parameters. X */ X Xvoid Xread_ctl() X{ X FILE *fd; X static char buf[128]; X X if (! (fd = fopen(MakeConfigPath(UULIB, "Config"), "r"))) { X printf("Can't Find config file.\n"); X chdir(path); X exit(3); X } X X while (NULL != fgets(buf, sizeof buf, fd)) { X if (strncmp(buf, "UserName", 8) == 0) X strcpy(user, strtok(&buf[9], CTL_DELIM) ) ; X } X fclose(fd); X} X X END_OF_FILE if test 4098 -ne `wc -c <'uucp2/src/uucico/uucp.c'`; then echo shar: \"'uucp2/src/uucico/uucp.c'\" unpacked with wrong size! fi # end of 'uucp2/src/uucico/uucp.c' fi if test -f 'uucp2/src/uucico/uux.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/uucico/uux.c'\" else echo shar: Extracting \"'uucp2/src/uucico/uux.c'\" \(3324 characters\) sed "s/^X//" >'uucp2/src/uucico/uux.c' <<'END_OF_FILE' X X/* X * UUX.C X * X * $Header: Beta:src/uucp/src/uucico/RCS/uux.c,v 1.1 90/02/02 11:56:20 dillon Exp Locker: dillon $ X * X * Copyright 1988 by William Loftus. All rights reserved. X * X * Example: 1> uux mail-message "burdvax!rmail wpl" X */ X X#include <stdio.h> X#include <stdlib.h> X#include <string.h> X#include "version.h" X XIDENT(".02"); X Xchar user[128]; Xchar file_name[128]; Xchar command[128]; X Xchar exec_file[128]; Xchar x_exec_file[128]; Xchar command_file[128]; Xchar data_file[128]; Xint seq; X Xchar path[128]; X Xvoid GetTo(); Xvoid GetSubject(); X X#define TRUE 1 X#define FALSE 0 X Xint Xbrk() X{ X return(0); X} X Xvoid Xmain(argc, argv) Xint argc; Xchar **argv; X{ X int error; X char *up = FindConfig(USERNAME); X X onbreak(brk); X if (up == NULL) { X printf("couldn't find domain entry for %s\n", USERNAME); X exit(1); X } X strcpy(user, up); X X getcwd(path,128); X chdir(GetConfigDir(UUSPOOL)); X if (argc == 3) { X strcpy(file_name, argv[1]); X strcpy(command, argv[2]); X } else { X printf("Usage: uux file-name command\n"); X printf("Example: 1> uux mail-message \"burdvax!rmail wpl\"\n"); X chdir(path); X exit(1); X } X seq = GetSequence(4); X if (seq >= 0) X error = Queue(); X UnLockFile(exec_file); X UnLockFile(x_exec_file); X UnLockFile(command_file); X UnLockFile(data_file); X chdir(path); X if (seq < 0 || error < 0) X exit(1); X} X XQueue() X{ X FILE *fp; X char system_name[32]; X int bang; X int error; X X bang = (int)strchr(command,'!'); X bang = bang - (int)command; X X strncpy(system_name,command,bang); X X system_name[bang] = '\0'; X X if (!is_in_L_sys_file(system_name)) { X printf ("System \"%s\" not in L.sys file.\n", system_name); X return(-1); X } X X system_name[7] = '\0'; X X sprintf(exec_file,"D.%sX%04d", system_name, seq++); X sprintf(x_exec_file,"X.%sX%04d", system_name, seq++); X sprintf(command_file,"C.%sA%04d", system_name, seq++); X sprintf(data_file,"D.%sB%04d", system_name, seq); X X LockFile(exec_file); X LockFile(x_exec_file); X LockFile(command_file); X LockFile(data_file); X X fp = fopen(exec_file,"w"); X if (fp) { X fprintf(fp,"U %s\n", user); X fprintf(fp,"F %s\n", data_file); X fprintf(fp,"I %s\n", data_file); X fprintf(fp,"C %s\n", (char *)command + bang + 1); X fclose(fp); X } else { X perror(exec_file); X return(-1); X } X X fp = fopen(command_file,"w"); X if (fp) { X fprintf(fp,"S %s %s %s - %s 0666\n", X data_file, X data_file, X user, X data_file X ); X fprintf(fp,"S %s %s %s - %s 0666\n", X exec_file, X x_exec_file, X user, X exec_file X ); X fclose(fp); X } else { X perror(command_file); X return(-1); X } X chdir(path); X error = Copy(file_name, data_file); X chdir(GetConfigDir(UUSPOOL)); X return(error); X} X X/* X * Read the control file and grab a few parameters. X */ X XCopy(from, to) Xchar *from; Xchar *to; X{ X FILE *fd; X FILE *td; X int c; X static char to_buf[128]; X X fd = fopen(from, "r"); X if (!fd) { X printf("Could not open %s.\n", from); X perror(from); X return(-1); X } X X strcpy(to_buf, MakeConfigPath(UUSPOOL, to)); X X td = fopen(to_buf, "w"); X if (!td) { X printf("Could not open %s.\n", to_buf); X perror(to); X return(-1); X } X while ((c = fgetc(fd)) != EOF) { X fputc((char)c, td); X } X fclose(fd); X fclose(td); X return(1); X} X X END_OF_FILE if test 3324 -ne `wc -c <'uucp2/src/uucico/uux.c'`; then echo shar: \"'uucp2/src/uucico/uux.c'\" unpacked with wrong size! fi # end of 'uucp2/src/uucico/uux.c' fi echo shar: End of archive 4 \(of 12\). cp /dev/null ark4isdone MISSING="" for I in 1 2 3 4 5 6 7 8 9 10 11 12 ; do if test ! -f ark${I}isdone ; then MISSING="${MISSING} ${I}" fi done if test "${MISSING}" = "" ; then echo You have unpacked all 12 archives. rm -f ark[1-9]isdone ark[1-9][0-9]isdone else echo You still need to unpack the following archives: echo " " ${MISSING} fi ## End of shell archive. exit 0 -- Mail submissions (sources or binaries) to <amiga@cs.odu.edu>. Mail comments to the moderator at <amiga-request@cs.odu.edu>. Post requests for sources, and general discussion to comp.sys.amiga.