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 183 Archive-name: unix/uucp-1.06d/part05 #!/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 5 (of 12)." # Contents: uucp2/src/anews/mscan.c uucp2/src/anews/news.c # uucp2/src/anews/unpackmail.c uucp2/src/dmail/main.c # uucp2/src/dmail/sub.c uucp2/src/lib/alias.c # uucp2/src/news/postnews.c.OLD uucp2/src/sendmail/domain.c # uucp2/src/unix/unshar.c # Wrapped by tadguy@xanth on Thu Jun 28 08:21:24 1990 PATH=/bin:/usr/bin:/usr/ucb ; export PATH if test -f 'uucp2/src/anews/mscan.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/anews/mscan.c'\" else echo shar: Extracting \"'uucp2/src/anews/mscan.c'\" \(5263 characters\) sed "s/^X//" >'uucp2/src/anews/mscan.c' <<'END_OF_FILE' X X/* X * MSCAN.C X * X * mscan - Scan directories and return a sorted list of file names, X * one at a time. X * X * This code originally taken from sysdep.c: X * X * (C) Copyright 1987 by John Gilmore X * Copying and use of this program are controlled by the terms of the Free X * Software Foundation's GNU Emacs General Public License. X * X * Amiga Changes Copyright 1988 by William Loftus. All rights reserved. X * X * Rewrite for nlib Copyright 1990 by J. Gregory Noel. All rights reserved. X */ X X#include "news.h" X#include <ctype.h> X#include <getfiles.h> X#include <expand_path.h> X X#define GAP 2 X Xextern char *NewsDir; /* Path to news directory */ Xstatic dir_list *files; /* List of articles to be examined */ Xstatic dir_list *curptr; /* Pointer to current article */ Xstatic char *curgroup; /* Name of current group */ X Xstatic int /* select only files that are purely numeric */ Xfilesel(char *a) X{ X while (*a != '\0') { X if (!isdigit(*a)) X return 0; X ++a; X } X return 1; X} X Xstatic int /* sort based upon the numeric value of the filename */ Xfilecmp(dir_list *a, dir_list *b) X{ X register long i; X X i = atol(a->name + GAP) - atol(b->name + GAP); X if (i != 0) return i > 0; X return strcmp(a->name, b->name); X} X Xvoid /* remove files marked for deletion */ Xfree_directory(delart) Xint delart; X{ X register dir_list *p; X register int last; X X last = -1; X while (p = files) { X files = p->next; X if (p->name[0]) { X if (delart) X remove(expand_path(curgroup, p->name + GAP)); X } else if (p->name[1]) X last = atoi(p->name + GAP); X else if (last < 0) X last = 0; X free(p); X } X if (last >= 0) { X register FILE *fp; X if (fp = fopen(expand_path(curgroup, ".read"), "w")) { X fprintf(fp, "%d", last); X fclose(fp); X } X } else if (delart) { X /* all files were deleted -- try to delete directory */ X remove(expand_path(curgroup, ".next")); X remove(expand_path(curgroup, ".read")); X rmdir(curgroup); X } X curptr = NULL; X if (curgroup) { X free(curgroup); X curgroup = NULL; X } X} X Xint /* produce a list of articles in the group */ Xscan_directory(char *dir) X{ X register dir_list *p; X register int count = 0; X register FILE *fp; X int read; X char name[100], newname[100]; X extern int unpackmail(char *dir, int count); X Xrecurse: X free_directory(0); X curgroup = strdup((dir == NULL) ? NewsDir : expand_path(NewsDir, dir)); X if (access(curgroup, 0) == -1) { X free(curgroup), curgroup = NULL; X return 0; X } X X if ((files = getfiles(curgroup, GAP, filesel, filecmp)) == NULL) { X if (unpackmail(curgroup, 0) > 0) { X /* return scan_directory(dir); */ X goto recurse; X } X#ifdef NOTDEF /* DON'T DELETE THE !#@$#@ DIRECTORY IDIOT */ X /* no files in directory -- try to delete directory */ X remove(expand_path(curgroup, ".next")); X remove(expand_path(curgroup, ".read")); X rmdir(curgroup); X#endif X return 0; X } X X read = 0; X if ((fp = fopen(expand_path(curgroup, ".read"), "r")) != NULL) { X fscanf(fp, "%d", &read); X fclose(fp); X } X X for (p = files; p != NULL; p = p->next) { X p->name[0] = 0; X p->name[1] = (atoi(p->name + GAP) <= read); X sprintf(name, "%s/%s", curgroup, p->name + GAP); X sprintf(newname, "%s/%d", curgroup, ++count); X if (strcmp(name, newname) != 0) X if (rename(name, newname) == 0) X sprintf(p->name + GAP, "%d", count); X } X X if (unpackmail(curgroup, count) > count) X return scan_directory(dir); X X if ((fp = fopen(expand_path(curgroup, ".next"), "w")) != NULL) { X fprintf(fp, "%d", count + 1); X fclose(fp); X } X return count; X} X Xchar * Xfirst_unread(void) X{ X register dir_list *p; X X for (p = files; p != NULL; p = p->next) { X if (p->name[1] == 0) { X curptr = p; X return p->name + GAP; X } X } X curptr = NULL; X return NULL; X} X Xint Xunread_count(void) X{ X register dir_list *p; X register int count = 0; X X for (p = files; p != NULL; p = p->next) X if (p != curptr && p->name[1] == 0) X ++count; X return count; X} X Xchar * Xgoto_article(char *name) X{ X register dir_list *p; X X for (p = files; p != NULL; p = p->next) { X if (strcmp(p->name + GAP, name) == 0) { X curptr = p; X return p->name + GAP; X } X } X curptr = NULL; X return NULL; X} X Xchar * Xget_next_art(void) X{ X if (curptr == NULL) X curptr = files; X else X curptr = curptr->next; X return (curptr == NULL) ? NULL : curptr->name + GAP; X} X Xchar * Xget_prev_art(void) X{ X register dir_list *p; X X if (curptr == NULL) X return NULL; X if (curptr == files) X return curptr->name + GAP; X for (p = files; p != NULL; p = p->next) { X if (p->next == curptr) { X curptr = p; X return p->name + GAP; X } X } X /* should never get here... */ X curptr = NULL; X return NULL; X} X Xvoid Xrewind_arts(void) X{ X register dir_list *p; X X for (p = files; p != NULL; p = p->next) X if (p->name[0] == 0) X p->name[1] = 0; X curptr = NULL; X} X Xvoid Xmark_cur_art(int flag) X{ X if (curptr != NULL) X curptr->name[1] = flag; X} X Xvoid Xdel_cur_art(int flag) X{ X if (curptr != NULL) X curptr->name[0] = flag; X} X Xvoid Xhold_cur_art(void) X{ X if (curptr != NULL) X curptr->name[1] = curptr->name[0]; X} X X#ifdef TEST X#undef TEST X#include "unpackmail.c" Xchar *NewsDir; X Xmain(int argc, char **argv) X{ X register char *p; X X NewsDir = GetConfigDir(UUNEWS); X printf("%d articles:\n", scan_directory("mail.test")); X while ((p = get_next_art()) != NULL) X printf("%s ", p); X putchar('\n'); X return 0; X} X#endif END_OF_FILE if test 5263 -ne `wc -c <'uucp2/src/anews/mscan.c'`; then echo shar: \"'uucp2/src/anews/mscan.c'\" unpacked with wrong size! fi # end of 'uucp2/src/anews/mscan.c' fi if test -f 'uucp2/src/anews/news.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/anews/news.c'\" else echo shar: Extracting \"'uucp2/src/anews/news.c'\" \(6709 characters\) sed "s/^X//" >'uucp2/src/anews/news.c' <<'END_OF_FILE' X X/* X * ANEWS -r rows -c cols -p group X */ X X#include "news.h" X#include <ctype.h> X#include <libraries/dos.h> X#include <getfiles.h> X XIDENT(".03"); X X#define ON scr_inverse_on() X#define OFF scr_inverse_off() X#define Clear_eol printf("\x9bK") X#define Clear_Screen printf("\x9bH\x9bJ") X#define Cr putchar('\r') X#define PROG_NAME "Anews" X Xchar *NewsDir; Xchar fg, bg; X Xint NumRows = 22; Xint NumCols = 77; X Xdir_list *groups; X Xvoid Xinitgroups(void) X{ X dir_list *gp; X int len; X FILE *fp; X char buf[50]; X X if (groups != NULL) X return; X X if ((fp = openlib("newsgroups")) == NULL) { X puts("Couldn't open LIB/newsgroups file"); X exit(2); X } X X gp = (dir_list *)&groups; X while (fgets(buf, (int)sizeof buf, fp) != NULL) { X len = strlen(buf) - 1; X buf[len] = '\0'; X if ((gp->next = (dir_list *)malloc(4 + len + 1)) == NULL) { X puts("Malloc failed!"); X exit(4); X } X gp = gp->next; X strcpy(gp->name, buf); X } X gp->next = NULL; X X fclose(fp); X} X Xstatic char * Xng(register int i) X{ X register dir_list *gp; X register int II = i; X static char *NAME; X static int I = -1; X X if (i == I) X return NAME; X X for (gp = (dir_list *)&groups; (gp = gp->next) != NULL; ) { X if (--i < 0) { X I = II; X return (NAME = gp->name); X } X } X return NULL; X} X Xstatic char *GroupHelp[] = { X "y/Y Read this newsgroup (default)", X "n/N Skip this newsgroup", X "- Go back to previous news group", X "^ Go back to first news group", X "= List article subjects in this newsgroup", X "p Post to this news group", X "h/H/? Display help", X "q/Q Quit to DOS\n", X 0 X}; X Xint Xmain(ac, av) Xchar **av; X{ X int ch, cnt, nbr; X char *curgp; X int found1 = 0; X int current = -1; X int old, last = 0; X short i; X short notdone = 1; X X for (i = 1; i < ac; ++i) { X char *ptr = av[i]; X X if (*ptr == '-') { X ptr += 2; X switch(ptr[-1]) { X case 'p': X if (*ptr) X reply(0, NULL, ptr); X else X reply(0, NULL, av[++i]); X notdone = 0; X break; X case 'r': X if (*ptr) X NumRows = atoi(ptr); X else X NumRows = atoi(av[++i]); X break; X case 'c': X if (*ptr) X NumCols = atoi(ptr); X else X NumCols = atoi(av[++i]); X break; X } X } X } X X if (notdone == 0) { X cooked(stdin); X exit(1); X } X X init(); X X for (;;) { X NewGroup: X if ((curgp = ng(++current)) == NULL) { X if (!found1) { X puts("No News, use 'anews -p group' to post new articles"); X do_quit(); X } else { X found1 = 0, current = -1; X continue; X } X } X X while ((nbr = scan_directory(curgp)) != 0) { X old = last, last = current; X RepeatGroup: X Cr, Clear_eol; X ON; X cnt = unread_count(); X printf("%d articles in %s (%d unread)? [%s]", X nbr, curgp, cnt, (cnt == 0) ? "n/y" : "y/n" X ); X OFF; X putchar(' '); X ch = rawch(); X if (ch == ' ') X ch = (cnt == 0) ? 'n' : 'y'; X X switch (ch) { X case 'y': X case 'Y': X ++found1; X if (cnt == 0) X rewind_arts(); X ch = readgroup(curgp); X if (ch == 'q') X do_quit(); X if (ch == '$') X goto NewGroup; X if (ch) X break; X /* Fall through to... */ X case 'q': X case 'Q': X putchar('\n'); X do_quit(); X case 'n': X case 'N': X putchar('\n'); X goto NewGroup; X case '^': X current = -1; X goto NewGroup; X case '-': X current = old - 1; X goto NewGroup; X/* FIXME add case to go directly to a specific (named) news group */ X case 'h': X case 'H': X case '?': X do_help(GroupHelp); X goto RepeatGroup; X case '=': X putchar('\n'); X scan_subjects(curgp); X goto RepeatGroup; X case 'p': X putchar('\n'); X reply(0, NULL, curgp); X goto RepeatGroup; X } X } X } X return 0; X} X Xchar * XGet_Env(char *envar, char *def) X{ X char *p, *eptr; X X if ((p = getenv(envar)) != NULL) { X eptr = (char *)malloc(strlen(p) + 1); X strcpy(eptr, p); X } else { X eptr = def; X } X return(eptr); X} X Xvoid Xinit() X{ X NewsDir = GetConfigDir(UUNEWS); X if (access(NewsDir, 0) == -1) { X printf("FATAL - couldn't access %s\n", NewsDir); X exit(1); X } X fg = *Get_Env("FG", "8"); X bg = *Get_Env("BG", "0"); X initgroups(); X} X Xstatic char buf[BUFSIZ]; X Xchar * Xsubs(char *newsfile) X{ X FILE *fp; X int j; X X if ((fp = fopen(newsfile, "r")) == NULL) { X printf("Couldn't open %s\n", newsfile); X return(NULL); X } X j = 0; X while ( (j++<50) && (fgets(buf, (int)sizeof buf, fp) != NULL)) { X if (strncmp("Subject:", buf, 8) == 0) { X buf[strlen(buf)-1] = '\0'; X fclose(fp); X return (buf + 8); X } X } X fclose(fp); X return NULL; X} X Xvoid Xdo_quit(void) X{ X exit(0); X} X Xvoid Xdo_help(char **pp) X{ X printf("\x9bH\x9bJ\033[0;1;33;40m\r"); X do { X puts(*pp); X } while (*++pp != NULL); X printf("\033[0;31;40m"); X} X Xchar * Xart2file(char *group, char *art) X{ X static char path[128]; X X sprintf(path, "%s/%s", expand_path(NewsDir, group), art); X return path; X} X Xint Xreadgroup(char *group) X{ X register int ch; X register char *name; X char newname[128]; X X while (name = first_unread()) { X named_art: X switch (ch = showart(group, name)) { X case 'd': X case 'D': X del_cur_art(1); X /* fall through to... */ X X case 'n': X case 'N': X mark_cur_art(1); X break; X X case 'q': X free_directory(1); X return('x'); X case 'Q': X free_directory(0); X return ('x'); X X case '$': X free_directory(1); X return '$'; X X case '-': X name = get_prev_art(); X goto named_art; X X case '^': X rewind_arts(); X break; X X case '0': X case '1': X case '2': X case '3': X case '4': X case '5': X case '6': X case '7': X case '8': X case '9': X newname[0] = ch; X ON; X printf("Goto Article"); X OFF; X printf(" #%c", ch); X fflush(stdout); X gets(newname+1); X X if ((name = goto_article(newname)) == NULL) { X /* FIXME -- handle illegal article */ X break; /* DEBUG */ X } X goto named_art; X X case '.': X case '>': X case ',': X case '<': X for(;;) { X printf("\r #%s\t%-50s", name, subs(art2file(group, name))); X ON; X printf("\rGoto Article"); X OFF; X switch (rawch()) { X case '>': X case '.': X if ((name = get_next_art()) == NULL) { X /* wrap around to begining */ X name = get_next_art(); X } X break; X case ',': X case '<': X name = get_prev_art(); X break; X default: X goto named_art; X } X } X default: X break; X } X } X free_directory(1); X return ('n'); X} X Xvoid Xscr_inverse_on(void) X{ X printf("\x9b\x37;3%c;4%cm", fg, bg); X} X Xvoid Xscr_inverse_off(void) X{ X printf("\x9b\x30;33;40m\033[0m"); X} X Xrawch(void) X{ X register int ch; X X fflush(stdout); X raw(stdin); X ch = getchar(); X cooked(stdin); X return (ch); X} X END_OF_FILE if test 6709 -ne `wc -c <'uucp2/src/anews/news.c'`; then echo shar: \"'uucp2/src/anews/news.c'\" unpacked with wrong size! fi # end of 'uucp2/src/anews/news.c' fi if test -f 'uucp2/src/anews/unpackmail.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/anews/unpackmail.c'\" else echo shar: Extracting \"'uucp2/src/anews/unpackmail.c'\" \(5525 characters\) sed "s/^X//" >'uucp2/src/anews/unpackmail.c' <<'END_OF_FILE' X X/* X * UNPACKMAIL.C X */ X X#include "news.h" X#include <expand_path.h> X#include <ctype.h> X Xstatic FILE *mp; X Xstatic void XCloseOldFile(void) X{ X if (mp) { X fflush(mp); X if (fclose(mp) != 0) { X printf("FATAL -- I/O error while writing message\n"); X exit(20); X } X mp = NULL; X } X} X Xstatic int XNewFile(char *dir, int count) X{ X char namebuf[64]; X X CloseOldFile(); X X do { X sprintf(namebuf, "%s/%d", dir, ++count); X } while (access(namebuf, 0) == 0); X X if ((mp = fopen(namebuf, "w")) == NULL) { X printf("FATAL -- can't create %s to hold new message\n", namebuf); X exit(10); X } X printf("%4d: ", count); X return (count); X} X Xstatic void Xcopyline(register char *buf, FILE *fp) X{ X register int c; X X if (mp == NULL) X return; X X while (*buf != '\0') { X putc(*buf, mp); X if (*buf == '\n') X return; X ++buf; X } X while ((c = getc(fp)) != EOF) { X putc(c, mp); X if (c == '\n') X return; X } X} X Xstatic int Xreal_from(char *buffer, char *who) X{ X /* X * returns true if 's' has the seven 'from' fields, X * initializing the who to the sender X * also returns true if has dmail ARCHIVE flag X */ X char fld3[20], fld7[20]; X X if (strncmp(buffer, "From ", 5) != 0) X return (0); X X fld7[0] = '\0'; X sscanf(buffer, "%*s %s %s %*s %*s %*s %s", who, fld3, fld7); X if (fld7[0] != '\0') X return (1); X if (strcmp(fld3, "(ARCHIVE)") != 0) X return (0); X strcpy(who, fld3); X return (1); X} X Xstatic void Xforwarded(char *buffer, char *who) X{ X /* X * change 'from' and date fields to reflect the ORIGINATOR of X * the message by iteratively parsing the >From fields... X */ X char machine[80], buff[80]; X X machine[0] = '\0'; X sscanf(buffer, "%*s %s %*s %*s %*s %*s %*s %*s %*s %s", who, machine); X X if (machine[0] == '\0') /* try for srm address */ X sscanf(buffer, "%*s %s %*s %*s %*s %*s %*s %*s %s", who, machine); X X if (machine[0] == '\0') X sprintf(buff, "anonymous"); X else X sprintf(buff, "%s!%s", machine, who); X X strncpy(who, buff, 80); X} X Xstatic void Xremove_first_word(char *dest, char *string) X{ X /* X * Removes first word of string, i.e., up to first non-white space X * following a white space, and copies it to the destination. X */ X while (!isspace(*string)) X ++string; X while (isspace(*string)) X ++string; X while (*dest++ = *string++) X ; X if (dest[-2] == '\n') X dest[-2] = '\0'; X} X Xstatic void Xshow_header(char *from, char *subject) X{ X /* X * output header in clean format, including abbreviation X * of return address if more than one machine name is X * contained within it! X */ X register char *p, *q, *r; X X#ifdef PREFER_UUCP X if (chloc(from, '!') != -1 && chloc(from, '@') > 0) { X for (p=from; *p != '@'; p++) X ; X *p = '\0'; X } X#endif X X p = from; X q = from; /* find address portion */ X while ((r = strchr(q, '!')) != NULL) { X p = q; X q = r + 1; X } X X printf("%-30s %s\n", p, subject); X} X Xstatic void Xparse_arpa_from(char *buffer, char *newfrom) X{ X /* X * Try to parse the 'From:' line given... It can be in one of X * two formats: X * From: Dave Taylor <hpcnou!dat> X * or From: hpcnou!dat (Dave Taylor) X * Change 'newfrom' ONLY if sucessfully parsed this entry and X * the resulting name is non-null! X */ X register char *p, *q; X register int i; X X if (*(q = buffer + strlen(buffer) - 1) == '>') { X p = buffer + 6, q = p; /* skip "From: " */ X do { X ++q; X } while (*q != '\0' && *q != '<' && *q != '('); X } else if (*q == ')') { X p = q; X do { X --p; X } while ((p > buffer + 5) && *p != '(' && *p != '<'); X } else X return; X X if (p >= q) X return; X X /* remove leading spaces... */ X while (isspace(*++p)) X ; X X /* remove trailing spaces... */ X while (isspace(*--q)) X ; X X /* if anything is left, let's change 'from' value! */ X if (p >= q) X return; X i = p - q + 1; X strncpy(newfrom, p, i)[i] = '\0'; X} X Xstatic char buffer[1000]; Xstatic char from_whom[512], subject[512]; X Xint Xunpackmail(char *dir, int count) X{ X register FILE *fp; X register char *mailfile; X X if (access(mailfile = expand_path(dir, ".mailfile"), 0) != 0) X return count; X if ((fp = fopen(mailfile, "r")) == NULL) X return count; X mailfile = fgets(buffer, (int)sizeof buffer, fp); X fclose(fp); X if (mailfile == NULL) X return count; X if ((mailfile = strchr(buffer, '\n')) != NULL) X *mailfile = '\0'; X if ((fp = fopen(buffer, "r")) == NULL) X return count; X mailfile = strdup(buffer); X X printf("New mail:\n"); X mp = NULL; X while (fgets(buffer, (int)sizeof buffer, fp) != NULL) { X if (real_from(buffer, from_whom)) { X count = NewFile(dir, count); X } else if (from_whom[0] != '\0') { X if (strncmp(buffer, ">From ", 6) == 0) { X forwarded(buffer, from_whom); X } else if (strncmp(buffer, "Subject:", 8) == 0 || strncmp(buffer, "Re:", 3) == 0) { X if (subject[0] == '\0') X remove_first_word(subject, buffer); X } else if (strncmp(buffer, "From:", 5) == 0) X parse_arpa_from(buffer, from_whom); X else if (buffer[0] == '\n') { X show_header(from_whom, subject); X from_whom[0] = 0, subject[0] = 0; X } X } X copyline(buffer, fp); X } X fclose(fp); X CloseOldFile(); X X#ifndef TEST X remove(mailfile); X#else X printf("remove(%s)\n", mailfile); X#endif X free(mailfile); X return count; X} X X#ifdef TEST Xmain(int argc, char **argv) X{ X printf("New value of count is %d\n", unpackmail("UUNEWS:mail.test", 9)); X return 0; X} X#endif X END_OF_FILE if test 5525 -ne `wc -c <'uucp2/src/anews/unpackmail.c'`; then echo shar: \"'uucp2/src/anews/unpackmail.c'\" unpacked with wrong size! fi # end of 'uucp2/src/anews/unpackmail.c' fi if test -f 'uucp2/src/dmail/main.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/dmail/main.c'\" else echo shar: Extracting \"'uucp2/src/dmail/main.c'\" \(6263 characters\) sed "s/^X//" >'uucp2/src/dmail/main.c' <<'END_OF_FILE' X X/* X * MAIN.C X * X * $Header: Beta:src/uucp/src/dmail/RCS/main.c,v 1.1 90/02/02 12:03:43 dillon Exp Locker: dillon $ X * X * (C) Copyright 1985-1990 by Matthew Dillon, All Rights Reserved. X * X * Global Routines: MAIN() X * INIT() X * SIG_HANDLE() X * X * Static Routines: none. X */ X X#include <pwd.h> X#include <stdio.h> X#include <signal.h> X#include <sys/types.h> X#include <sys/stat.h> X#include <config.h> X#include "version.h" X X#include "dmail.h" X XIDENT(".04"); Xchar *dillon_cpr = DCOPYRIGHT; X X#define MAILHOME MakeConfigPath(UUMAIL, "") X#define MBOX MakeConfigPath(UUMAIL, "mbox") X#define ALT_MBOX MakeConfigPath(UUMAIL, ".mbox") X#define MAILRC MakeConfigPath(UULIB, ".dmailrc") X#define VISUAL GetConfig(EDITOR, "dme") X Xvoid init(); X Xmain(argc, argv) Xchar *argv[]; X{ X int i, next, Retry; X int fop = 0, oop = 0; X int rcload = 1; X int options = 1; X int no_mail_overide = 0; X int nc = 0; X static int nameslist[128]; X char *rcname; X X if (push_base()) X done (1); X X init(); X rcname = malloc (strlen(home_dir) + strlen(MAILRC) + 2); X#ifdef AMIGA X rcname[0] = 0; X#else X strcpy (rcname, home_dir); X strcat (rcname, "/"); X#endif X strcat (rcname, MAILRC); X for (i = 1; i < argc; ++i) { X next = 0; X if ((*argv[i] == '-') && options) { X if (*(argv[i] + 1) == '\0') { X options = 0; X continue; X } X while (*++argv[i]) { X switch (*argv[i]) { X case 'S': X lmessage_overide = 1; X break; X case 'O': X no_mail_overide = 1; X break; X case 'l': X rcload = 1; X if (i + 1 < argc && *argv[i + 1] != '-') { X xfree (rcname); X oop = 1; X ++i; X ++next; X rcname = malloc (strlen (argv[i]) + 1); X strcpy (rcname, argv[i]); X } X break; X case 'L': X rcload = 0; X break; X case 'D': X XDebug = 1; X break; X case 'F': X if (++i < argc) { X add_extra (argv[i]); X } else { X puts (" -F Requires Field argument"); X exit (1); X } X ++next; X break; X case 'v': X set_var (LEVEL_SET, "verbose", ""); X break; X case 'o': X xfree (output_file); X if (i + 1 < argc && *argv[i + 1] != '-') { X oop = 1; X ++i; X ++next; X output_file = malloc (strlen (argv[i]) + 1); X strcpy (output_file, argv[i]); X } else { X oop = -1; X output_file = malloc (strlen(home_dir) + X strlen(ALT_MBOX) + 2); X#ifdef AMIGA X strcpy (output_file, ALT_MBOX); X#else X sprintf (output_file, "%s/%s", home_dir, ALT_MBOX); X#endif X } X break; X case 'f': X if (i + 1 < argc && *argv[i + 1] != '-') { X fop = 1; X ++i; X ++next; X mail_file = realloc (mail_file, strlen (argv[i]) + 1); X strcpy (mail_file, argv[i]); X } else { X fop = -1; X mail_file = realloc (mail_file, X strlen(home_dir) + strlen(MBOX) + 2); X#ifdef AMIGA X strcpy (mail_file, MBOX); X#else X sprintf (mail_file, "%s/%s", home_dir, MBOX); X#endif X } X break; X default: X puts ("dmail: Bad argument"); X puts ("dmail -O then 'help' for help."); X done (1); X } X if (next) X break; X } X } else { X No_load_mail = 1; X nameslist[nc++] = i; X } X } X if (oop == -1 && fop == -1) { X mail_file = realloc (mail_file, strlen(output_file) + 1); X strcpy (mail_file, output_file); X } Xends: X initial_load_mail(); X m_select (Nulav, M_RESET); X Current = indexof (1); X if (nc) X set_var (LEVEL_SET, "comlinemail", ""); X if (rcload) { X ac = 2; X av[1] = rcname; X do_source(rcname, 1); X } X if (nc) { X av[0] = "mail"; X for (i = 0; i < nc; ++i) X av[i + 1] = argv[nameslist[i]]; X ac = nc + 1; X do_reply ("", R_MAIL); X done (0); X } X if (Entries + no_mail_overide == 0) { X printf ("\nNO MAIL for %s\n\n", user_name); X return; X } X printf ("\nRF %-20s WF %-20s\n", mail_file, output_file); X do { X Retry = 20; X pop_base(); Xloop: X if (push_base()) { X pop_base(); X if (XDebug) X printf ("TOP LEVEL INTR, Level: %d\n", Longstack); X if (--Retry == 0) X done (1); X puts (""); X goto loop; X } X check_new_mail(); X } while (do_command() > 0); X X return(0); X} X Xvoid Xinit() X{ X char *str; X struct passwd *passwd; X extern int sig_handle(); X X Entry = (struct ENTRY *)malloc (sizeof(*Entry)); X Entry->status = Entry->no = Entry->fpos = 0; X passwd = getpwuid(getuid()); X if (passwd == NULL) { X printf("DMail, unable to get passwd entry for uid %d\n", getuid()); X exit(1); X } X user_name = malloc (strlen(passwd->pw_name) + 1); X home_dir = malloc (strlen(passwd->pw_dir) + 1); X visual = malloc (strlen(VISUAL) + 1); X strcpy (visual , VISUAL); X strcpy (user_name, passwd->pw_name); X strcpy (home_dir , passwd->pw_dir); X#ifdef AMIGA X if (str = FindConfig(HOME)) X strcpy ((home_dir = realloc (home_dir, strlen(str) + 1)), str); X if (str = FindConfig(USERNAME)) X strcpy ((user_name = realloc (user_name, strlen(str) + 1)), str); X if (str = FindConfig(EDITOR)) X strcpy ((visual = realloc (visual, strlen(str) + 1)), str); X X if (str = MallocEnviro("USER")) X user_name = str; X X#else X if ((str = getenv ("HOME")) != NULL) X strcpy ((home_dir = realloc (home_dir, strlen(str) + 1)), str); X if ((str = getenv ("USER")) != NULL) X strcpy ((user_name = realloc (user_name, strlen(str) + 1)), str); X if ((str = getenv ("VISUAL")) != NULL) X strcpy ((visual = realloc (visual, strlen(str) + 1)), str); X#endif X mail_file = malloc (strlen(MAILHOME) + strlen(user_name) + 1); X sprintf (mail_file , "%s%s", MAILHOME, user_name); X output_file = malloc (strlen(home_dir) + 2 + strlen(MBOX) + 1); X#ifdef AMIGA X strcpy(output_file, MBOX); X#else X sprintf (output_file, "%s/%s", home_dir, MBOX); X#endif X fix_globals(); X#ifdef UNIX X signal (SIGHUP, sig_handle); X signal (SIGINT, sig_handle); X signal (SIGPIPE, SIG_IGN); X#endif X#ifdef AMIGA X signal (SIGINT, sig_handle); X#endif X} X Xsig_handle() X{ X#ifdef UNIX X int mask = sigblock (0); X X sigsetmask (mask & ~((1 << SIGHUP) | (1 << SIGINT))); X#endif X#ifdef AMIGA X signal (SIGINT, sig_handle); /* reload signal */ X#endif X if (Longstack && !Breakstack) X longjmp (env[Longstack], 1); X return(0); X} X Xget_inode(file) Xchar *file; X{ X struct stat stats; X X if (stat (file, &stats) < 0) X return (-1); X return (stats.st_ino); X} X END_OF_FILE if test 6263 -ne `wc -c <'uucp2/src/dmail/main.c'`; then echo shar: \"'uucp2/src/dmail/main.c'\" unpacked with wrong size! fi # end of 'uucp2/src/dmail/main.c' fi if test -f 'uucp2/src/dmail/sub.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/dmail/sub.c'\" else echo shar: Extracting \"'uucp2/src/dmail/sub.c'\" \(5006 characters\) sed "s/^X//" >'uucp2/src/dmail/sub.c' <<'END_OF_FILE' X X/* X * SUB.C X * X * $Header: Beta:src/uucp/src/dmail/RCS/sub.c,v 1.1 90/02/02 12:03:38 dillon Exp Locker: dillon $ X * X * (C) Copyright 1985-1990 by Matthew Dillon, All Rights Reserved. X * X * Global Routines: INDEXOF() X * SIG() X * POSITION_CURRENT() X * SKIP_TO_DATE() X * GET_FIELD() X * COMPILE_FIELD() X * ISFROM() X * XSTRNCMP() X * NEXT_WORD() X * DONE() X * X */ X X#include <signal.h> X#include <stdio.h> X#include "dmail.h" X#include "config.h" X X#ifdef UNIX Xextern FILE *popen(); X#endif X Xxfree(ptr) Xchar *ptr; X{ X static char *sptr; X X if (sptr) X free (sptr); X sptr = ptr; X return (1); X} X X Xindexof(num) Xregister int num; X{ X register int i, last; X X if (num < 1) X num = -1; X for (last = -1, i = 0; i < Entries; ++i) { X if (Entry[i].no) { X last = i; X if (Entry[i].no == num) X return (i); X } X } X if (num == -1 && last >= 0) X return (last); X return (-1); X} X Xvoid Xnull() X{ X} X X Xposition_current() X{ X int pos; X X if (!m_fi) X return(0); X if (Current >= 0) { X pos = Entry[Current].fpos; X if (fseek (m_fi, pos, 0) < 0 || ftell(m_fi) != pos) X puts ("ERROR: Cannot position file to message"); X } else { X fseek (m_fi, 0, 0); X } X} X X Xskip_to_data(fi) XFILE *fi; X{ X static char buf[MAXFIELDSIZE]; X X while (fgets (buf, MAXFIELDSIZE, fi) != NULL) { X if (*buf == '\n') X return (1); X } X return (-1); X} X X Xchar * Xget_field(str) Xchar *str; X{ X int i, entry = Current; X int len = strlen(str); X X if (Current < 0) X return(""); X i = get_extra (str); X if (i >= 0) X return (Entry[entry].fields[i]); X if (m_fi == NULL) X return (""); X fseek (m_fi, Entry[entry].fpos, 0); X while (fgets (Buf, MAXFIELDSIZE, m_fi) != NULL) { X if (isfrom (Buf)) X break; X if (strncmp (Buf, str, len) == 0) { X Buf[strlen(Buf) - 1] = '\0'; X compile_field(Buf, m_fi); X return (next_word (Buf)); X } X } X return (""); X} X X Xcompile_field(buf, fi) Xchar *buf; XFILE *fi; X{ X int len, acc, pos; X X acc = 0; X buf += strlen (buf) + 1; X pos = ftell (fi); X while (fgets (buf, MAXFIELDSIZE - acc, fi) != NULL) { X if (*buf == ' ' || *buf == 9) { X *(buf - 1) = '\n'; X len = strlen (buf) - 1; X *(buf + len) = '\0'; X buf += len; X acc += len + 2; X if (acc > MAXFIELDSIZE - 10) { X printf ("Warning: Field size beyond %d bytes\n", MAXFIELDSIZE); X sleep (2); X return (1); X } X } else { X *buf = '\0'; X fseek (fi, pos, 0); X return (1); X } X pos = ftell (fi); X } X fseek (fi, pos, 0); X} X X Xisfrom(str) Xregister char *str; X{ X static char from[] = {"From "}; X register int i = 0; X X while (i < 5) { X if (*str++ != from[i++]) X return (0); X } X return (1); X} X X Xxstrncmp (src, dest, len) Xregister char *src, *dest; Xregister int len; X{ X while (--len >= 0) { X if ((*src & 0x1f) != (*dest & 0x1f)) { X if ((*src & 0x1f) < (*dest & 0x1f)) X return (-1); X return (1); X } X ++src; ++dest; X } X return (0); X} X X X Xchar * Xnext_word(str) Xregister char *str; X{ X while (*str && *str != ' ' && *str != 9) X ++str; X while (*str && (*str == ' ' || *str == 9)) X ++str; X return (str); X} X Xvoid Xdone(n) X{ X char scr[64]; X X push_break(); X sprintf (scr, "t:dmail%d", getpid()); X unlink (scr); X sprintf (scr, "t:dmt%d", getpid()); X unlink (scr); X unlink ("#"); X exit (n); X} X Xvoid Xfix_globals() X{ X char *ptr; X X push_break(); X S_page = (ptr = get_var (LEVEL_SET, "page")) ? X ((*ptr) ? atoi (ptr) : 24) : -1; X if (S_page > 0 && (S_page -= 4) < 0) X S_page = 1; X X S_sendmail = (ptr = get_var (LEVEL_SET, "sendmail")) ? ptr : GetConfigProgram(SENDMAIL); X S_novibreak= (ptr = get_var (LEVEL_SET, "vibreak")) ? 0 : 1; X S_verbose = (ptr = get_var (LEVEL_SET, "verbose")) ? 1 : 0; X S_ask = (ptr = get_var (LEVEL_SET, "ask")) ? 1 : 0; X S_archive = (ptr = get_var (LEVEL_SET, "archive")) ? 1 : 0; X if (S_archive && *ptr == '\0') X S_archive = 0; X pop_break(); X} X X X_pager(str, nl) Xchar *str; Xint nl; X{ X static int count; X static FILE *fi; X static char buf[1024]; X#ifdef UNIX X char *ptr; X#endif X X if (str == 0) { X switch (S_page) { X case -1: X count = 0; X return (1); X case 0: X#ifdef UNIX X ptr = get_var (LEVEL_SET, "page"); X fi = popen (ptr, "w"); X if (fi == NULL) { X count = 0; X printf ("CANNOT RUN PAGER PROGRAM: %s\n", ptr); X } else { X count = -1; X } X#else X count = 0; X fi = stdout; X#endif X return (1); X default: X count = 0; X return (1); X } X } X if ((long)str == -1) { X#ifdef UNIX X if (fi != NULL) { X pclose (fi); X fi = NULL; X } X#else X fi = NULL; X#endif X return (1); X } X if (count < 0) { X fputs (str, fi); X while (nl--) X fputs ("\n", fi); X } else { X fputs (str, stdout); X while (nl--) { X fputs ("\n", stdout); X ++count; X } X#ifdef AMIGA X fflush(stdout); X#endif X while (*str) { X if (*str++ == '\n') X ++count; X } X if (S_page > 0 && S_page <= count) { X count = 0; X puts ("\n-- more --"); X gets(buf); X } X } X} X END_OF_FILE if test 5006 -ne `wc -c <'uucp2/src/dmail/sub.c'`; then echo shar: \"'uucp2/src/dmail/sub.c'\" unpacked with wrong size! fi # end of 'uucp2/src/dmail/sub.c' fi if test -f 'uucp2/src/lib/alias.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/lib/alias.c'\" else echo shar: Extracting \"'uucp2/src/lib/alias.c'\" \(5044 characters\) sed "s/^X//" >'uucp2/src/lib/alias.c' <<'END_OF_FILE' X X/* X * ALIAS.C X * X * $Header: Beta:src/uucp/src/lib/RCS/alias.c,v 1.1 90/02/02 12:08:24 dillon Exp Locker: dillon $ X * X * (C) Copyright 1989-1990 by Matthew Dillon, All Rights Reserved. X * X * Interpret UULIB:Aliases file. To save space we do not load X * the entire file, just sections on demand. X * X * # = comment X * id: name [, name...] X * X * name is a user name, path, or |filter, or quoted name. Example, X * "|more" or "|rnews" X */ X X#include <stdio.h> X#include <stdlib.h> X#include <fcntl.h> X#include <time.h> X#include "config.h" X X#include "log.h" X X#define HASHSIZE 256 X#define HASHMASK (HASHSIZE-1) X X#define HF_TERM 0x01 /* terminator name */ X#define HF_ALIAS 0x02 /* alias */ X#define HF_LOADED 0x04 /* def loaded */ X Xtypedef struct Hash { X struct Hash *Next; X short NumAlias; /* # of aliases */ X short Flags; X char *Name; /* aliased user name */ X union { X struct Hash **Alias; /* list of aliases */ X long Offset; /* offset into file */ X } u; X} Hash; X XPrototype void LoadAliases(void); XPrototype void UserAliasList(const char *, void (*)(const char *)); X XLocal Hash *FindHashObject(const char *); XLocal void LoadHashObject(Hash *); XLocal int HashFunc(const char *); X X Xstatic Hash *HashTab[HASHSIZE]; Xstatic char Tmp[256]; X Xvoid XLoadAliases() X{ X FILE *fi = fopen(MakeConfigPath(UULIB, "Aliases"), "r"); X short i; X short j; X short k; X short line = 0; X long newoffset = 0; X long offset; X Hash *h; X char *buf = Tmp; X X if (fi == NULL) { X ulog(-1, "Can't open %s", MakeConfigPath(UULIB, "Aliases")); X return; X } X while (fgets(buf, 256, fi)) { X offset = newoffset; X newoffset = ftell(fi); X ++line; X for (i = 0; buf[i] == ' ' || buf[i] == 9; ++i); X if (buf[i] == '#' || buf[i] == '\n') X continue; X for (j = i; buf[j] && buf[j] != ':'; ++j); X if (buf[j] == 0) { X ulog(-1, "No Colon %s line %d", MakeConfigPath(UULIB, "Aliases"), line); X continue; X } X buf[j] = 0; X X k = HashFunc(buf + i); X h = malloc(sizeof(Hash)); X h->Next = HashTab[k]; X h->NumAlias = 0; X h->Flags = HF_ALIAS; X h->Name = malloc(strlen(buf+i) + 1); X h->u.Offset = offset + j + 1; X strcpy(h->Name, buf + i); X X HashTab[k] = h; X X /* X * if trailing comma, list continues onto next line X */ X X for (;;) { X for (++j; buf[j]; ++j); X while (buf[j-1] == ' ' || buf[j-1] == 9 || buf[j-1] == '\n') X --j; X if (buf[j-1] != ',') X break; X if (fgets(buf, 256, fi) == NULL) X break; X newoffset = ftell(fi); X j = 0; X } X } X fclose(fi); X} X Xstatic XHash * XFindHashObject(name) Xconst char *name; X{ X short k = HashFunc(name); X Hash *h; X X for (h = HashTab[k]; h; h = h->Next) { X if (strcmp(name, h->Name) == 0) X return(h); X } X return(NULL); X} X Xstatic Xvoid XLoadHashObject(hash) XHash *hash; X{ X FILE *fi = fopen(MakeConfigPath(UULIB, "Aliases"), "r"); X char *buf = Tmp; X short i, j; X short c; X short numalloc = 4; X Hash **hv = malloc(sizeof(Hash *) * 4); X Hash *h; X X if (fi == NULL) { X ulog(-1, "Can't open %s", MakeConfigPath(UULIB, "Aliases")); X return; X } X X hash->Flags |= HF_LOADED; X fseek(fi, hash->u.Offset, 0); X while (fgets(buf, 256, fi)) { X i = 0; X c = 'x'; X X for (;;) { X while (buf[i] == ' ' || buf[i] == 9) X ++i; X if (buf[i] == 0 || buf[i] == '\n') X break; X X for (j = i; buf[j] != '\n' && buf[j] != ' ' && buf[j] != 9 && buf[j] != ','; ++j) { X if (buf[j] == '\"') { X i = j + 1; X for (++j; buf[j] != '\n' && buf[j] != '\"'; ++j); X break; X } X } X c = buf[j]; X buf[j] = 0; X X if ((h = FindHashObject(buf + i)) == NULL) { X short k = HashFunc(buf + i); X X h = malloc(sizeof(Hash)); X h->Next = HashTab[k]; X h->NumAlias = 0; X h->Flags = HF_TERM; X h->Name = malloc(strlen(buf + i) + 1); X h->u.Alias = NULL; X strcpy(h->Name, buf + i); X X HashTab[k] = h; X } X X if (hash->NumAlias == numalloc) { X Hash **hvo = hv; X short add = 4; X X hv = malloc(sizeof(Hash *) * (numalloc + add)); X movmem((char *)hvo, (char *)hv, sizeof(Hash *) * numalloc); X numalloc += add; X } X hv[hash->NumAlias++] = h; X X i = j + 1; X if (c == '\"') X c = buf[i++]; X if (c == '\n' || c == 0) X i = j; X } X if (c != ',') X break; X } X hash->u.Alias = hv; X} X Xvoid XUserAliasList(user, callback) Xconst char *user; Xvoid (*callback)(const char *); X{ X short i; X Hash *hash = FindHashObject(user); X static short stack; X X if (++stack == 32) { X ulog(-1, "%s recursion near user %s", MakeConfigPath(UULIB, "Aliases"), user); X --stack; X return; X } X X if (hash && (hash->Flags & HF_TERM) == 0) { X if ((hash->Flags & HF_LOADED) == 0) X LoadHashObject(hash); X for (i = 0; i < hash->NumAlias; ++i) { X Hash *h = hash->u.Alias[i]; X UserAliasList(h->Name, callback); X } X } else { X (*callback)(user); X } X --stack; X} X Xstatic int XHashFunc(str) Xconst char *str; X{ X unsigned long v = 0x14FBA5C3; X while (*str) { X v = (v << 5) ^ (*str & 0x1F) ^ (v >> 27); X ++str; X } X return((int)(v & HASHMASK)); X} X END_OF_FILE if test 5044 -ne `wc -c <'uucp2/src/lib/alias.c'`; then echo shar: \"'uucp2/src/lib/alias.c'\" unpacked with wrong size! fi # end of 'uucp2/src/lib/alias.c' fi if test -f 'uucp2/src/news/postnews.c.OLD' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/news/postnews.c.OLD'\" else echo shar: Extracting \"'uucp2/src/news/postnews.c.OLD'\" \(4283 characters\) sed "s/^X//" >'uucp2/src/news/postnews.c.OLD' <<'END_OF_FILE' X X/* X * PostNews.c X * X * Copyright 1988 by William Loftus. All rights reserved. X * X * Version 0.60 Beta X * X * $Header: Beta:src/uucp/src/News060/postnews.c,v 1.1 90/02/02 11:44:07 dillon Exp Locker: dillon $ X */ X X#include <time.h> X#include <stdio.h> X#include <stdlib.h> X#include "log.h" X#include "version.h" X XIDENT(".02"); X Xchar *UserName; Xchar *NodeName; Xchar *RealName; Xchar *NewsEditor; Xchar *DomainName; Xchar to_buf[128]; Xchar grp_buf[128]; Xchar dist_buf[128]; Xchar subject_buf[128]; Xchar *temp_file_name; X Xint seq; X Xchar *NewsFeed; X Xchar cmd[128]; Xchar path[128]; Xchar signature[121]; X Xvoid read_ctl(); Xvoid GetTo(); Xvoid GetDist(); Xvoid GetSubject(); Xvoid GetMessage(); Xvoid BuildRnews(); Xvoid Signature(); Xvoid PromptGet(); Xchar *TmpFileName(); Xchar *FindConfig(); X Xvoid Xerrormsg (msg, ...) Xchar *msg; X{ X printf(msg); X} X X Xvoid Xmain() X{ X temp_file_name = TmpFileName(MakeConfigPath(UUSPOOL, "news")); X X LogProgram = "PostNews"; X X UserName = FindConfig("UserName"); X NodeName = FindConfig("NodeName"); X NewsFeed = FindConfig("NewsFeed"); X NewsEditor=FindConfig("NewsEditor"); X RealName = FindConfig("RealName"); X DomainName=FindConfig("DomainName"); X X if (UserName == NULL || NodeName == NULL || NewsFeed == NULL || X NewsEditor==NULL || RealName == NULL || DomainName == NULL) X { X printf("UULIB:Config incomplete, missing one or more of:\n"); X printf(" UserName, NodeName, DomainName, NewsFeed, NewsEditor, RealName\n"); X exit(1); X } X X GetTo(); X GetDist(); X GetSubject(); X GetMessage(); X BuildRnews(); X} X Xvoid XGetTo() X{ X PromptGet("Newsgroup(s): ", 0, grp_buf, sizeof(grp_buf), stdin); X} X Xvoid XGetDist() X{ X FILE *fd; X char buf[128]; X X if (!(fd = fopen(MakeConfigPath(UULIB, "news.distribution"), "r"))) { X errormsg("Can't Find news.distribution file"); X exit(3); X } X X while (fgets(buf, sizeof buf, fd)) { X printf("%s", buf); X } X X PromptGet("Distribution: ", 0, dist_buf, sizeof(dist_buf), stdin); X} X Xvoid XGetSubject() X{ X PromptGet("Subject: ", 1, subject_buf, sizeof(subject_buf), stdin); X} X Xvoid XGetMessage() X{ X FILE *fp; X time_t t; X X seq = GetSequence(4); X X fp = fopen(temp_file_name, "w"); X X if (fp) { X time(&t); X fprintf(fp,"Relay-Version: X-AmigaNEWS version 0.60 BETA; site %s%s\n", NodeName, DomainName); X fprintf(fp,"Posting-Version: X-AmigaNEWS version 0.60 BETA; site %s%s\n", NodeName, DomainName); X fprintf(fp,"Path: %s!%s\n", NodeName, UserName); X fprintf(fp,"From: %s@%s%s (%s)\n", UserName, NodeName, DomainName, RealName); X fprintf(fp,"Newsgroups: %s", grp_buf); X fprintf(fp,"Subject: %s", subject_buf); X fprintf(fp,"Message-Id: <%05d.AA%05d@%s%s>\n", seq, seq, NodeName, DomainName); X fprintf(fp,"Date: %s", ctime(&t)); X fprintf(fp,"Followup-To: %s", grp_buf); X fprintf(fp,"Expires: \n"); X fprintf(fp,"Keywords: \n"); X fprintf(fp,"Distribution: %s\n\n", dist_buf); X X fclose(fp); X } else { X errormsg("Can't open temp file %s\n", temp_file_name); X exit(1); X } X X sprintf(cmd,"%s %s", NewsEditor, temp_file_name); X system(cmd); X X printf("Append .signature file? [y/n] "); X fgets(signature, sizeof signature, stdin); X if ((signature[0] | 0x20) != 'n') { X Signature(); X printf(".signature file appended.\n"); X } X} X Xvoid XBuildRnews() X{ X NewsFeed[7] = '\0'; X X sprintf(cmd, "UUX %s \"%s!rnews\"", temp_file_name, NewsFeed); X system(cmd); X remove(temp_file_name); X} X X/* X * Read the control file and grab a few parameters. X */ X Xvoid XSignature() X{ X FILE *fp; X FILE *sf; X char buff[128]; X X fp = fopen(temp_file_name, "a"); /* should already exist!! */ X X if (!fp) { X errormsg("Can't open temp file--%s\n", temp_file_name); X exit(1); X } X X fprintf(fp, "\n--\n"); X X sf = fopen(MakeConfigPath(UULIB, ".signature"), "r"); X X if (sf) { X while (NULL != fgets(buff, sizeof buff, sf)) { X fprintf(fp, "%s", buff); X } X fclose(sf); X } else { X errormsg("Can't open .signature file\n"); X } X fclose(fp); X} X Xvoid XPromptGet(prompt, loop, buf, bufsize, fin) Xchar *prompt; Xchar *buf; XFILE *fin; X{ X short i; X X do { X printf("%s", prompt); X fflush(stdout); X if (fgets(buf, bufsize, fin) == NULL) X break; X for (i = 0; buf[i] == ' ' || buf[i] == 9; ++i); X if (buf[i] != '\n') X break; X } while (loop); X} X X END_OF_FILE if test 4283 -ne `wc -c <'uucp2/src/news/postnews.c.OLD'`; then echo shar: \"'uucp2/src/news/postnews.c.OLD'\" unpacked with wrong size! fi # end of 'uucp2/src/news/postnews.c.OLD' fi if test -f 'uucp2/src/sendmail/domain.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/sendmail/domain.c'\" else echo shar: Extracting \"'uucp2/src/sendmail/domain.c'\" \(4627 characters\) sed "s/^X//" >'uucp2/src/sendmail/domain.c' <<'END_OF_FILE' X X/* X * DOMAIN.C X * X * $Header: Beta:src/uucp/src/sendmail/RCS/domain.c,v 1.1 90/02/02 12:14:59 dillon Exp Locker: dillon $ X * X * (C) Copyright 1989-1990 by Matthew Dillon, All Rights Reserved. X * X * Given the first machine in a path scan the domain list and X * return the type, class, and address of the resource entry. X * X * AUTOMATIC HACKS: scans L.sys file and automatically deals X * with machine[.UUCP] domain, returning X * Type=MD Class=UU Addr=machine.UUCP X */ X X#include "defs.h" X XPrototype DomainLookup(char *, int, char *, char *, char *); XPrototype CompareDomain(char **, short, char **, short); X Xextern char *DefaultNode; Xextern char *NodeName; X Xint XDomainLookup(name, len, tb, cb, ab) Xchar *name; Xint len; Xchar *tb; Xchar *cb; Xchar *ab; X{ X char *dary[16]; X char *tmp = malloc(len + 1); X char *tbase = tmp; X short b, i; X short di; X FILE *fi; X short level; /* best domain level found so far */ X static char buf[256]; X X for (b = i = di = 0; i < len && name[i] != '!'; ++i) { X if (name[i] == '.') { X if (di == sizeof(dary)/sizeof(dary[0]) - 1) { X ulog(-1, "DomainLookup, too many domains! %s", name); X break; X } X strncpy(tmp, name + b, i - b); X tmp[i - b] = 0; X dary[di] = tmp; X tmp += i - b + 1; X b = i + 1; X ++di; X } X } X strncpy(tmp, name + b, i - b); X tmp[i - b] = 0; X dary[di++] = tmp; X X#ifdef NOTDEF X { X short i; X for (i = 0; i < di; ++i) X printf("XX '%s'\n", dary[i]); X } X#endif X X /* X * Check local mail X */ X X level = 0; X X if (strcmpi(dary[0], NodeName) == 0) { X strcpy(tb, "--"); /* not used by caller */ X strcpy(cb, "LL"); X strcpy(ab, "--"); X level = 1; X } X X if (level == 0 && (fi = fopen(MakeConfigPath(UULIB, "Domain"), "r"))) { X while (fgets(buf, sizeof(buf), fi)) { X short l2; X short di2 = 0; X char *dary2[16]; X X if (buf[0] == ' ' || buf[0] == 9 || buf[0] == '\n' || buf[0] == '#') X continue; X for (b = i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i) { X if (buf[i] == '.') { X if (di2 == sizeof(dary2)/sizeof(dary2[0]) - 1) { X ulog(-1, "%s, entry has too many subdomains: %s", MakeConfigPath(UULIB, "Domain"), buf); X break; X } X dary2[di2++] = buf + b; X buf[i] = 0; X b = i + 1; X } X } X buf[i] = 0; X dary2[di2++] = buf + b; X X buf[i] = 0; /* get domain name/wildcard */ X X l2 = CompareDomain(dary, di, dary2, di2); X X#ifdef NOTDEF X { X short i; X printf("\nres %d\n", l2); X for (i = 0; i < di; ++i) X printf("#1 %s\n", dary[i]); X for (i = 0; i < di2; ++i) X printf("#2 %s\n", dary2[i]); X } X#endif X X if (l2 > level) { /* better domain then what we have */ X sscanf(buf + i + 1, "%s %s %s", tb, cb, ab); X level = l2; X } X } X fclose(fi); X } X X /* X * Couldn't find the appropriate domain entry, check L.sys X * OR domain entry is a forwarder, check L.sys X */ X X if (strcmp(tb, "MF") == 0 || level == 0) { X if (fi = fopen(MakeConfigPath(UULIB, "L.sys"), "r")) { X while (fgets(buf, sizeof(buf), fi)) { X if (buf[0] == ' ' || buf[0] == 9 || buf[0] == '#' || buf[0] == '\n') X continue; X for (i = 0; buf[i] && buf[i] != ' ' && buf[i] != 9; ++i); X buf[i] = 0; X if (strcmpi(dary[0], buf) == 0) { X strcpy(tb, "MD"); X strcpy(cb, "UU"); X strcpy(ab, buf); X strcat(ab, ".UUCP"); X level = 1; X break; X } X } X fclose(fi); X } X } X X /* X * Couldn't find nothing, use DefaultNode X */ X X if (level == 0) { X ulog(-1, "Warning, unable to interpret addr %s, using DefaultNode", name); X if (DefaultNode == NULL) { X ulog(-1, "Error, DefaultNode must exist if no Domain file"); X printf("ERROR, no entry in Domain, L.sys, and\n"); X printf("no DefaultNode config entry for %s\n", name); X puts("cannot send mail"); X free(tbase); X return(0); X } X strcpy(tb, "MF"); X strcpy(cb, "UU"); X strcpy(ab, DefaultNode); X level = 1; X } X free(tbase); X return(level > 0); X} X X/* X * Compares a broken up address with a domain entry (buf). X */ X Xint XCompareDomain(da1, di1, da2, di2) Xchar **da1; Xshort di1; Xchar **da2; Xshort di2; X{ X short i, j; X short level = 0; X X for (i = di1 - 1, j = di2 - 1; i >= 0 && j >= 0; --i, --j) { X if (da2[j][0] == '*') { X ++level; X if (i && j == 0) /* so loop does not terminate */ X ++j; X continue; X } X if (strcmpi(da1[i], da2[j]) == 0) X level += 2; X else { X if (j + 1 < di2 && da2[j+1][0] == '*') { X ++level; X ++j; X } else X return(0); X } X } X if (j >= 0) /* didn't exhaust domain entry */ X return(0); X return((int)level); X} X END_OF_FILE if test 4627 -ne `wc -c <'uucp2/src/sendmail/domain.c'`; then echo shar: \"'uucp2/src/sendmail/domain.c'\" unpacked with wrong size! fi # end of 'uucp2/src/sendmail/domain.c' fi if test -f 'uucp2/src/unix/unshar.c' -a "${1}" != "-c" ; then echo shar: Will not clobber existing file \"'uucp2/src/unix/unshar.c'\" else echo shar: Extracting \"'uucp2/src/unix/unshar.c'\" \(6759 characters\) sed "s/^X//" >'uucp2/src/unix/unshar.c' <<'END_OF_FILE' X X/* X * UNSHAR.C X * X * $Header: Beta:src/uucp/src/compress/RCS/unshar.c,v 1.1 90/02/02 11:48:02 dillon Exp Locker: dillon $ X * X * unshar -- undo a shell archive file X * (C) Copyright June 4 1987 by Craig Norborg X * Permission given to use this code in any form as long as it is X * not sold or marketed in any form without the written permission X * of its author. Removal of this copyright notice is expressly X * forbidden as well as any alteration of it. X */ X/* X * Here is a small unshar program written to be as portable as possible. X * It was written under Aztec C on an Amiga and tested on a VAX 11/780, X * pdp11/70 and a Sequent Balance 21000. Any bug reports or enhancements X * should be reported to the author. Some further enhancements may X * include the correct handling of sub-directories and the handling of X * btoa/atob type shars. If you find a type of shar that this code X * does not work on, please send it to me, doc@j.cc.purdue.edu. X */ X X#include <stdio.h> X#include <ctype.h> X#include <string.h> X#include "version.h" X XIDENT(".00"); X X#ifdef unix X#include <sys/file.h> X#endif unix X#ifdef AMIGA X#define F_OK 0 X#endif AMIGA X X#define BUFSIZE 512 /* Max length of an input line */ X#define STRLEN 25 /* Max length of a file name or delimiter */ X#define CAT "cat" /* The name of the 'cat' program */ X#define SED "sed" /* The name of the 'sed' program */ X#define TEST "if test" /* Leader for test types */ X X/* X * This is a small routine that given the beginning of a quoted, backslashed X * or just plain string, will return it in a given buffer. X */ Xvoid Xcopystring(source, dest) Xchar *source, *dest; X{ X register int i = 0; X char c; X X if ('\'' == *source || '\"' == *source) {/* Is it a quoted string? */ X c = *source; X while (c != *++source) X dest[i++] = *source; X source++; X } else if ('\\' == *source) { /* Is it a backslashed string? */ X while (!isspace(*++source)) X dest[i++] = *source; X } else { /* Just a string */ X while (!isspace(*source)) { X dest[i++] = *source; X source++; X } X } X dest[i] = '\0'; X} X Xvoid Xwordcount(buf, filename, wc) Xchar *buf, *filename; Xint wc; X{ X if (wc != atoi(buf)) { X (void) printf("Error unsharing %s (wc should have been %d, but was %d)\n", filename, atoi(buf), wc); X } X} X Xint Xcheckfile(string) Xchar *string; X{ X char filename[BUFSIZE]; X X while (0 != isspace(*string)) X string++; X X copystring(string, filename); X if (0 == access(filename, F_OK)) X return 1; X X return 0; X} X X/* X * This is a small routine that given a 'cat' or 'sed' string, will pull out X * the end of file string and the file name X */ Xvoid Xgetendfile(line, end, file) Xchar *line, /* The 'sed' or 'cat' string */ X *end, /* Place to store the end of file marker */ X *file; /* Place for the filename */ X{ X char *tmp; X X /* X * This section of code finds the end of file string. It assumes X * that the eof string is the string of characters immediately X * following the last '<' and that it has either a '\' preceding it X * or is surrounded by single quotes. X */ X tmp = (char *) strrchr(line, '<'); /* Find the last '<' on the X * line */ X while (isspace(*++tmp)) X ; /* Do nothing */ X copystring(tmp, end); X X /* X * This section of code finds the name of the file. It assumes that X * the name of the file is the string immediately following the last X * '>' in the line X */ X tmp = (char *) strrchr(line, '>'); X while (isspace(*++tmp)) X ; /* Do Nothing */ X copystring(tmp, file); X X#ifdef DEBUG X (void) printf("EOF = %s, FILE = %s\n", end, file); X#endif DEBUG X} X Xint Xmain(argc, argv) Xint argc; Xchar **argv; X{ X FILE *fp, *dfp; /* input file pointer and dest file X * pointer */ X char buf[BUFSIZE], /* line buffer */ X prefix[STRLEN], /* SED leader if any */ X endstring[STRLEN], /* EOF marker */ X filename[STRLEN]; /* file name */ X int infile = 0, /* var to tell if we're in the middle of a X * file or not */ X wc = 0, /* variable to keep a word count */ X fileexists = 0; /* does the file exist? */ X X if (1 == argc) { /* check usage */ X (void) printf("usage: unshar <file>"); X } X if (NULL == (fp = fopen(argv[1], "r"))) { X (void) printf("Error opening input file\n"); X exit(1); X } X while (NULL != fgets(buf, BUFSIZE, fp)) { /* while there are lines X * to get */ X#ifdef DEBUG X puts(buf); X#endif DEBUG X X if (0 == infile) { /* if we are not in the middle of a X * file */ X if ('#' == buf[0]) /* comment? */ X continue; X X /* Is this a CAT type shar? */ X if (0 == strncmp(buf, CAT, strlen(CAT))) { X prefix[0] = '\0'; X getendfile(buf, endstring, filename); X if (fileexists != 0) { X fprintf(stderr, "File exists (%s), skipping\n", filename); X fileexists = 0; X continue; X } X if (NULL == (dfp = fopen(filename, "w"))) { X (void) printf("Error opening output file %s\n", filename); X exit(1); X } X (void) printf("Extracting %s ... ", filename); X (void) fflush(stdout); X infile = 1; X wc = 0; X continue; X } X /* Is it a SED type shar? */ X if (0 == strncmp(buf, SED, strlen(SED))) { X register int i = 0, j = 0; X X while ('^' != buf[i++]) X ; X while ('/' != buf[i]) { X prefix[j++] = buf[i++]; X } X prefix[j] = '\0'; X getendfile(&buf[i], endstring, filename); X if (fileexists != 0) { X fprintf(stderr, "File exists (%s), skipping\n", filename); X fileexists = 0; X continue; X } X if (NULL == (dfp = fopen(filename, "w"))) { X (void) printf("Error opening output file %s\n", filename); X exit(1); X } X (void) printf("Extracting %s ... ", filename); X (void) fflush(stdout); X infile = 1; X wc = 0; X continue; X } X /* Do we want to do a test of sorts on a file? */ X if (0 == strncmp(buf, TEST, strlen(TEST))) { X register int i = 0; X X while(!isdigit(buf[i]) && buf[i] != '-' && buf[i]) X i++; X X if (0 != isdigit(buf[i])) { X wordcount(&buf[i], filename, wc); X } X X if ('f' == buf[++i]) { X fileexists = checkfile(&buf[++i]); X } X continue; X } X } else { /* We are in the middle of a file */ X X /* Are we at the end of this one? */ X if (0 == strncmp(buf, endstring, strlen(endstring))) { X (void) printf("Done\n"); X (void) fclose(dfp); X infile = 0; X continue; X } X /* No, then does it have a prefix? */ X if ('\0' == prefix[0]) { X fputs(buf, dfp); X wc = wc + strlen(buf); X } else { X X /* X * If it does have a prefix, is there one on X * this line? X */ X if (0 != strncmp(buf, prefix, strlen(prefix))) { X fputs(buf, dfp); X } else { X fputs(&buf[strlen(prefix)], dfp); X wc = wc + strlen(buf) - strlen(prefix); X } X } X } X } X (void) printf("All Done!\n"); X (void) fclose(fp); X} END_OF_FILE if test 6759 -ne `wc -c <'uucp2/src/unix/unshar.c'`; then echo shar: \"'uucp2/src/unix/unshar.c'\" unpacked with wrong size! fi # end of 'uucp2/src/unix/unshar.c' fi echo shar: End of archive 5 \(of 12\). cp /dev/null ark5isdone 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.