From: frank.kaefer@stasys.sta.sub.org (Frank Kaefer)
Newsgroups: de.comp.sources.os9,comp.os.os9
Subject: MNews Prerelease Part05/09
Date: 23 Dec 92 19:41:35 GMT
Followup-To: de.comp.sources.d
Organization: Stasys News Server, Starnberg, Germany
NNTP-Posting-Host: stasys.sta.sub.org

Submitted-by: Ulrich Dessauer <ud@Nightmare.ddt.sub.org>
Archive-name: mnews/part05

: ----- Cut here ----- Cut here ----- Cut here ----- Cut here -----
: Use  sh filename  to extract shell archive
: This shell archive contains following files:
:     'INEWS/psys.c                                  882 bytes'
:     'INEWS/ract.c                                 2810 bytes'
:     'INEWS/retr.c                                  981 bytes'
:     'INEWS/rhead.c                                4336 bytes'
:     'INEWS/rsat.c                                 1309 bytes'
:     'INEWS/rsys.c                                 5149 bytes'
:     'INEWS/sect.c                                 4541 bytes'
:     'INEWS/shead.c                                1409 bytes'
:     'INEWS/sinfo.c                                4889 bytes'
:     'INEWS/sit.c                                  1351 bytes'
:     'INEWS/spch.c                                 4632 bytes'
:     'INEWS/store.c                                3458 bytes'
:     'INEWS/tsys.c                                 3084 bytes'
: 
if test -f 'INEWS/psys.c' ; then
  echo 'File INEWS/psys.c already exists, overwriting it'
  del 'INEWS/psys.c'
