[comp.sources.amiga] v90i183: UUCP 1.06D - UNIX compatible uucp/news/mail system, Part05/12

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.