fi
echo Extracting \"'INEWS/psys.c'\"
sed "s/^X//" >'INEWS/psys.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	psys.c_v $
X * Revision 1.1  90/08/31  15:35:09  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: psys.c_v 1.1 90/08/31 15:35:09 cs Exp $";
X# endif		LINT
X# include	"inews.h"
X
Xint
Xprocess_sys ()
X{
X	register sys	*stmp, *la;
X
X	if (block_forward)
X		do_log ("Article blocked to be forwarded\n");
X	stmp = hsys;
X	while (stmp) {
X		if (stmp->fwd) {
X			switch (stmp->cmd ? stmp->cmd[0] : '\0') {
X				case '-':
X				case '\0':
X					if (! block_forward)
X						write_it (stmp);
X					break;
X				case '+':
X					save_it (stmp);
X					break;
X				default:
X					pipe_it (stmp->cmd);
X					break;
X			}
X			for (la = stmp->next; la; la = la->next)
X				if (la->fwd && (! strcmp (stmp->site, la->site)))
X					if (((! stmp->cmd) && (! stmp->cmd)) || (stmp->cmd && la->cmd && (! strcmp (stmp->cmd, la->cmd))))
X						la->fwd = FALSE;
X		}
X		stmp = stmp->next;
X	}
X	return (0);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/ract.c' ; then
  echo 'File INEWS/ract.c already exists, overwriting it'
  del 'INEWS/ract.c'
fi
echo Extracting \"'INEWS/ract.c'\"
sed "s/^X//" >'INEWS/ract.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	ract.c_v $
X * Revision 1.2  91/12/06  14:46:55  ud
X * Changed format of active file to be compatible to BNews/CNews
X * 
X * Revision 1.1  90/08/31  15:35:12  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: ract.c_v 1.2 91/12/06 14:46:55 ud Exp $";
X# endif		LINT
X# include	<c8type.h>
X# include	<modes.h>
X# include	"inews.h"
X
Xextern char	*malloc ();
Xextern char	*strdup ();
X
Xint
Xread_active ()
X{
X	register char	*ptr;
X	register int	t;
X	register active	*act, *tmp;
X	register int	fd;
X	int		n;
X	char		*buf, *sav;
X	char		**arg;
X	int		pos;
X
X	hact = NULL;
X# ifdef		HASH_SEARCH
X	if (! (hashact = (active **) malloc ((HASH_ACTIVE + 2) * sizeof (active *)))) {
X		do_log ("Can't alloc for active hashtable\n");
X		return (-1);
X	}
X	memset (hashact, '\0', HASH_ACTIVE * sizeof (active *));
X# endif		/* HASH_SEARCH */
X	act = NULL;
X	if ((fd = open (ACTIVE_FILE, S_IREAD)) < 0) {
X		do_log ("Can't open %s\n", ACTIVE_FILE);
X		return (-1);
X	}
X	pos = 0;
X	catlines = TRUE;
X	while (buf = readbuf (fd, & n)) {
X		buf[n-1] = '\0';
X		if ((n == 1) || (buf[0] == '#')) {
X			pos += n;
X			continue;
X		}
X		if (!(tmp = (active *) malloc (sizeof (active)))) {
X			close (fd);
X			do_log ("Can't alloc memory in read_active()\n");
X			return (-1);
X		}
X		sav = buf;
X		ptr = skipc (sav, '\0');
X		tmp->changed = FALSE;
X		tmp->pos = pos + strlen (sav) + 1;
X		pos += n;
X		if (!(tmp->grp = strdup (sav))) {
X			close (fd);
X			do_log ("Can't alloc memory in read_active()\n");
X			return (-1);
X		}
X		sav = ptr;
X		ptr = skipc (sav, '\0');
X		tmp->high = atoi (sav);
X		sav = ptr;
X		ptr = skipc (sav, '\0');
X		tmp->low = atoi (sav);
X		sav = ptr;
X		ptr = skipc (sav, '\0');
X		tmp->aflag[0] = sav[0];
X		tmp->aflag[1] = (sav[0] && sav[1]) ? sav[1] : M_USE;
X
X		if (is8digit (*ptr)) {
X			sav = ptr;
X			ptr = skipc (sav, '\0');
X			tmp -> kblimit = atoi (sav);
X		} else
X			tmp -> kblimit = -1;
X
X		if (tmp->aflag[0] == M_MOD) {
X			if ((n = getargs (ptr, &arg)) >= 0) {
X				if (tmp->moderator = (char **) malloc (sizeof (char *) * (n + 2))) {
X					for (t=0;t<n;++t)
X						if (!(tmp->moderator[t] = strdup (arg[t]))) {
X							close (fd);
X							do_log ("Can't alloc memory in read_active()\n");
X							return (-1);
X						}
X					tmp->moderator[t] = NULL;
X				} else {
X					close (fd);
X					do_log ("Can't alloc memory in read_active()\n");
X					return (-1);
X				}
X				free ((char *) arg);
X			} else {
X				close (fd);
X				do_log ("Can't alloc memory in read_active()\n");
X				return (-1);
X			}
X		} else
X			tmp->moderator = NULL;
X# ifdef		HASH_SEARCH
X		tmp -> id = calc_hash (tmp -> grp, TRUE);
X		t = tmp -> id % HASH_ACTIVE;
X		tmp -> hnext = hashact[t];
X		hashact[t] = tmp;
X# endif		/* HASH_SEARCH */
X		tmp->next = NULL;
X		if (!act)
X			hact = tmp;
X		else
X			act->next = tmp;
X		act = tmp;
X	}
X	catlines = FALSE;
X	close (fd);
X	return (0);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/retr.c' ; then
  echo 'File INEWS/retr.c already exists, overwriting it'
  del 'INEWS/retr.c'
fi
echo Extracting \"'INEWS/retr.c'\"
sed "s/^X//" >'INEWS/retr.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	retr.c_v $
X * Revision 1.1  91/02/03  15:34:13  ud
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: retr.c_v 1.1 91/02/03 15:34:13 ud Exp $";
X# endif		LINT
X# include	<time.h>
X# include	"inews.h"
X
Xextern char	*index ();
X
Xvoid
Xretreive_message_id (msgid)
Xcharc *msgid;
X{
X	charc		*cur, *tmp;
X	char		*fn, *ptr;
X	time_t		tim;
X	struct tm	*tt;
X
X	if (do_init (FALSE) < 0)
X		exit (_errmsg (1, "Can't setup system.\n"));
X	tmp = msgid;
X	while (tmp) {
X		if (fn = exists_message_id (tmp->text, &tim)) {
X			if (ptr = index (fn, ' '))
X				*ptr = '\0';
X			printf ("+%s\t%s/%s\t%ld", tmp->text, newsdir, fn, tim);
X			if (tt = gmtime (&tim))
X				printf ("\t%04d/%02d/%02d %02d:%02d\n",
X					tt->tm_year + 1900,
X					tt->tm_mon + 1,
X					tt->tm_mday,
X					tt->tm_hour,
X					tt->tm_min);
X			else
X				printf ("\t0000/00/00 00:00\n");
X			free (fn);
X		} else
X			printf ("-%s\n", tmp->text);
X		cur = tmp->next;
X		free (tmp->text);
X		free ((char *) tmp);
X		tmp = cur;
X	}
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/rhead.c' ; then
  echo 'File INEWS/rhead.c already exists, overwriting it'
  del 'INEWS/rhead.c'
fi
echo Extracting \"'INEWS/rhead.c'\"
sed "s/^X//" >'INEWS/rhead.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	rhead.c_v $
X * Revision 1.3  91/09/11  18:13:43  ud
X * Moved del_obsolete_header to wgrp.c
X * 
X * Revision 1.2  91/05/22  13:05:15  ud
X * - Added 8 bit support
X * - Added in memory features
X * - Added Supersedes: header
X * 
X * Revision 1.1  90/08/31  15:35:17  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: rhead.c_v 1.3 91/09/11 18:13:43 ud Exp $";
X# endif		LINT
X# include	<c8type.h>
X# include	<time.h>
X# include	<modes.h>
X# include	"inews.h"
X
Xextern char	*index ();
Xextern char	*malloc ();
Xextern char	*rindex ();
Xextern char	*strdup ();
X
Xint
Xread_in_body (fd, fill, firstline, readon)
Xregister int fd;
Xregister char *fill;
Xchar *firstline;
Xint readon;
X{
X	int		fillen;
X	register char	*buf;
X	int		n;
X	register int	fdo;
X
X	if (fill)
X		fillen = strlen (fill);
X	lines = 0;
X
X# ifndef	IN_MEMORY
X	if ((fdo = create (newstmp, S_IWRITE, 03)) < 0) {
X		do_log ("Can't create %s\n", newstmp);
X		return (-1);
X	}
X# endif		/* IN_MEMORY */
X
X	if (readon) {
X		if (firstline && *firstline) {
X# ifndef	IN_MEMORY
X			write (fdo, firstline, strlen (firstline));
X# else		/* IN_MEMORY */
X			add_list (&newstmp, firstline, strlen (firstline));
X# endif		/* IN_MEMORY */
X			++lines;
X			artsize += strlen (firstline);
X		}
X		conv_it = TRUE;
X		while (buf = readbuf (fd, & n)) {
X			++lines;
X			artsize += n + 1;
X# ifndef	IN_MEMORY
X			if (fill)
X				write (fdo, fill, fillen);
X			write (fdo, buf, n);
X# else		/* IN_MEMORY */
X			if (fill)
X				add_list (&newstmp, fill, fillen);
X			add_list (&newstmp, buf, n);
X# endif		/* IN_MEMORY */
X		}
X		conv_it = FALSE;
X	}
X# ifndef	IN_MEMORY
X	close (fdo);
X# endif		/* IN_MEMORY */
X	return (0);
X}
X
Xint
Xread_in_header (fd, fill, read_body)
Xint fd;
Xchar *fill;
Xint read_body;
X{
X	register int	t;
X	charc		*act;
X	register charc	*tmp;
X	register char	*buf;
X	register char	*ptr;
X	int		n;
X	
X	head = NULL;
X	act = NULL;
X	conv_it = TRUE;
X	while (buf = readbuf (fd, & n)) {
X		if (n == 1)
X			break;
X		buf[n - 1] = '\0';
X		if (is8space (buf[0]) && act) {
X			if (ptr = malloc (strlen (act->text) + strlen (buf) + 6)) {
X				strcpy (ptr, act->text);
X# ifdef		CAT_LINES
X				strcat (ptr, " ");
X				p = buf;
X				while (is8space (*p))
X					++p;
X				strcat (ptr, p);
X# else		CAT_LINES
X				strcat (ptr, "\n");
X				strcat (ptr, buf);
X# endif		CAT_LINES
X				free (act->text);
X				act->text = ptr;
X			}
X			continue;
X		}
X		if (!fill) {
X			for (t=0;hlines[t];++t)
X				if (Strnieql (buf, hlines[t] + 2, strlen (hlines[t] + 2)))
X					break;
X			ptr= skip_field (buf);
X			if ((!ptr) || (!*ptr))
X				continue;
X		}
X		if (!(tmp = (charc *) malloc (sizeof (charc)))) {
X			do_log ("Can't alloc in read_header\n");
X			return (-1);
X		}
X		if (!(tmp->text = strdup (buf))) {
X			do_log ("Can't alloc in read_header\n");
X			return (-1);
X		}
X		tmp->next = NULL;
X		if (!head)
X			head = tmp;
X		else
X			act->next = tmp;
X		act = tmp;
X	}
X	conv_it = FALSE;
X	if (fill) {
X		handle_special (S_SUBJECT);
X		handle_special (S_REFERENCES);
X		handle_special (S_FOLLOWUP_TO);
X		handle_special (S_TO);
X		if (buf = malloc (512)) {
X			if (tmp = get_header_line (H_MESSAGE_ID)) {
X				ptr = skip_field (tmp->text);
X				strcpy (buf, "In ");
X				strcat (buf, ptr);
X				strcat (buf, ", ");
X			} else
X				strcpy (buf, "");
X			if (ptr = find_from (FALSE))
X				strcat (buf, ptr);
X			else
X				strcat (buf, "Someone");
X			strcat (buf, " wrote:\n");
X		}
X		delete_header (H_MESSAGE_ID);
X		clear_msgid ();
X	} else
X		buf = NULL;
X
X	for (tmp = head; tmp; tmp = tmp -> next)
X		artsize += strlen (tmp -> text);
X
X	if (read_body)
X		if (read_in_body (fd, fill, buf, n > 0) < 0) {
X			close (fd);
X			return (-1);
X		}
X	if (buf)
X		free (buf);
X	close (fd);
X	return (0);
X}
X
Xint
Xread_header (fd)
Xint fd;
X{
X	char	*tmp;
X
X	if (read_in_header (fd, NULL, TRUE) < 0)
X		return (-1);
X	if (crthd) {
X		delete_header (H_PATH);
X		delete_header (H_SENDER);
X		delete_header (H_APPROVED);
X		create_header (TRUE, FALSE);
X	}
X	handle_special (S_NEWSGROUPS);
X	handle_special (S_DISTRIBUTION);
X	handle_special (S_SUPERSEDES);
X	if (crthd && ngs && (!get_header_line (H_FOLLOWUP_TO)))
X		if (tmp = find_followup_to (ngs)) {
X			insert_header (H_FOLLOWUP_TO, tmp, FALSE);
X			free (tmp);
X		}
X	test_systems ();
X	handle_special (S_PATH);
X	handle_special (S_MESSAGE_ID);
X	if (sort_header (TRUE) < 0) {
X		do_log ("Failed in sort_header()\n");
X		return (-1);
X	}
X	check_approved ();
X	check_control ();
X	return (0);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/rsat.c' ; then
  echo 'File INEWS/rsat.c already exists, overwriting it'
  del 'INEWS/rsat.c'
fi
echo Extracting \"'INEWS/rsat.c'\"
sed "s/^X//" >'INEWS/rsat.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	rsat.c_v $
X * Revision 1.1  90/08/31  15:36:00  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: rsat.c_v 1.1 90/08/31 15:36:00 cs Exp $";
X# endif		LINT
X# include	<modes.h>
X# include	"inews.h"
X
Xextern int	os9forkc ();
X
Xextern char	**environ;
X
Xvoid
Xdo_send_article (fdi, is_ctrl)
Xint fdi;
Xint is_ctrl;
X{
X	char	buf[256];
X	char	fn[64 + sizeof (TEMPDIR)];
X	char	*arg[6];
X	int	old0;
X	int	pid, st;
X	int	n;
X	charc	*tmp;
X	int	fd;
X
X	sprintf (fn, "%s/inewscXXXXXX", TEMPDIR);
X	mktemp (fn);
X	if ((fd = create (fn, S_IREAD | S_IWRITE, 03)) < 0) {
X		do_log ("Can't create tempfile, aborted\n");
X		return;
X	}
X	tmp = head;
X	while (tmp) {
X		write (fd, tmp->text, strlen (tmp->text));
X		write (fd, "\n", 1);
X		tmp = tmp->next;
X	}
X	write (fd, "\n", 1);
X	while ((n = readln (fdi, buf, 250)) > 0)
X		write (fd, buf, n);
X	old0 = dup (0);
X	close (0);
X	lseek (fd, 0 ,0);
X	dup (fd);
X	close (fd);
X	n = 0;
X	arg[n++] = "inews";
X	if (is_ctrl)
X		arg[n++] = "-a";
X	if (verbose)
X		arg[n++] = "-v";
X	arg[n] = NULL;
X	pid = os9exec (os9forkc, arg[0], arg, environ, 0, 0, 3);
X	close (0);
X	dup (old0);
X	close (old0);
X	if (pid < 0) {
X		do_log ("Can't fork inews\n");
X		unlink (fn);
X		return;
X	}
X	while (((n = wait (&st)) != pid) && (n != -1))
X		;
X	unlink (fn);
X	if (st)
X		do_log ("`inews' returns %d\n", st);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/rsys.c' ; then
  echo 'File INEWS/rsys.c already exists, overwriting it'
  del 'INEWS/rsys.c'
fi
echo Extracting \"'INEWS/rsys.c'\"
sed "s/^X//" >'INEWS/rsys.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	rsys.c_v $
X * Revision 1.3  91/12/26  13:40:07  ud
X * Added sizelimit in activefile
X * 
X * Revision 1.2  91/05/22  13:19:11  ud
X * Allows now to include other sys file style files; so you can keep
X * a seperate sys file for each site
X * 
X * Revision 1.1  90/08/31  15:36:03  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: rsys.c_v 1.3 91/12/26 13:40:07 ud Exp $";
X# endif		LINT
X# include	<c8type.h>
X# include	<modes.h>
X# include	"inews.h"
X
X/*
X *	Maximum of indent levels for Sys-File
X */
X# define	MAX_FDS		10
X
Xextern char	*index ();
Xextern char	*malloc ();
Xextern char	*strdup ();
X
Xint
Xread_sys ()
X{
X	register char	*ptr;
X	register char	*p;
X	register int	t;
X	sys		*act, *tmp;
X	int		fds[MAX_FDS + 2];
X	int		fdp;
X	int		n;
X	int		siz;
X	char		*fflags;
X	char		*buf, *sav;
X	char		*store;
X	char		*rbuf;
X	char		**arg;
X
X	hsys = NULL;
X	act = NULL;
X	if (! (rbuf = malloc (512))) {
X		do_log ("Failed alloc memory in read_sys\n");
X		return (-1);
X	}
X	if ((fds[0] = open (SYS_FILE, S_IREAD)) < 0) {
X		do_log ("Can't open %s\n", SYS_FILE);
X		return (-1);
X	}
X	fdp = 0;
X	catlines = TRUE;
X	while (fdp >= 0) {
X		while (buf = readbuf (fds[fdp], & n)) {
X			buf[n-1] = '\0';
X			if ((n == 1) || (buf[0] == '#'))
X				continue;
X			if (buf[0] == ':') {
X				if (fdp < MAX_FDS)
X					if ((fds[fdp + 1] = open (buf + 1, S_IREAD)) != -1)
X						++fdp;
X				continue;
X			}
X			if (!(tmp = (sys *) malloc (sizeof (sys)))) {
X				while (fdp >= 0)
X					close (fds[fdp--]);
X				do_log ("Failed alloc memory in read_sys\n");
X				return (-1);
X			}
X			tmp->fwd = FALSE;
X			sav = buf;
X			ptr = skipc (sav, ':');
X			if (fflags = index (sav, '>')) {
X				*fflags++ = '\0';
X				while (is8space (*fflags))
X					++fflags;
X				tmp -> fflags = strdup (fflags);
X			} else
X				tmp -> fflags = NULL;
X			if (p = index (sav, '/')) {
X				*p++ = '\0';
X				store = p;
X				siz = 4;
X				while (p = index (p, ',')) {
X					++p;
X					++siz;
X				}
X				if (tmp->wsites = (char **) malloc (siz * (sizeof (char *)))) {
X					p = store;
X					n = 0;
X					while (p) {
X						store = p;
X						if (p = index (p, ','))
X							*p++ = '\0';
X						if (!(tmp->wsites[n++] = strdup (store)))
X							break;
X					}
X					tmp->wsites[n] = NULL;
X				}
X			} else
X				tmp->wsites = NULL;
X			if (!(tmp->site = strdup (sav))) {
X				while (fdp >= 0)
X					close (fds[fdp--]);
X				do_log ("Failed alloc memory in read_sys\n");
X				return (-1);
X			}
X			sav = ptr;
X			ptr = skipc (sav, ':');
X			if ((n = getargs (sav, &arg)) < 0) {
X				while (fdp >= 0)
X					close (fds[fdp--]);
X				do_log ("Failed alloc memory in read_sys\n");
X				return (-1);
X			}
X			if (!(tmp->grps = (regexp **) malloc (sizeof (regexp *) * (n + 3)))) {
X				while (fdp >= 0)
X					close (fds[fdp--]);
X				do_log ("Failed alloc memory in read_sys\n");
X				return (-1);
X			}
X			if (!(tmp->inv = (int *) malloc (sizeof (int) * (n + 3)))) {
X				while (fdp >= 0)
X					close (fds[fdp--]);
X				do_log ("Failed alloc memory in read_sys\n");
X				return (-1);
X			}
X			if (n > 0) {
X				for (t=0;t<n;++t) {
X					p = arg[t];
X					while (*p) {
X						*p = to8lower (*p);
X						++p;
X					}
X					p = arg[t];
X					if (*p == '!') {
X						++p;
X						tmp->inv[t] = TRUE;
X					} else
X						tmp->inv[t] = FALSE;
X					if (p[0] == '^')
X						strcpy (rbuf, p);
X					else {
X						strcpy (rbuf + 1, p);
X						rbuf[0] = '^';
X					}
X					if (rbuf[strlen (rbuf) - 1] != '$')
X						strcat (rbuf, "$");
X					if (!(tmp->grps[t] = regcomp (rbuf))) {
X						while (fdp >= 0)
X							close (fds[fdp--]);
X						do_log ("Failed alloc memory in read_sys\n");
X						return (-1);
X					}
X				}
X				tmp->grps[t] = NULL;
X				free ((char *) arg);
X			} else
X				n = 0;
X# ifdef		DEFAULT_CTRL
X			tmp->grps[n] = regcomp (NG_CONTROL);
X			tmp->inv[n] = FALSE;
X			tmp->grps[n+1] = NULL;
X# else		DEFAULT_CTRL
X			tmp->grps[n] = NULL;
X# endif		DEFAULT_CTRL
X			sav = ptr;
X			ptr = skipc (sav, ':');
X			if (!*sav)
X				tmp->dist = NULL;
X			if (*sav) {
X				if ((n = getargs (sav, &arg)) < 0) {
X					while (fdp >= 0)
X						close (fds[fdp--]);
X					do_log ("Failed alloc memory in read_sys\n");
X					return (-1);
X				}
X			} else
X				n = 0;
X			if (!(tmp->dist = (char **) malloc (sizeof (char *) * (n + 3)))) {
X				while (fdp >= 0)
X					close (fds[fdp--]);
X				do_log ("Failed alloc memory in read_sys\n");
X				return (-1);
X			}
X			if (n > 0) {
X				for (t=0;t<n;++t) {
X					p = arg[t];
X					while (*p) {
X						*p = to8lower (*p);
X						++p;
X					}
X					if (!(tmp->dist[t] = strdup (arg[t]))) {
X						while (fdp >= 0)
X							close (fds[fdp--]);
X						do_log ("Failed alloc memory in read_sys\n");
X						return (-1);
X					}
X				}
X				tmp->dist[t] = NULL;
X				free ((char *) arg);
X			}
X# ifdef		ADD_SITENAME_AS_DISTRIBUTION
X			tmp->dist[n++] = strdup (tmp->site);
X# endif		/* ADD_SITENAME_AS_DISTRIBUTION */
X			tmp->dist[n] = NULL;
X			if (*ptr) {
X				if (!(tmp->cmd = strdup (ptr))) {
X					while (fdp >= 0)
X						close (fds[fdp--]);
X					do_log ("Failed alloc memory in read_sys\n");
X					return (-1);
X				}
X			} else
X				tmp->cmd = NULL;
X			tmp->next = NULL;
X			if (!act)
X				hsys = tmp;
X			else
X				act->next = tmp;
X			act = tmp;
X		}
X		close (fds[fdp--]);
X	}
X	catlines = FALSE;
X	free (rbuf);
X	return (0);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/sect.c' ; then
  echo 'File INEWS/sect.c already exists, overwriting it'
  del 'INEWS/sect.c'
fi
echo Extracting \"'INEWS/sect.c'\"
sed "s/^X//" >'INEWS/sect.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	sect.c_v $
X * Revision 1.2  91/05/22  13:06:16  ud
X * Abstracted news owner (from static to variable)
X * 
X * Revision 1.1  90/08/31  15:36:08  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: sect.c_v 1.2 91/05/22 13:06:16 ud Exp $";
X# endif		LINT
X# include	<time.h>
X# include	<pwd.h>
X# include	"inews.h"
X
Xextern char	*getenv ();
Xextern char	*malloc ();
Xextern char	*strdup ();
X
Xvoid
Xsend_control (msg, opts, pars)
Xchar *msg;
Xchar *opts;
Xchar *pars;
X{
X	register int	t;
X	time_t		tim;
X	char		*line;
X	char		*cont;
X	charc		*act;
X	charc		*tmp;
X	charc		*htmp, *t2;
X	int		siz;
X	char		*ptr;
X	char		*sender, *fullname;
X	char		*ffname;
X	struct passwd	*pwd;
X	struct gecos	*gc;
X
X	sender = news_owner;
X	fullname = NULL;
X	setpwent ();
X	if (pwd = getpwuid (getuid () & 0xffff))
X		if ((gc = getgecos (pwd->pw_gecos)) && gc->fullname && *gc->fullname)
X			fullname = strdup (gc->fullname);
X	ffname = NULL;
X	setpwent ();
X	if (pwd = getpwnam (user))
X		if ((gc = getgecos (pwd->pw_gecos)) && gc->fullname && *gc->fullname)
X			ffname = strdup (gc->fullname);
X	endpwent ();
X	act = NULL;
X	cont = NULL;
X	for (t=0;hlines[t];++t) {
X		line = hlines[t] + 2;
X		switch (t) {
X			case H_PATH:
X				cont = strdup (news_owner);
X				break;
X			case H_FROM:
X				if (cont = malloc (strlen (fhost) + strlen (user) + (ffname ? strlen (ffname) + 6 : 0) + 10)) {
X					sprintf (cont, "%s@%s", user, fhost);
X					if (ffname) {
X						strcat (cont, " (");
X						strcat (cont, ffname);
X						strcat (cont, ")");
X					}
X				}
X				break;
X			case H_SENDER:
X			case H_APPROVED:
X				if ((!isadm) && (t == H_SENDER)) {
X					if (cont = malloc (strlen (fhost) + strlen (user) + 6))
X						sprintf (cont, "%s@%s", user, fhost);
X					break;
X				}
X				if (cont = malloc (strlen (fhost) + strlen (sender) + (fullname ? strlen (fullname) + 6 : 0) + 10)) {
X					sprintf (cont, "%s@%s", sender, fhost);
X					if (fullname) {
X						strcat (cont, " (");
X						strcat (cont, fullname);
X						strcat (cont, ")");
X					}
X				}
X				break;
X			case H_NEWSGROUPS:
X			case H_DISTRIBUTION:
X				if (t == H_NEWSGROUPS) {
X# ifdef		ALWAYS_CONTROL
X					cont = strdup (NG_CONTROL);
X# endif		/* ALWAYS_CONTROL */
X					if (! (htmp = ngs)) {
X# ifndef	ALWAYS_CONTROL
X						cont = strdup (NG_CONTROL);
X# endif		/* ALWAYS_CONTROL */
X						break;
X					}
X				} else if (dists)
X					htmp = dists;
X				else
X					break;
X				siz = 0;
X				t2 = htmp;
X				while (t2) {
X					siz += strlen (t2->text) + 4;
X					if (cont && Streql (t2->text, cont)) {
X						siz = 0;
X						break;
X					}
X					t2 = t2->next;
X				}
X				if ((t == H_NEWSGROUPS) && (siz > 0) && cont)
X					if (tmp = (charc *) malloc (sizeof (charc)))
X						if (tmp->text = strdup (cont)) {
X							tmp->next = ngs;
X							ngs = tmp;
X							htmp = ngs;
X							siz += strlen (cont) + 4;
X						} else
X							free ((char *) tmp);
X				if (cont) {
X					free (cont);
X					cont = NULL;
X				}
X				if ((siz > 0) && (cont = malloc (siz + 10))) {
X					t2 = htmp;
X					strcpy (cont, "");
X					while (t2) {
X						if (t2 != htmp)
X							strcat (cont, ",");
X						strcat (cont, t2->text);
X						t2 = t2->next;
X					}
X				}
X				break;
X			case H_SUBJECT:
X			case H_CONTROL:
X				if (cont = malloc (strlen (msg) + strlen (opts) + 4 + ((pars && *pars) ? strlen (pars) + 4 : 0))) {
X					strcpy (cont, msg);
X					if (*opts) {
X						strcat (cont, " ");
X						strcat (cont, opts);
X						if (pars && *pars) {
X							strcat (cont, " ");
X							strcat (cont, pars);
X						}
X					}
X				}
X				break;
X			case H_MESSAGE_ID:
X				cont = strdup (get_msgid ());
X				break;
X			case H_DATE:
X				time (&tim);
X				cont = strdup (ntime (&tim));
X				break;
X			case H_ORGANIZATION:
X				if (ptr = getenv ("ORGANIZATION"))
X					cont = strdup (ptr);
X				else
X					cont = NULL;
X				break;
X			case H_REFERENCES:
X				if ((!isadm) && opts && *opts)
X					cont = strdup (opts);
X				break;
X			case H_FOLLOWUP_TO:
X			case H_KEYWORDS:
X			case H_SUMMARY:
X			case H_EXPIRES:
X			case H_LINES:
X			case H_XREF:
X			default:
X				cont = NULL;
X		}
X		if (cont) {
X			if (!(tmp = (charc *) malloc (sizeof (charc))))
X				do_exit (_errmsg (1, "Can't alloc in send_control\n"));
X			if (!(tmp->text = malloc (strlen (cont) + strlen (line) + 6)))
X				do_exit (_errmsg (1, "Can't alloc in send_control\n"));
X			strcpy (tmp->text, line);
X			strcat (tmp->text, " ");
X			strcat (tmp->text, cont);
X			free (cont);
X			cont = NULL;
X			tmp->next = NULL;
X			if (act)
X				act->next = tmp;
X			else
X				head = tmp;
X			act = tmp;
X		}
X	}
X	do_send_article (0, TRUE);
X	if (fullname)
X		free (fullname);
X	if (ffname)
X		free (ffname);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/shead.c' ; then
  echo 'File INEWS/shead.c already exists, overwriting it'
  del 'INEWS/shead.c'
fi
echo Extracting \"'INEWS/shead.c'\"
sed "s/^X//" >'INEWS/shead.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	shead.c_v $
X * Revision 1.1  90/08/31  15:36:13  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: shead.c_v 1.1 90/08/31 15:36:13 cs Exp $";
X# endif		LINT
X# include	"inews.h"
X
Xint
Xsort_header (make_missing)
Xregister int make_missing;
X{
X	register int	t;
X	register charc	*act, *tmp, *t2;
X
X	act = head;
X	for (t=0;hlines[t];++t) {
X		tmp = act;
X		while (tmp)
X			if (Strnieql (tmp->text, hlines[t] + 2, strlen (hlines[t] + 2))) {
X				if (tmp != act) {
X					t2 = act;
X					while (t2->next)
X						if (t2->next == tmp)
X							break;
X						else
X							t2 = t2->next;
X					if (t2->next == tmp) {
X						t2->next = tmp->next;
X						tmp->next = act;
X						if (head == act)
X							head = tmp;
X						else {
X							t2 = head;
X							while (t2->next)
X								if (t2->next == act)
X									break;
X								else
X									t2 = t2->next;
X							if (t2->next == act) {
X								t2->next = tmp;
X								tmp->next = act;
X							}
X						}
X					}
X				} else
X					act = act->next;
X				break;
X			} else
X				tmp = tmp->next;
X		if ((!tmp) && (hlines[t][0] == '0') && make_missing) {
X			if (tmp = make_head (t))
X				if (act == head) {
X					head = tmp;
X					tmp->next = act;
X				} else {
X					t2 = head;
X					while (t2->next)
X						if (t2->next == act)
X							break;
X						else
X							t2 = t2->next;
X					if (t2->next == act) {
X						tmp->next = act;
X						t2->next = tmp;
X					}
X				}
X		}
X	}
X	return (0);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/sinfo.c' ; then
  echo 'File INEWS/sinfo.c already exists, overwriting it'
  del 'INEWS/sinfo.c'
fi
echo Extracting \"'INEWS/sinfo.c'\"
sed "s/^X//" >'INEWS/sinfo.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	sinfo.c_v $
X * Revision 1.2  91/05/22  13:25:33  ud
X * Get news owner from password file
X * Determinate full host name from an own sysinfo entry (if available)
X * Do better locking/unlocking for lck.inews
X * 
X * Revision 1.1  90/08/31  15:36:17  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: sinfo.c_v 1.2 91/05/22 13:25:33 ud Exp $";
X# endif		LINT
X# include	<stdio.h>
X# include	<pwd.h>
X# include	<time.h>
X# include	"inews.h"
X
Xextern char	*cuserid ();
Xextern char	*getenv ();
Xextern char	*getlogin ();
Xextern char	*malloc ();
Xextern char	*strdup ();
X
Xstatic int	islocked = FALSE;
Xstatic FILE	*logp = NULL;
Xstatic time_t	starttim, endtim;
X
Xvoid
Xzero_out ()
X{
X	struct passwd	*pw;
X
X	ngs = NULL;
X	dists = NULL;
X	head = NULL;
X	hsys = NULL;
X	hact = NULL;
X# ifdef		HASH_SEARCH
X	hashact = NULL;
X# endif		/* HASH_SEARCH */
X	artsize = 0;
X	act_rewrite = FALSE;
X
X	block_forward = FALSE;
X
X	recv = NULL;
X
X	batchdir = NULL;
X	newsdir = NULL;
X	newslib = NULL;
X	newstspool = NULL;
X
X	hostname = NULL;
X	fhost = NULL;
X
X	isctrl = NULL;
X
X	catlines = FALSE;
X	verbose = FALSE;
X	logp = NULL;
X	if (!(user = getlogin ()))
X		if (!(user = getenv ("USER")))
X			if (!(user = cuserid ()))
X				user = "*unknown*";
X	user = strdup (user);
X	setpwent ();
X	if (!(home = getenv ("HOME"))) {
X		if (!(pw = getpwnam (user)))
X			home = TEMPDIR;
X		else
X			home = pw->pw_dir;
X	}
X	if (pw = getpwuid (getmuid () & 0xffff))
X		news_owner = strdup (pw->pw_name);
X	else
X		news_owner = strdup (NEWS_OWNER);
X	if (! news_owner)
X		news_owner = NEWS_OWNER;
X	endpwent ();
X	home = strdup (home);
X	local_term = NULL;
X}
X
Xstatic void
Xopen_log ()
X{
X	if (access (LOG_FILE, 0) != -1)
X		logp = fopen (LOG_FILE, "a");
X}
X
Xstatic void
Xclose_log ()
X{
X	if (logp) {
X		fclose (logp);
X		logp = NULL;
X	}
X}
X
Xint
Xdo_init (lockit)
Xint lockit;
X{
X	char	*buf;
X	int	t;
X	int	slp;
X
X	if (!(buf = malloc (512)))
X		return (-1);
X	if (!info_str (BATCHDIR, buf, 500))
X		batchdir = strdup (NEWS_BATCH);
X	else
X		batchdir = strdup (buf);
X	if (!info_str (NEWSDIR, buf, 500))
X		newsdir = strdup (NEWS_DIR);
X	else
X		newsdir = strdup (buf);
X	if (!info_str (LIBDIR, buf, 500))
X		newslib = strdup (NEWS_LIB);
X	else
X		newslib = strdup (buf);
X
X	if (! info_str (TSPOOLDIR, buf, 500))
X		newstspool = strdup (MNEWS_TSPOOLDIR);
X	else
X		newstspool = strdup (buf);
X
X	if (!gethostname (buf, 500))
X		return (-1);
X	else
X		if (!(hostname = strdup (buf)))
X			return (-1);
X
X	if (! getfullhostname (buf, 500)) {
X		if (info_str ("hostdomain", buf, 500)) {
X			if (fhost = malloc (strlen (hostname) + strlen (buf) + 3))
X				sprintf (fhost, "%s.%s", hostname, buf);
X		} else
X			fhost = strdup (hostname);
X	} else
X		fhost = strdup (buf);
X
X	/*
X	 *	Test, if an allocation failed
X	 */
X	if (!(batchdir && newsdir && newslib && fhost))
X		return (-1);
X
X# ifndef	IN_MEMORY
X	/*
X	 *	Make Filename for news body
X	 */
X	sprintf (newstmp, "%s/inewsXXXXXX", TEMPDIR);
X	mktemp (newstmp);
X# else		/* IN_MEMORY */
X	newstmp = NULL;
X# endif		/* IN_MEMORY */
X
X	if (chdir (newslib) < 0)
X		return (-1);
X
X	/*
X	 *	Try to lock
X	 */
X	if (lockit) {
X# ifndef	EVENT_LOCK
X		if (LOCK_TIMEOUT > 0) {
X			t = LOCK_TIMEOUT;
X			while (t-- > 0)
X				if (info_is_locked (NEWS_LOCK))
X					sleep (1);
X				else
X					break;
X		} else
X			t = info_is_locked (NEWS_LOCK) ? -1 : 1;
X		if ((t <= 0) || (info_lock (NEWS_LOCK, -1) < 0))
X			return (-2);
X# else		/* EVENT_LOCK */
X		if (do_lock (NEWS_LOCK, LOCK_TIMEOUT) < 0)
X			return (-2);
X# endif		/* EVENT_LOCK */
X		islocked = TRUE;
X		open_log ();
X	}
X	time (&starttim);
X	return (0);
X}
X
Xint
Xnlock ()
X{
X	int	err;
X
X	if (! islocked) {
X# ifndef	EVENT_LOCK
X		err = info_lock (NEWS_LOCK, -1);
X# else		/* EVENT_LOCK */
X		err = do_lock (NEWS_LOCK, LOCK_TIMEOUT);
X# endif		/* EVENT_LOCK */
X		if (err != -1) {
X			islocked = TRUE;
X			open_log ();
X		}
X	}
X	return (islocked ? 0 : -1);
X}
X
Xvoid
Xnunlock ()
X{
X	if (islocked) {
X# ifndef	EVENT_LOCK
X		info_unlock (NEWS_LOCK);
X# else		/* EVENT_LOCK */
X		do_unlock (NEWS_LOCK);
X# endif		/* EVENT_LOCK */
X		islocked = FALSE;
X		close_log ();
X		respool (TRUE);
X	}
X}
X
Xvoid
Xdo_term ()
X{
X	charc		*tmp;
X	struct tm	*tt;
X
X	if (local_term)
X		(*local_term) ();
X# ifndef	IN_MEMORY
X	unlink (newstmp);
X# else		/* IN_MEMORY */
X	free_list (newstmp);
X	newstmp = NULL;
X# endif		/* IN_MEMORY */
X	time (&endtim);
X	if (tt = localtime (&starttim))
X		do_log ("%02d.%02d %02d:%02d ",
X			tt->tm_mday,
X			tt->tm_mon + 1,
X			tt->tm_hour,
X			tt->tm_min);
X	do_log ("[%d]", endtim - starttim);
X	for (tmp = ngs; tmp; tmp = tmp->next)
X		do_log (" %s", tmp->text);
X	do_log ("\n");
X	close_log ();
X	if (islocked)
X		nunlock ();
X	else
X		close_log ();
X# ifdef		EVENT_LOCK
X	/* Sure is sure ... */
X	do_unlock ("*");
X# endif		/* EVENT_LOCK */
X}
X
Xvoid
Xdo_exit (n)
Xint n;
X{
X	do_term ();
X	exit (n);
X}
X
Xvoid
Xdo_log (fmt, a, b, c, d, e, f)
Xchar *fmt, *a, *b, *c, *d, *e, *f;
X{
X	if (logp)
X		fprintf (logp, fmt, a, b, c, d, e, f);
X	if (verbose)
X		fprintf (stderr, fmt, a, b, c, d, e, f);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/sit.c' ; then
  echo 'File INEWS/sit.c already exists, overwriting it'
  del 'INEWS/sit.c'
fi
echo Extracting \"'INEWS/sit.c'\"
sed "s/^X//" >'INEWS/sit.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	sit.c_v $
X * Revision 1.1  90/08/31  15:36:22  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: sit.c_v 1.1 90/08/31 15:36:22 cs Exp $";
X# endif		LINT
X# include	<stdio.h>
X# include	<modes.h>
X# include	"inews.h"
X
Xextern char	*malloc ();
X
Xvoid
Xsave_it (st)
Xsys *st;
X{
X	char		*dir;
X	char		*buf;
X	char		*fn;
X	FILE		*fp, *fpi;
X	int		fd;
X	int		id;
X
X	dir = st->cmd + 1;
X	if (access (dir, S_IFDIR) < 0) {
X		do_log ("FATAL: %s is no directory in save_it().\n", dir);
X		return;
X	}
X	if (!(fn = malloc (strlen (dir) + 64))) {
X		do_log ("FATAL: can't alloc in save_it()\n");
X		return;
X	}
X	sprintf (fn, "%s/.seq", dir);
X	if ((fd = open (fn, S_IREAD | S_IWRITE)) < 0) {
X		fd = create (fn, S_IWRITE, 03);
X		id = 1;
X	} else {
X		if (read (fd, &id, sizeof (int)) == sizeof (int))
X			++id;
X		lseek (fd, 0, 0);
X	}
X	if (fd != -1) {
X		write (fd, &id, sizeof (int));
X		close (fd);
X	}
X	sprintf (fn, "%s/%06d", dir, id);
X	if (fp = fopen (fn, "w")) {
X		if (buf = malloc (520)) {
X			sprintf (buf, "%s/%s", newsdir, realfile);
X			if (fpi = fopen (buf, "r")) {
X				while (fgets (buf, 512, fpi))
X					fputs (buf, fp);
X				fclose (fpi);
X			} else
X				do_log ("Can't open %s for reading.\n", buf);
X			free (buf);
X		} else
X			do_log ("Can't alloc copy-buffer.\n");
X		fclose (fp);
X	} else
X		do_log ("Can't open output-file %s.\n", fn);
X	free (fn);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/spch.c' ; then
  echo 'File INEWS/spch.c already exists, overwriting it'
  del 'INEWS/spch.c'
fi
echo Extracting \"'INEWS/spch.c'\"
sed "s/^X//" >'INEWS/spch.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	spch.c_v $
X * Revision 1.2  91/05/22  13:24:52  ud
X * Added Supersedes: support
X * 
X * Revision 1.1  90/08/31  15:36:25  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: spch.c_v 1.2 91/05/22 13:24:52 ud Exp $";
X# endif		LINT
X# include	<c8type.h>
X# include	"inews.h"
X
Xextern char	*index ();
Xextern char	*malloc ();
X
Xvoid
Xspecial_header (hd, ind)
Xcharc *hd;
Xint ind;
X{
X	register char	*p1, *p2;
X	char		*tp;
X	char		*buf;
X	charc		*tmp;
X	int		n;
X
X	switch (ind) {
X		case S_PATH:
X			p1 = skip_field (hd->text);
X# ifdef		USE_FULLHOST
X			n = strlen (fhost);
X			if ((n <= strlen (p1)) && Strneql (p1, fhost, n) && (! isalnum (p1[n])) && (p1[n] != '.'))
X				break;
X# endif		/* USE_FULLHOST */
X# ifndef	USE_ONLY_FULLHOST
X			n = strlen (hostname);
X			if ((n <= strlen (p1)) && Strneql (p1, hostname, n) && (! isalnum (p1[n])) && (p1[n] != '.'))
X				break;
X# endif		/* USE_ONLY_FULLHOST */
X			if (!(buf = malloc (strlen (hd->text) + strlen (hostname) + strlen (fhost) + 32)))
X				do_exit (_errmsg (1, "Can't alloc memory when expanding Path: field.\n"));
X			p2 = buf;
X			p1 = hd->text;
X			while (*p1 && (*p1 != ':'))
X				*p2++ = *p1++;
X			if (*p1) {
X				*p2++ = *p1++;
X				*p2++ = ' ';
X				while (is8space (*p1))
X					++p1;
X# ifndef	USE_ONLY_FULLHOST
X				tp = hostname;
X				while (*tp)
X					*p2++ = *tp++;
X				*p2++ = '!';
X# endif		USE_ONLY_FULLHOST
X# ifdef		USE_FULLHOST
X				tp = fhost;
X				while (*tp)
X					*p2++ = *tp++;
X				*p2++ = '!';
X# endif		USE_FULLHOST
X				while (*p1)
X					*p2++ = *p1++;
X				*p2 = '\0';
X				free (hd->text);
X				hd->text = buf;
X			} else {
X				do_log ("Internal error when expanding Path: field\n");
X				do_exit (1);
X			}
X			break;
X		case S_NEWSGROUPS:
X			p1 = skip_field (hd->text);
X			ngs = split_fields (p1, TRUE);
X			if (alias_newsgroups ()) {
X				if (!ngs) {
X					do_log ("No more Newsgroups: after alias, aborted.\n");
X					do_exit (0);
X				}
X				if (p1 = catcharc (ngs, ",")) {
X					insert_header (H_NEWSGROUPS, p1, TRUE);
X					free (p1);
X				}
X			}
X			break;
X		case S_SUBJECT:
X			p1 = skip_field (hd->text);
X			if (Strnicmp (p1, "re: ", 4))
X				if (p2 = malloc (strlen (hd->text) + 10)) {
X					sprintf (p2, "%s Re: %s", hlines[H_SUBJECT] + 2, p1);
X					free (hd->text);
X					hd->text = p2;
X				}
X			break;
X		case S_FOLLOWUP_TO:
X			p1 = skip_field (hd->text);
X			if (*p1) {
X				free_field (ngs);
X				ngs = NULL;
X				ngs = split_fields (p1, TRUE);
X				insert_header (H_NEWSGROUPS, p1, TRUE);
X				delete_header (H_FOLLOWUP_TO);
X			}
X			break;
X		case S_MESSAGE_ID:
X			p1 = skip_field (hd->text);
X			set_msgid (p1);
X			check_message_id (p1);
X			break;
X		case S_DISTRIBUTION:
X			p1 = skip_field (hd->text);
X			dists = split_fields (p1, TRUE);
X# ifdef		NO_DOT_IN_DIST
X			tmp = dists;
X			while (tmp) {
X				if (p1 = index (tmp->text, '.'))
X					*p1 = '\0';
X				tmp = tmp->next;
X			}
X# endif		NO_DOT_IN_DIST
X			break;
X		case S_REFERENCES:
X			if (tmp = get_header_line (H_MESSAGE_ID)) {
X				p1 = skip_field (tmp->text);
X				if (p2 = malloc (strlen (p1) + strlen (hd->text) + 6)) {
X					sprintf (p2, "%s %s", hd->text, p1);
X					free (hd->text);
X					hd->text = p2;
X				}
X			}
X			break;
X		case S_SUPERSEDES:
X			if (tmp = get_header_line (H_SUPERSEDES)) {
X				p1 = skip_field (tmp->text);
X				delete_msg (p1);
X			}
X			break;
X	}
X}
X
Xvoid
Xhandle_special (id)
Xregister int id;
X{
X	register charc	*tmp;
X	register int	found;
X	register charc	*htmp;
X	register char	*ptr;
X
X	if ((id < 0) || (id > SPECIAL_MAX))
X		return;
X	tmp = head;
X	found = FALSE;
X	while (tmp) {
X		if (Strnieql (tmp->text, slines[id], strlen (slines[id]))) {
X			special_header (tmp, id);
X			found = TRUE;
X		}
X		tmp = tmp->next;
X	}
X	if (!found)
X		switch (id) {
X			case S_TO:
X				if (!recv) {
X					if (!(ptr = find_address ()))
X						break;
X					if (recv = (charc *) malloc (sizeof (charc)))
X						if (recv->text = malloc (strlen (ptr) + strlen (hlines[H_TO] + 2) + 6)) {
X							sprintf (recv->text, "%s %s", hlines[H_TO] + 2, ptr);
X							recv->next = NULL;
X						} else {
X							free ((char *) recv);
X							recv = NULL;
X						}
X					free (ptr);
X				}
X				break;
X			case S_REFERENCES:
X				if (!(tmp = (charc *) malloc (sizeof (charc))))
X					break;
X				if (!(htmp = get_header_line (H_MESSAGE_ID))) {
X					free ((char *) tmp);
X					break;
X				}
X				ptr = skip_field (htmp->text);
X				insert_header (H_REFERENCES, ptr, TRUE);
X				break;
X			case S_DISTRIBUTION:
X				if ((! dists) && (crthd || ins_dist))
X					make_default_dists ();
X				if (dists && (dists->next || Stricmp (dists->text, DST_WORLD)))
X					if (ptr = catcharc (dists, ",")) {
X						insert_header (H_DISTRIBUTION, ptr, TRUE);
X						free (ptr);
X					}
X				break;
X		}
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/store.c' ; then
  echo 'File INEWS/store.c already exists, overwriting it'
  del 'INEWS/store.c'
fi
echo Extracting \"'INEWS/store.c'\"
sed "s/^X//" >'INEWS/store.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	store.c_v $
X * Revision 1.1  91/05/22  13:36:49  ud
X * Initial revision
X * 
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: store.c_v 1.1 91/05/22 13:36:49 ud Exp $";
X# endif		LINT
X# include	<stdio.h>
X# include	<ctype.h>
X# include	<errno.h>
X# include	<modes.h>
X# include	<dir.h>
X# include	"inews.h"
X
X# define	SEQ		".seq"
X# define	TNEWS_AVAIL	"/dd/SYS/.TNews_Available"
X
Xextern char	*_prgname ();
Xextern char	*malloc ();
Xextern char	*strdup ();
Xextern FILE	*xpopen ();
X
Xstatic int
Xenter_tspool ()
X{
X	if (! newstspool) {
X		do_log ("No TSPOOL found.\n");
X		return (-1);
X	}
X	if (chdir (newstspool) < 0) {
X		do_log ("Can't chdir to %s.\n", newstspool);
X		return (-1);
X	}
X	return (0);
X}
X
Xint
Xdo_store ()
X{
X	char	*buf;
X	int	n;
X	int	fd;
X	int	tout;
X
X	if (enter_tspool () < 0)
X		return (-1);
X	if (! (buf = malloc (256))) {
X		do_log ("Can't alloc in do_store()\n");
X		return (-1);
X	}
X	tout = 10;
X	do {
X		if (((fd = open (SEQ, S_IREAD | S_IWRITE | S_ISHARE)) < 0) && (errno == E_PNNF)) {
X			if ((fd = create (SEQ, S_IWRITE | S_ISHARE, 03 | S_ISHARE)) != -1)
X				n = 0;
X		} else {
X			read (fd, &n, sizeof (int));
X			lseek (fd, 0, 0);
X		}
X		if (fd == -1)
X			sleep (1);
X	} while ((fd == -1) && (tout-- > 0));
X	if (fd == -1) {
X		do_log ("Can't open/create %s\n", SEQ);
X		free (buf);
X		return (-1);
X	}
X	if (++n < 0)
X		n = 0;
X	write (fd, &n, sizeof (int));
X	close (fd);
X	sprintf (buf, "%06d", n);
X	if ((fd = create (buf, S_IWRITE | S_ISIZE, 03, 4096)) != -1) {
X		if (crthd)
X			writeln (fd, " -h\n", 4);
X		else
X			writeln (fd, "\n", 1);
X		while ((n = read (0, buf, 256)) > 0)
X			if (write (fd, buf, n) != n) {
X				do_log ("Can't write to temp.file\n");
X				break;
X			}
X		close (fd);
X		if (n > 0)
X			fd = -1;
X	}
X	if (fd != -1) {
X		if ((fd = create (TNEWS_AVAIL, S_IWRITE, 03)) != -1)
X			close (fd);
X		return (0);
X	} else
X		return (-1);
X}
X
Xint
Xrespool (check)
Xint check;
X{
X	FILE		*pp;
X	DIR		*dp;
X	struct direct	*ent;
X	charc		*root, *cur, *prev, *tmp;
X	register char	*ptr;
X	char		*pgm;
X	char		*cmd;
X	char		*buf;
X	int		n;
X	int		fd;
X
X	if (check) {
X		if (access (TNEWS_AVAIL, 0) == -1)
X			return (0);
X		unlink (TNEWS_AVAIL);
X	}
X	if (enter_tspool () < 0)
X		return (-1);
X	if (! (dp = opendir ("."))) {
X		do_log ("Can't open %s\n", newstspool);
X		return (-1);
X	}
X	root = NULL;
X	prev = NULL;
X	while (ent = readdir (dp)) {
X		ptr = ent->d_name;
X		while (isdigit (*ptr))
X			++ptr;
X		if (*ptr)
X			continue;
X		if (cur = (charc *) malloc (sizeof (charc)))
X			if (cur->text = strdup (ent->d_name)) {
X				cur->nr = 0;
X				cur->next = NULL;
X				if (! prev)
X					root = cur;
X				else
X					prev->next = cur;
X				prev = cur;
X			} else
X				free ((char *) cur);
X	}
X	closedir (dp);
X	if (! root)
X		return (-1);
X	if (! (buf = malloc (256))) {
X		do_log ("Can't alloc in respool()\n");
X		return (-1);
X	}
X	if (! (pgm = _prgname ()))
X		pgm = "inews";
X	if (! (cmd = malloc (256 + strlen (pgm) + 8)))
X		return (-1);
X	for (cur = root; cur;) {
X		if ((fd = open (cur->text, S_IREAD)) < 0)
X			continue;
X		if ((n = readln (fd, buf, 256)) <= 0) {
X			close (fd);
X			continue;
X		}
X		buf[n - 1] = '\0';
X		sprintf (cmd, "%s%s", pgm, buf);
X		if (! (pp = xpopen (cmd, "w"))) {
X			close (fd);
X			continue;
X		}
X		while ((n = read (fd, buf, 256)) > 0)
X			if (fwrite (buf, sizeof (char), n, pp) != n)
X				break;
X		close (fd);
X		if (pclose (pp))
X			n = 1;
X		if (! n)
X			unlink (cur->text);
X		tmp = cur;
X 		cur = cur->next;
X 		free (tmp -> text);
X		free ((char *) tmp);
X	}
X	free (buf);
X	free (cmd);
X	return (0);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/tsys.c' ; then
  echo 'File INEWS/tsys.c already exists, overwriting it'
  del 'INEWS/tsys.c'
fi
echo Extracting \"'INEWS/tsys.c'\"
sed "s/^X//" >'INEWS/tsys.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	tsys.c_v $
X * Revision 1.2  91/09/11  18:16:52  ud
X * Moved macro is_part_of_hostname to inews.h
X * 
X * Revision 1.1  90/08/31  15:36:30  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: tsys.c_v 1.2 91/09/11 18:16:52 ud Exp $";
X# endif		LINT
X# include	<c8type.h>
X# include	<string.h>
X# include	"inews.h"
X
Xextern char	*malloc ();
Xextern char	*rindex ();
X
Xint
Xis_system_in_path (path, system)
Xregister char *path;
Xregister char *system;
X{
X	register char	*ptr;
X	register int	is_in;
X
X	is_in = FALSE;
X	if ((ptr = strstr (path, system)) && (strlen (ptr) >= strlen (system)))
X		if ((ptr == path) || ((ptr > path) && (!is_part_of_hostname (*(ptr-1))))) {
X			ptr += strlen (system);
X			if (!is_part_of_hostname (*ptr))
X				is_in = TRUE;
X		}
X	return (is_in);
X}
X
Xvoid
Xtest_systems ()
X{
X	register sys	*stmp;
X	register int	t;
X	int		found, isok;
X	charc		*ntmp;
X	charc		*htmp;
X	char		*path;
X	int		inv;
X	charc		*dtmp;
X	char		*buf, *ptr;
X	int		size;
X	
X	if (!(htmp = get_header_line (H_PATH))) {
X		do_log ("FATAL: Can't get Path: field!\n");
X		return;
X	}
X	path = skip_field (htmp->text);
X	for (ntmp = ngs, size = 0; ntmp; ntmp = ntmp->next)
X		if ((t = strlen (ntmp->text)) > size)
X			size = t;
X	if (!(buf = malloc (size + 10))) {
X		do_log ("FATAL: Can't alloc for control-check\n");
X		return;
X	}
X	stmp = hsys;
X	while (stmp) {
X		/*
X		 *	Test if System is in Path:
X		 */
X		isok = TRUE;
X		if (is_system_in_path (path, stmp->site))
X			isok = FALSE;
X		else if (stmp->wsites)
X			for (t=0;stmp->wsites[t];++t)
X				if (is_system_in_path (path, stmp->wsites[t])) {
X					isok = FALSE;
X					break;
X				}
X		if (!isok) {
X			stmp = stmp->next;
X			continue;
X		}
X
X		/*
X		 *	Test newsgroups-part
X		 */
X		found = FALSE;
X		ntmp = ngs;
X		while (ntmp) {
X			if (buf) {
X				strcpy (buf, ntmp->text);
X				if ((ptr = rindex (buf, '.')) && (Strieql (ptr, CTRL_POSTFIX)))
X					*ptr = '\0';
X			}
X			for (t=0;stmp->grps[t];++t)
X				if (regexec (stmp->grps[t], ntmp->text) ||
X					(buf && regexec (stmp->grps[t], buf))) {
X					found = TRUE;
X					inv = stmp->inv[t];
X					break;
X				}
X			if (found)
X				break;
X			ntmp = ntmp->next;
X		}
X		if ((!found) || inv) {
X			stmp = stmp->next;
X			continue;
X		}
X
X		/*
X		 *	Now check distribution at least
X		 */
X		inv = FALSE;
X		if (stmp->dist && dists) {
X			found = FALSE;
X			dtmp = dists;
X			while (dtmp) {
X				for (t=0;stmp->dist[t];++t)
X					if (stmp->dist[t][0] == '!') {
X						if (_cmpnam (dtmp->text, stmp->dist[t] + 1, strlen (stmp->dist[t] + 1)) == 0) {
X							found = TRUE;
X							inv = TRUE;
X						}
X					} else if (_cmpnam (dtmp->text, stmp->dist[t], strlen (stmp->dist[t])) == 0) {
X						found = TRUE;
X						break;
X					}
X				if (found)
X					break;
X				dtmp = dtmp->next;
X			}
X# ifndef	ALWAYS_DIST_WORLD
X		} else if (stmp->dist) {
X			found = FALSE;
X			for (t=0;stmp->dist[t];++t)
X				if (_cmpnam (DST_WORLD, stmp->dist[t], strlen (stmp->dist[t])) == 0) {
X					found = TRUE;
X					break;
X				}
X# endif		/* ALWAYS_DIST_WORLD */
X		} else
X			found = TRUE;
X		if (found && (!inv))
X			stmp->fwd = TRUE;
X		stmp = stmp->next;
X	}
X	if (buf)
X		free (buf);
X}
X
__END__OF__THIS__FILE__
exit 0
: end of shell archive

-- 
Frank Kaefer # fkk@stasys.sta.sub.org # Starnberg, Germany
Xref: sparky de.comp.sources.os9:13 comp.os.os9:1558