🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: de.comp.sources.os9
1 messages
1 total messages Started by Frank Kaefer Wed, 23 Dec 1992 19:41
MNews Prerelease Part02/09
#7
Author: Frank Kaefer
Date: Wed, 23 Dec 1992 19:41
1855 lines
46124 bytes
Submitted-by: Ulrich Dessauer <ud@Nightmare.ddt.sub.org>
Archive-name: mnews/part02

: ----- Cut here ----- Cut here ----- Cut here ----- Cut here -----
: Use  sh filename  to extract shell archive
: This shell archive contains following files:
:     'INEWS/RELS                                  (Directory)'
:     'INEWS/achk.c                                 5018 bytes'
:     'INEWS/adm.c                                   740 bytes'
:     'INEWS/alias.c                                1678 bytes'
:     'INEWS/app.c                                  3437 bytes'
:     'INEWS/arc.c                                  3250 bytes'
:     'INEWS/build.c                                4973 bytes'
:     'INEWS/ccan.c                                 2678 bytes'
:     'INEWS/cchk.c                                 5484 bytes'
:     'INEWS/cnew.c                                 3610 bytes'
:     'INEWS/crct.c                                 2437 bytes'
:     'INEWS/crm.c                                  1831 bytes'
:     'INEWS/crth.c                                 2723 bytes'
: 
if test -d 'INEWS/RELS' ; then
  echo 'Directory INEWS/RELS already exists'
else
  echo Make directory \"'INEWS/RELS'\"
  makdir 'INEWS/RELS'
fi
if test -f 'INEWS/achk.c' ; then
  echo 'File INEWS/achk.c already exists, overwriting it'
  del 'INEWS/achk.c'
fi
echo Extracting \"'INEWS/achk.c'\"
sed "s/^X//" >'INEWS/achk.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	achk.c_v $
X * Revision 1.3  91/12/26  13:35:42  ud
X * Added a feature to just forward articles with a maximum size
X * 
X * Revision 1.2  91/05/22  13:11:51  ud
X * Added better junk handling, added 2nd flag to skip newsgroups in active
X * file (they are present, but have no spooldirectory)
X * 
X * Revision 1.1  90/08/31  15:31:48  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: achk.c_v 1.3 91/12/26 13:35:42 ud Exp $";
X# endif		LINT
X# include	"inews.h"
X
Xextern char	*malloc ();
Xextern char	*rindex ();
X
Xint
Xcheck_active ()
X{
X	register charc	*act;
X	charc		*prev;
X	charc		*tmp, *t2;
X	int		valid;
X	int		isok;
X	register active	*atmp;
X	char		*junkbuf;
X	char		*ptr;
X	char		*comment[4];
X	int		maxlimit;
X	int		is_junked;
X
X	act = isctrl ? isctrl : ngs;
X	t2 = NULL;
X# ifdef		NO_JUNK
X	valid = FALSE;
X# else		/* NO_JUNK */
X	valid = TRUE;
X# endif		/* NO_JUNK */
X	is_junked = 0;
X	maxlimit = -2;
X	while (act) {
X# ifndef	HASH_SEARCH
X		atmp = hact;
X		while (atmp)
X			if (Strieql (act->text, atmp->grp))
X				break;
X			else
X				atmp = atmp->next;
X# else		/* HASH_SEARCH */
X		atmp = find_active (act -> text);
X# endif		/* HASH_SEARCH */
X		if (!atmp) {
X			if (junkbuf = malloc (strlen (act->text) + strlen (NG_JUNK) + 4)) {
X				strcpy (junkbuf, act->text);
X				strcat (junkbuf, ".");
X				strcat (junkbuf, NG_JUNK);
X				do {
X# ifndef	HASH_SEARCH
X					atmp = hact;
X					while (atmp)
X						if (Strieql (atmp->grp, junkbuf))
X							break;
X						else
X							atmp = atmp->next;
X# else		/* HASH_SEARCH */
X					atmp = find_active (junkbuf);
X# endif		/* HASH_SEARCH */
X					if (!atmp) {
X						if (ptr = rindex (junkbuf, '.'))
X							*ptr = '_';
X						if (ptr = rindex (junkbuf, '.'))
X							strcpy (ptr + 1, NG_JUNK);
X					}
X				} while ((!atmp) && ptr);
X				if (!atmp) {
X					free (junkbuf);
X					junkbuf = NULL;
X				}
X			}
X			if (!junkbuf) {
X# ifndef	HASH_SEARCH
X				atmp = hact;
X				while (atmp)
X					if (Strieql (atmp->grp, NG_JUNK))
X						break;
X					else
X						atmp = atmp->next;
X# else		/* HASH_SEARCH */
X				atmp = find_active (NG_JUNK);
X# endif		/* HASH_SEARCH */
X			}
X			if (atmp)
X				for (tmp = isctrl ? isctrl : ngs; tmp; tmp = tmp -> next)
X					if (tmp != act)
X						if (! strcmp (tmp -> text, atmp -> grp)) {
X							free (junkbuf);
X							junkbuf = NULL;
X							atmp = NULL;
X							break;
X						}
X			if (atmp && (valid || junkbuf)) {
X				do_log ("Newsgroup '%s' not in active, moved to %s\n", act->text, junkbuf ? junkbuf : NG_JUNK);
X				if (!isctrl) {
X					++is_junked;
X					if (!junkbuf) {
X						strcpy (act->text, NG_JUNK);
X						valid = FALSE;
X					} else {
X						free (act->text);
X						act->text = junkbuf;
X						junkbuf = NULL;
X					}
X				} else if (junkbuf) {
X					free (junkbuf);
X					junkbuf = NULL;
X				}
X			} else
X				atmp = NULL;
X		}
X		isok = TRUE;
X		if (atmp) {
X			if (atmp->aflag[0] == M_MOD) {
X				if (!get_header_line (H_APPROVED))
X					isok = FALSE;
X			} else if (crthd && (atmp -> aflag[0] == M_READONLY))
X				isok = FALSE;
X			if (atmp->aflag[1] == M_IGNORE)
X				isok = FALSE;
X		}
X		if ((! atmp) || (! isok)) {
X			if (atmp && crthd && user && (atmp -> aflag[0] == M_READONLY)) {
X				comment[0] = "You tried to post to a group which is read-only\n";
X				comment[1] = "Your article follows:\n";
X				comment[2] = NULL;
X				mail_to (user, NULL, "This group is read-only: ", ngs -> text, newstmp, comment);
X			}
X			if (!isctrl) {
X				tmp = act;
X				act = act->next;
X				if (!t2)
X					ngs = ngs->next;
X				else
X					t2->next = act;
X				free (tmp->text);
X				free ((char *) tmp);
X			} else {
X				t2 = act;
X				act = act->next;
X			}
X		} else {
X			atmp->changed = TRUE;
X			atmp->high++;
X			if (maxlimit != -1)
X				if (atmp -> kblimit == -1)
X					maxlimit = -1;
X				else if ((maxlimit == -2) || (atmp -> kblimit < maxlimit))
X					maxlimit = atmp -> kblimit;
X			act->nr = atmp->high;
X			t2 = act;
X			act = act->next;
X		}
X	}
X
X	if ((maxlimit >= 0) && ((maxlimit << 10) < artsize)) {
X		do_log ("Blocked due too large article (%d kBytes)\n", (artsize >> 10) + 1);
X		block_forward = TRUE;
X	}
X
X	if ((!isctrl) && (!ngs)) {
X		do_log ("No more newsgroups after check_active(), aborted.\n");
X		do_exit (0);
X	}
X
X# ifndef	NO_JUNK
X	if ((!isctrl) && (!valid)) {
X# if		1
X		while (is_junked-- > 0) {
X			for (t2 = ngs; t2 -> next; t2 = t2 -> next)
X				;
X			prev = NULL;
X			for (act = ngs; act; act = act -> next)
X				if (((ptr = rindex (act -> text, '.')) && Strieql (ptr + 1, NG_JUNK)) || Strieql (act -> text, NG_JUNK))
X					break;
X				else
X					prev = act;
X			if (act && (act != t2)) {
X				if (! prev)
X					ngs = ngs -> next;
X				else
X					prev -> next = act ->next;
X				act -> next = NULL;
X				t2 -> next = act;
X			}
X		}
X# else
X		act = ngs;
X		t2 = NULL;
X		while (act)
X			if (Strieql (act->text, NG_JUNK))
X				break;
X			else {
X				t2 = act;
X				act = act->next;
X			}
X		if (act && act->next) {
X			if (t2)
X				t2->next = act->next;
X			else
X				ngs = ngs->next;
X			for (t2 = ngs; t2->next; t2 = t2->next)
X				;
X			t2->next = act;
X			act->next = NULL;
X		}
X# endif
X	}
X# endif		/* NO_JUNK */
X
X	return (0);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/adm.c' ; then
  echo 'File INEWS/adm.c already exists, overwriting it'
  del 'INEWS/adm.c'
fi
echo Extracting \"'INEWS/adm.c'\"
sed "s/^X//" >'INEWS/adm.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	adm.c_v $
X * Revision 1.2  91/05/22  13:32:15  ud
X * Added check_history_size() for ndbm files (--> file segment list)
X * 
X * Revision 1.1  90/12/01  15:51:09  ud
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: adm.c_v 1.2 91/05/22 13:32:15 ud Exp $";
X# endif		LINT
X# include	"inews.h"
X
Xvoid
Xdo_admin (doexp, delart, delhist, ra, rh, cd)
Xint doexp;
Xchar *delart, *delhist;
Xint ra;
Xint rh;
Xint cd;
X{
X
X	if (do_init (TRUE) < 0)
X		exit (_errmsg (1, "Can't init in expire\n"));
X	if (doexp)
X		do_expire (delart, delhist);
X	if (ra)
X		rebuild_active_file ();
X	if (rh)
X		rebuild_history ();
X# ifdef		USE_NDBM
X	if (cd)
X		check_history_size ();
X# endif		/* USE_NDBM */
X	nunlock ();
X	respool (FALSE);
X	do_exit (0);
X}
X
__END__OF__THIS__FILE__
if test -f 'INEWS/alias.c' ; then
  echo 'File INEWS/alias.c already exists, overwriting it'
  del 'INEWS/alias.c'
fi
echo Extracting \"'INEWS/alias.c'\"
sed "s/^X//" >'INEWS/alias.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	alias.c_v $
X * Revision 1.1  90/08/31  15:31:51  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: alias.c_v 1.1 90/08/31 15:31:51 cs Exp $";
X# endif		LINT
X# include	<modes.h>
X# include	"inews.h"
X
Xextern char	*malloc ();
X
Xvoid
Xdelete_dup_charc (list)
Xcharc *list;
X{
X	register charc	*cur, *prev, *tmp;
X
X	if (!list)
X		return;
X	cur = list;
X	while (cur) {
X		prev = cur;
X		tmp = cur->next;
X		while (tmp)
X			if (Strieql (tmp->text, cur->text))
X				break;
X			else {
X				prev = tmp;
X				tmp = tmp->next;
X			}
X		if (tmp) {
X			prev->next = tmp->next;
X			free (tmp->text);
X			free ((char *) tmp);
X		} else
X			cur = cur->next;
X	}
X}
X
Xint
Xalias_newsgroups ()
X{
X	char		*buf;
X	int		fd;
X	int		n;
X	register charc	*tmp, *prev;
X	char		*new;
X	charc		*newng, *app;
X	int		didit;
X
X	if (!ngs)
X		return (FALSE);
X	if ((fd = open (ALIAS_FILE, S_IREAD)) < 0)
X		return (FALSE);
X	didit = FALSE;
X	catlines = TRUE;
X	while (buf = readbuf (fd, & n)) {
X		if ((n == 1) || (buf[0] == '#'))
X			continue;
X		buf[n - 1] = '\0';
X		new = skipc (buf, '\0');
X		tmp = ngs;
X		prev = NULL;
X		while (tmp)
X			if (Strieql (tmp->text, buf))
X				break;
X			else {
X				prev = tmp;
X				tmp = tmp->next;
X			}
X		if (!tmp)
X			continue;
X		didit = TRUE;
X		if (!*new) {
X			if (prev)
X				prev->next = tmp->next;
X			else
X				ngs = ngs->next;
X		} else if (newng = split_fields (new, TRUE)) {
X			if (prev) {
X				prev->next = newng;
X				app = prev;
X			} else {
X				ngs = newng;
X				app = ngs;
X			}
X			while (app->next)
X				app = app->next;
X			app->next = tmp->next;
X		}
X		free (tmp->text);
X		free ((char *) tmp->text);
X	}
X	catlines = FALSE;
X	close (fd);
X	if (didit)
X		delete_dup_charc (ngs);
X	return (didit);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/app.c' ; then
  echo 'File INEWS/app.c already exists, overwriting it'
  del 'INEWS/app.c'
fi
echo Extracting \"'INEWS/app.c'\"
sed "s/^X//" >'INEWS/app.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	app.c_v $
X * Revision 1.1  90/08/31  15:31:55  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: app.c_v 1.1 90/08/31 15:31:55 cs Exp $";
X# endif		LINT
X# include	"inews.h"
X
Xextern char	*malloc ();
Xextern char	*strdup ();
X
Xvoid
Xcheck_approved ()
X{
X	register int	t;
X	register charc	*t2;
X	register char	*ptr;
X	char		*recs;
X	register charc	*tmp;
X	char		*from, *sender;
X	active		*atmp;
X	sys		*stmp;
X	char		*comment[10];
X
X	tmp = ngs;
X	while (tmp) {
X# ifndef	HASH_SEARCH
X		atmp = hact;
X		while (atmp)
X			if (Strieql (atmp->grp, tmp->text))
X				break;
X			else
X				atmp = atmp->next;
X# else		/* HASH_SEARCH */
X		atmp = find_active (tmp -> text);
X# endif		/* HASH_SEARCH */
X		if (atmp && (atmp->aflag[0] == M_MOD))
X			break;
X		tmp = tmp->next;
X	}
X	if ((!tmp) || (!atmp) || (!atmp->moderator))
X		return;
X	if (tmp = get_header_line (H_APPROVED))
X		return;
X	sender = find_address_hl (H_SENDER);
X	from = find_address_hl (H_FROM);
X	if (!(sender || from))
X			return;
X	if (atmp->moderator)
X		for (t=0;atmp->moderator[t];++t)
X			if (from && (Strieql (atmp->moderator[t], from)))
X				break;
X			else if (sender && (Strieql (atmp->moderator[t], sender)))
X				break;
X	if ((!atmp->moderator) || (!atmp->moderator[t])) {
X		do_log ("Article %s from wrong sender (%s, %s) in %s\n",
X			get_msgid (),
X			from ? from : "[no From]",
X			sender ? sender : "[no Sender]",
X			atmp->grp);
X		stmp = hsys;
X		while (stmp) {
X			stmp->fwd = FALSE;
X			stmp = stmp->next;
X		}
X# ifdef		NO_MAIL_TO_MODERATOR
X		if (recs = strdup (atmp->grp)) {
X			ptr = recs;
X			while (*ptr)
X				if (*ptr == '.')
X					*ptr++ = '-';
X				else
X					++ptr;
X			comment[0] = "A message had been posted to the moderated group,\n";
X			comment[1] = "where you are listen as the moderator, the submitter was:\n";
X			comment[2] = sender ? sender : (from ? from : "[unknown]");
X			comment[3] = ". The submisson took place in '";
X			comment[4] = atmp->grp;
X			comment[5] = "'.\n";
X			comment[6] = "I hope you know how to handle this mail\n";
X			comment[7] = NULL;
X			mail_to (recs, from, "Non-approved article in moderated group by", from ? from : (sender ? sender : (from ? from : "[unknown]")), newstmp, comment);
X		}
X# endif		/* NO_MAIL_TO_MODERATOR */
X		comment[0] = "You tried to post a message in a moderated group,\n";
X		comment[1] = "Where you aren't the moderator; the group was '";
X		comment[2] = atmp->grp;
X		comment[3] = "'.\n";
X# ifdef		NO_MAIL_TO_MODERATOR
X		if (recs)
X			comment[4] = "Your article had been forwarded to the moderator.\n";
X		else
X			comment[4] = "Please send your article directly via mail to the moderator.\n";
X# else		/* NO_MAIL_TO_MODERATOR */
X		comment[4] = "If you wish to send this to the moderator, send it via mail\n";
X# endif		/* NO_MAIL_TO_MODERATOR */
X		comment[5] = NULL;
X		mail_to (from ? from : sender, NULL, "This is a moderated group!", NULL, recs ? NULL : newstmp, comment);
X		if (recs)
X			free (recs);
X	} else {
X		if (tmp = (charc *) malloc (sizeof (charc))) {
X			tmp->next = NULL;
X			if (tmp->text = malloc (strlen (atmp->moderator[t]) + strlen (hlines[H_APPROVED] + 2) + 6)) {
X				sprintf (tmp->text, "%s %s@%s",
X					hlines[H_APPROVED] + 2,
X					news_owner,
X					fhost);
X				if (!head)
X					head = tmp;
X				else {
X					t2 = head;
X					while (t2->next)
X						t2 = t2->next;
X					t2->next = tmp;
X				}
X				sort_header (FALSE);
X			} else
X				free ((char *) tmp);
X		}
X	}
X	if (from)
X		free (from);
X	if (sender)
X		free (sender);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/arc.c' ; then
  echo 'File INEWS/arc.c already exists, overwriting it'
  del 'INEWS/arc.c'
fi
echo Extracting \"'INEWS/arc.c'\"
sed "s/^X//" >'INEWS/arc.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	arc.c_v $
X * Revision 1.1  90/10/26  14:20:31  ud
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: arc.c_v 1.1 90/10/26 14:20:31 ud Exp $";
X# endif		LINT
X# include	<modes.h>
X# include	<errno.h>
X# include	"inews.h"
X
Xextern char	*malloc ();
Xextern char	*strdup ();
X
Xstatic void
Xdo_copy (fdi, fdo)
Xregister int fdi, fdo;
X{
X	register int	n;
X	register int	size;
X	register char	*buf;
X	register char	smallbuf[128];
X
X	size = 5000;
X	while (size >= 1000)
X		if (buf = malloc (size + 20))
X			break;
X		else
X			size -= 1000;
X	if (size < 1000) {
X		size = 100;
X		buf = smallbuf;
X	}
X	while ((n = read (fdi, buf, size)) > 0)
X		write (fdo, buf, n);
X	if (size > 100)
X		free (buf);
X}
X
Xarchive *
Xsetup_archive ()
X{
X	int	fd;
X	char	*buf;
X	int	n;
X	archive	*ahead, *cur, *tmp;
X	char	*group, *destination, *prefix;
X
X	ahead = NULL;
X	if ((fd = open (ARCHIVE_FILE, S_IREAD)) < 0)
X		return (NULL);
X	catlines = TRUE;
X	while (buf = readbuf (fd, & n)) {
X		if ((n == 1) || (buf[0] == '#'))
X			continue;
X		buf[n - 1] = '\0';
X		group = buf;
X		destination = skipc (group, '\0');
X		prefix = skipc (destination, '\0');
X		if (tmp = (archive *) malloc (sizeof (archive)))
X			if (tmp->grp = strdup (group))
X				if (tmp->dest = strdup (destination)) {
X					tmp->len = strlen (tmp->grp);
X					if (prefix && *prefix)
X						tmp->prefix = strdup (prefix);
X					else
X						tmp->prefix = NULL;
X					tmp->next = NULL;
X					if (!ahead)
X						ahead = tmp;
X					else
X						cur->next = tmp;
X					cur = tmp;
X				} else {
X					free (tmp->grp);
X					free ((char *) tmp);
X				}
X			else
X				free ((char *) tmp);
X	}
X	catlines = FALSE;
X	close (fd);
X	return (ahead);
X}
X
Xvoid
Xfree_archive (ahead)
Xarchive *ahead;
X{
X	register archive	*tmp, *cur;
X
X	cur = ahead;
X	while (cur) {
X		tmp = cur;
X		cur = cur->next;
X		free (tmp->grp);
X		free (tmp->dest);
X		if (tmp->prefix)
X			free (tmp->prefix);
X	}
X}
X
Xvoid
Xdo_archive (fn, arc)
Xchar *fn;
Xarchive *arc;
X{
X	char	*fullfn;
X	char	*destfn;
X	int	fd, fdo;
X	int	n;
X	int	id;
X
X	if (!(arc && fn))
X		return;
X	if (!(fullfn = create_fn (fn))) {
X		do_log ("FATAL: Can't create full-filename in do_archive().\n");
X		return;
X	}
X	if (!(destfn = malloc (strlen (arc->dest) + 40))) {
X		do_log ("FATAL: Can't malloc for dest in do_archive().\n");
X		free (fullfn);
X		return;
X	}
X	strcpy (destfn, arc->dest);
X	strcat (destfn, "/.seq");
X	do {
X		if ((fd = open (destfn, S_IREAD | S_IWRITE | S_ISHARE)) < 0) {
X			if (errno == E_PNNF) {
X				fd = create (destfn, S_IWRITE | S_ISHARE, 03);
X				id = 1;
X			}
X		} else {
X			read (fd, &id, sizeof (int));
X			lseek (fd, 0, 0);
X		}
X		if ((fd < 0) && (errno == E_SHARE))
X			sleep (1);
X		else
X			break;
X	} while (fd < 0);
X	if (fd != -1) {
X		n = id + 1;
X		write (fd, &n, sizeof (int));
X		close (fd);
X	}
X	if (arc->prefix && *arc->prefix)
X		sprintf (destfn, "%s/%s.%06d", arc->dest, arc->prefix, id);
X	else
X		sprintf (destfn, "%s/%06d", arc->dest, id);
X	if ((fd = open (fullfn, S_IREAD)) != -1) {
X		if ((fdo = create (destfn, S_IWRITE | S_ISIZE, 013, ((n = _gs_size (fd)) > 0) ? n : 4096)) != -1) {
X			do_copy (fd, fdo);
X			close (fdo);
X		} else
X			do_log ("Can't create %s for archive (%d).\n", destfn, errno);
X		close (fd);
X	} else
X		do_log ("Can't read %s for archive (%d).\n", fullfn, errno);
X	free (fullfn);
X	free (destfn);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/build.c' ; then
  echo 'File INEWS/build.c already exists, overwriting it'
  del 'INEWS/build.c'
fi
echo Extracting \"'INEWS/build.c'\"
sed "s/^X//" >'INEWS/build.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	build.c_v $
X * Revision 1.2  90/12/01  15:43:42  ud
X * Added rebuild_history() to convert from old format to new
X * hashing format; Rebuild from articles have to be done later
X * 
X * Revision 1.1  90/08/31  15:31:59  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: build.c_v 1.2 90/12/01 15:43:42 ud Exp $";
X# endif		LINT
X# include	<stdio.h>
X# include	<c8type.h>
X# include	<modes.h>
X# include	<dir.h>
X# include	"inews.h"
X# include	"hist.h"
X
Xextern char	*malloc ();
Xextern char	*strdup ();
X
Xstatic void
Xbuild (at)
Xactive *at;
X{
X	int		min, max, n;
X	DIR		*dp;
X	struct direct	*ent;
X	char		*path;
X
X	if (!(path = strdup (at->grp)))
X		return;
X	make_fn (path);
X	if (!(dp = opendir (path))) {
X		at->low = at->high;
X		free (path);
X		return;
X	}
X	min = -1;
X	max = -1;
X	while (ent = readdir (dp)) {
X		if (!is8digit (ent->d_name[0]))
X			continue;
X		n = atoi (ent->d_name);
X		if (min < 0) {
X			min = n;
X			max = n;
X		} else {
X			if (min > n)
X				min = n;
X			if (max < n)
X				max = n;
X		}
X	}
X	closedir (dp);
X	if (min < 0) {
X		min = at->high;
X		max = at->high;
X	}
X	if (max < min)
X		max = min;
X	do_log ("rebuild %s (%d, %d) --> (%d, %d)\n", at->grp,
X		at->low, at->high, min, max);
X	at->low = min;
X	at->high = max;
X}
X
Xvoid
Xrebuild_active_file ()
X{
X	active	*atmp;
X	charc	*tmp;
X
X	if ((! hact) && (read_active () < 0)) {
X		catlines = FALSE;
X		do_log ("Can't read active file in rebuild\n");
X		return;
X	}
X	act_rewrite = TRUE;
X	if (chdir (newsdir) < 0) {
X		do_log ("Can't chdir to %s in rebuild\n", newsdir);
X		return;
X	}
X	atmp = hact;
X	while (atmp) {
X		if (ngs) {
X			tmp = ngs;
X			while (tmp)
X				if (_cmpnam (atmp->grp, tmp->text, strlen (tmp->text)) == 0)
X					break;
X				else
X					tmp = tmp->next;
X			if (!tmp) {
X				atmp = atmp->next;
X				continue;
X			}
X		}
X		build (atmp);
X		atmp = atmp->next;
X	}
X	if (chdir (newslib) < 0) {
X		do_log ("Can't chdir to %s in rebuild\n", newsdir);
X		return;
X	}
X	if (restore_active () < 0) {
X		do_log ("Can't restore active file in rebuild\n");
X		return;
X	}
X}
X
Xvoid
Xrebuild_history ()
X{
X# ifndef	USE_NDBM
X	int		fd;
X	DIR		*dp;
X	struct direct	*ent;
X	charc		*head, *cur, *tmp;
X	int		err;
X	char		*buf;
X	char		*ptmp;
X	register char	*ptr;
X	register int	t;
X	char		sav;
X	FILE		*fp;
X
X	if (!(buf = malloc (1024))) {
X		do_log ("Can't alloc in rebuild_history()\n");
X		return;
X	}
X	if (chdir (HIST_DIR) < 0) {
X		do_log ("Can't chdir to %s (errno %d\n", HIST_DIR, errno);
X		return;
X	}
X	head = NULL;
X	cur = NULL;
X	if (!(dp = opendir ("."))) {
X		do_log ("Can't read %s (errno %d)\n", HIST_DIR, errno);
X		chdir (newslib);
X		return;
X	}
X	err = 0;
X	while (ent = readdir (dp)) {
X		if ((ent->d_name[0] == '.') || isdigit (ent->d_name[0]))
X			continue;
X		if (!(tmp = (charc *) malloc (sizeof (charc)))) {
X			++err;
X			break;
X		}
X		if (!(tmp->text = malloc (80))) {
X			free ((char *) tmp);
X			++err;
X			break;
X		}
X		strcpy (tmp->text, ent->d_name);
X		tmp->next = NULL;
X		if (!cur)
X			head = tmp;
X		else
X			cur->next = tmp;
X		cur = tmp;
X	}
X	closedir (dp);
X	if (err) {
X		do_log ("Error during collecting history-files, aborted\n");
X		chdir (newslib);
X		return;
X	}
X	if (head) {
X		for (tmp = head, t = 0; tmp; tmp = tmp->next) {
X			sprintf (buf, "%06d_conv", t);
X			if (rename (tmp->text, buf) != 0) {
X				++err;
X				break;
X			}
X			sprintf (tmp->text, "%s/%s", HIST_DIR, buf);
X			++t;
X		}
X		if (chdir (newslib) < 0) {
X			do_log ("Can't chdir back to %s (%d)\n", newslib, errno);
X			return;
X		}
X		if (err) {
X			do_log ("Problems during renameing of files, aborted\n");
X			return;
X		}
X		for (tmp = head; tmp; tmp = tmp->next) {
X			if (!(fp = fopen (tmp->text, "r"))) {
X				++err;
X				continue;
X			}
X			while (fgets (buf, 1000, fp)) {
X				ptmp = skipn (buf, '\0');
X				ptr = ptmp;
X				while (*ptr && (!is8space (*ptr)))
X					++ptr;
X				if (!*ptr)
X					continue;
X				sav = *ptr;
X				*ptr = '\0';
X				if ((fd = open_hist (ptmp, S_IREAD | S_IWRITE)) != -1) {
X					if (lseek (fd, 0, 2) != -1) {
X						*ptr = sav;
X						do {
X							write (fd, buf, strlen (buf));
X							if (buf[strlen (buf) - 1] != '\n')
X								if (!fgets (buf, 1000, fp))
X									break;
X						} while (buf[strlen (buf) - 1] != '\n');
X					}
X					close (fd);
X				} else
X					++err;
X			}
X			fclose (fp);
X			if (!err)
X				unlink (tmp->text);
X		}
X		if (err)
X			do_log ("Error during reformating old entries\n");
X		tmp = head;
X		while (tmp) {
X			cur = tmp;
X			tmp = tmp->next;
X			free (cur->text);
X			free ((char *) cur);
X		}
X	} else {
X		chdir (newslib);
X		do_log ("rebuild_history currently not implemented!\n");
X	}
X	if (chdir (HIST_DIR) < 0) {
X		do_log ("Fatal: Can't rechange to %s\n", HIST_DIR);
X		return;
X	}
X	if (!err)
X		if (dp = opendir (".")) {
X			while (ent = readdir (dp)) {
X				if ((ent->d_name[0] == '.') || is8digit (ent->d_name[0]))
X					continue;
X				sprintf (buf, "fsort %s", ent->d_name);
X				if (xshell (buf))
X					++err;
X			}
X			closedir (dp);
X		}
X	free (buf);
X# else		/* USE_NDBM */
X	do_log ("rebuild_history for dbm currently not implemented!\n");
X# endif		/* USE_NDBM */
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/ccan.c' ; then
  echo 'File INEWS/ccan.c already exists, overwriting it'
  del 'INEWS/ccan.c'
fi
echo Extracting \"'INEWS/ccan.c'\"
sed "s/^X//" >'INEWS/ccan.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	ccan.c_v $
X * Revision 1.3  91/05/22  13:16:43  ud
X * Seperate article delete function to be used by Supersedes:
X * 
X * Revision 1.2  91/01/02  21:26:25  ud
X * Added ndbm support for history
X * 
X * Revision 1.1  90/08/31  15:32:03  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: ccan.c_v 1.3 91/05/22 13:16:43 ud Exp $";
X# endif		LINT
X# include	<modes.h>
X# include	"inews.h"
X# include	"hist.h"
X
Xextern char	*malloc ();
Xextern char	*strdup ();
X
Xstatic int
Xdo_cancel (fns, id, flag)
Xregister char *fns;
Xchar *id;
Xchar flag;
X{
X	register char	*p;
X	char		*tbuf;
X	int		ok;
X
X	if (! (fns = strdup (fns)))
X		return (TRUE);
X	tbuf = fns;
X	ok = TRUE;
X	do_log ("Delete '%s' (fns = %s)\n", id, fns);
X	p = skipc (fns, '\0');
X	if (may_cancel (fns)) {
X		if (flag != ART_EXPIRED)
X			while (*fns) {
X				if (unlink_in_newsdir_file (fns) == -1)
X					ok = FALSE;
X				fns = p;
X				p = skipc (fns, '\0');
X			}
X	} else {
X		ok = FALSE;
X		mail_to ("Postmaster", NULL, "Tries to cancel not-own article: ", find_from (FALSE), newstmp, NULL);
X	}
X	free (tbuf);
X	return (ok);
X}
X
Xint
Xdelete_msg (id)
Xchar *id;
X{
X	char	*p, *fns;
X	char	*flag;
X	int	fd;
X	char	*ptr, *sav;
X	char	*buf;
X	char	*savid;
X	int	n;
X	int	found;
X
X	if (!(savid = strdup (id))) {
X		do_log ("FATAL: Can't alloc memory in delete_msg for id\n");
X		return (0);
X	}
X# ifdef		USE_NDBM
X	if (!(db = open_hist (S_IREAD | S_IWRITE))) {
X		free (savid);
X		do_log ("Can't open %s.\n", HISTORY);
X		return (0);
X	}
X# endif		/* USE_NDBM */
X	found = FALSE;
X	ptr = savid;
X	while (*ptr) {
X		sav = ptr;
X		ptr = skipc (ptr, '\0');
X# ifndef	USE_NDBM
X		if ((fd = open_hist (sav, S_IREAD)) != -1) {
X			while (buf = readbuf (fd, & n)) {
X				buf[n - 1] = '\0';
X				p = skipc (buf, '\0');
X				flag = skipc (p, '\0');
X				fns = skipc (flag, '\0');
X				if (Mideql (sav, p)) {
X					found = TRUE;
X					if (! do_cancel (fns, sav, flag[0]))
X						block_forward = TRUE;
X					break;
X				}
X			}
X			close (fd);
X		}
X# else		/* USE_NDBM */
X		key.dptr = lower_mid (sav);
X		key.dsize = strlen (sav) + 1;
X		dat = dbm_fetch (db, key);
X		if (dat.dptr) {
X			found = TRUE;
X			memcpy (&hist, dat.dptr, sizeof (history));
X			if (do_cancel (hist.fns, sav, (char) hist.flag)) {
X				memcpy (&hist, dat.dptr, sizeof (history));
X				hist.flag = ART_EXPIRED;
X				fill_hist ();
X				dbm_store (db, key, dat, DBM_REPLACE);
X			} else
X				block_forward = TRUE;
X		}
X# endif		/* USE_NDBM */
X	}
X# ifdef		USE_NDBM
X	dbm_close (db);
X# endif		/* USE_NDBM */
X	free (savid);
X	return (found);
X}
X
Xvoid
Xcancel_msg (id)
Xchar *id;
X{
X	if (!delete_msg (id)) {
X		do_log ("Receive Cancel for non existing article, ID = %s\n",
X			((id && *id) ? id : "** lost! **"));
X		do_exit (0);
X	}
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/cchk.c' ; then
  echo 'File INEWS/cchk.c already exists, overwriting it'
  del 'INEWS/cchk.c'
fi
echo Extracting \"'INEWS/cchk.c'\"
sed "s/^X//" >'INEWS/cchk.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	cchk.c_v $
X * Revision 1.2  91/05/22  13:21:26  ud
X * Added in memory option
X * Stores now the checkgroups message in the Newsgroups file
X * 
X * Revision 1.1  90/08/31  15:32:07  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: cchk.c_v 1.2 91/05/22 13:21:26 ud Exp $";
X# endif		LINT
X# include	<modes.h>
X# include	<c8type.h>
X# include	"inews.h"
X
Xextern char	*malloc ();
Xextern char	*rindex ();
Xextern char	*strdup ();
X
Xstatic cgroup *
Xadd_group (root, line)
Xcgroup *root;
Xchar *line;
X{
X	cgroup		*tmp;
X	register cgroup	*run, *prev;
X	register char	*ptr;
X	register int	n;
X
X	if (! (tmp = (cgroup *) malloc (sizeof (cgroup))))
X		return (root);
X	if (! (tmp -> group = strdup (line))) {
X		free ((char *) tmp);
X		return (root);
X	}
X	for (ptr = tmp -> group;*ptr && (! is8space (*ptr)); ++ptr)
X		;
X	if (*ptr) {
X		tmp -> seperate = *ptr;
X		*ptr++ = '\0';
X	} else
X		tmp -> seperate = '\0';
X	tmp -> comment = ptr;
X	tmp -> next = NULL;
X	if (! root)
X		root = tmp;
X	else {
X		prev = NULL;
X		for (run = root; run; (prev = run), (run = run -> next)) {
X			n = strcmp (run -> group, tmp -> group);
X			if (n > 0) {
X				tmp -> next = run;
X				if (prev)
X					prev -> next = tmp;
X				else
X					root = tmp;
X				break;
X			} else if (n == 0) {
X				free (run -> group);
X				run -> group = tmp -> group;
X				run -> seperate = tmp -> seperate;
X				run -> comment = tmp -> comment;
X				free ((char *) tmp);
X				tmp = NULL;
X				break;
X			}
X		}
X		if ((! run) && prev)
X			prev -> next = tmp;
X	}
X	return (root);
X}
X
Xvoid
Xcheckgroups ()
X{
X	int		fd;
X	int		fdt;
X	int		fdn;
X	int		n, t;
X# ifndef	IN_MEMORY
X	char		fn[40 + sizeof (TEMPDIR)];
X# else		/* IN_MEMORY */
X	list		*cgrp;
X	register list	*ntmp;
X# endif		/* IN_MEMORY */
X	char		*buf;
X	char		*sav;
X	register char	*ptr;
X	active		*atmp;
X	charc		*limit;
X	cgroup		*croot, *crun, *cprev;
X
X	if (!(buf = malloc (512))) {
X		do_log ("FATAL: Can't alloc in checkgroups\n");
X		do_exit (1);
X	}
X# ifndef	IN_MEMORY
X	if ((fd = open (newstmp, S_IREAD)) < 0) {
X		do_log ("FATAL: Can't open %s\n", newstmp);
X		do_exit (1);
X	}
X	sprintf (fn, "%s/inewstXXXXXX", TEMPDIR);
X	mktemp (fn);
X	if ((fdt = create (fn, S_IWRITE, 03)) < 0) {
X		do_log ("FATAL: Can't create tmpfile %s\n", fn);
X		close (fd);
X		do_exit (1);
X	}
X# else		/* IN_MEMORY */
X	cgrp = NULL;
X# endif		/* IN_MEMORY */
X	croot = NULL;
X	if ((fdn = open (NEWSGROUPS_FILE, S_IREAD)) != -1) {
X		while (ptr = readbuf (fdn, & n))
X			if ((n > 1) && (ptr[0] != '#')) {
X				if (ptr[n - 1] == '\n')
X					ptr[n - 1] = '\0';
X				else
X					ptr[n] = '\0';
X				croot = add_group (croot, ptr);
X			}
X		close (fdn);
X	}
X	limit = get_limit_newsgroups ();
X	atmp = hact;
X	while (atmp) {
X		atmp->flag = FALSE;
X		atmp = atmp->next;
X	}
X	strcpy (buf, "-tnx\n");
X# ifndef	IN_MEMORY
X	write (fdt, buf, strlen (buf));
X	n = _gs_size (fd);
X# else		/* IN_MEMORY */
X	add_list (&cgrp, buf, strlen (buf));
X	n = 0;
X	for (ntmp = newstmp; ntmp; ntmp = ntmp->next)
X		n += ntmp->len;
X# endif		/* IN_MEMORY */
X	strcpy (buf, "* Add missing newsgroups\n");
X# ifndef	IN_MEMORY
X	write (fdt, buf, strlen (buf));
X	while ((n = readin (fd, buf, 500)) > 0) {		/* } */
X# else		/* IN_MEMORY */
X	add_list (&cgrp, buf, strlen (buf));
X	for (ntmp = newstmp; ntmp; ntmp = ntmp->next) {
X		strncpy (buf, ntmp->text, ((n = ntmp->len) > 500 ? 500 : n));
X# endif		/* IN_MEMORY */
X		if ((buf[0] == '#') || (buf[0] == '!') || (n == 1))
X			continue;
X		buf[n - 1] = '\0';
X		croot = add_group (croot, buf);
X		skipc (buf, '\0');
X# ifndef	HASH_SEARCH
X		atmp = hact;
X		while (atmp)
X			if (Strieql (atmp->grp, buf))
X				break;
X			else
X				atmp = atmp->next;
X# else		/* HASH_SEARCH */
X		atmp = find_active (buf);
X# endif		/* HASH_SEARCH */
X		if (!atmp) {
X			if ((check_limit (limit, buf)) && (sav = strdup (buf))) {
X				sprintf (buf, "inews -v '-c=newgroup:%s' '-d=%s' </nil\n", sav, DST_LOCAL);
X# ifndef	IN_MEMORY
X				write (fdt, buf, strlen (buf));
X# else		/* IN_MEMORY */
X				add_list (&cgrp, buf, strlen (buf));
X# endif		/* IN_MEMORY */
X				free (sav);
X			}
X		} else
X			atmp->flag = TRUE;
X	}
X	strcpy (buf, "* Delete obsolete newsgrps\n");
X# ifndef	IN_MEMORY
X	write (fdt, buf, strlen (buf));
X	close (fd);
X# else		/* IN_MEMORY */
X	add_list (&cgrp, buf, strlen (buf));
X# endif		/* IN_MEMORY */
X	for (atmp = hact; atmp; atmp = atmp->next)
X		if ((!atmp->flag) && Stricmp (atmp->grp, NG_JUNK) && Stricmp (atmp->grp, NG_CONTROL) && check_limit (limit, atmp->grp))
X			if ((!(ptr = rindex (atmp->grp, '.'))) || Stricmp (ptr + 1, NG_JUNK)) {
X				sprintf (buf, "inews -v '-c=rmgroup:%s' </nil\n", atmp->grp);
X# ifndef	IN_MEMORY
X				write (fdt, buf, strlen (buf));
X# else		/* IN_MEMORY */
X				add_list (&cgrp, buf, strlen (buf));
X# endif		/* IN_MEMORY */
X			}
X# ifndef	IN_MEMORY
X	close (fdt);
X	mail_to (news_owner, NULL, "Control Message: Checkgroups", NULL, fn, NULL);
X	unlink (fn);
X# else		/* IN_MEMORY */
X	mail_to (news_owner, NULL, "Control Message: Checkgroups", NULL, cgrp, NULL);
X	free_list (cgrp);
X# endif		/* IN_MEMORY */
X	free (buf);
X	free_field (limit);
X	unlink (NEWSGROUPS_FILE);
X	if (croot && ((fdn = create (NEWSGROUPS_FILE, S_IWRITE | S_ISIZE, 013, n < 0 ? 4096 : n)) != -1)) {
X		for (crun = croot; crun;) {
X			if (crun -> seperate)
X				sprintf (buf, "%s%c%s\n",
X					crun -> group,
X					crun -> seperate,
X					crun -> comment);
X			else
X				sprintf (buf, "%s\n",
X					crun -> group);
X			n = strlen (buf);
X			if (write (fdn, buf, n) != n)
X				break;
X			cprev = crun;
X			crun = crun -> next;
X			free (cprev -> group);
X			free ((char *) cprev);
X		}
X		close (fdn);
X	}
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/cnew.c' ; then
  echo 'File INEWS/cnew.c already exists, overwriting it'
  del 'INEWS/cnew.c'
fi
echo Extracting \"'INEWS/cnew.c'\"
sed "s/^X//" >'INEWS/cnew.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	cnew.c_v $
X * Revision 1.2  91/05/22  13:13:48  ud
X * Added auto newgroup
X * 
X * Revision 1.1  90/08/31  15:32:11  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: cnew.c_v 1.2 91/05/22 13:13:48 ud Exp $";
X# endif		LINT
X# include	<c8type.h>
X# include	"inews.h"
X
Xextern char	*index ();
Xextern char	*skipc ();
Xextern char	*strdup ();
X
Xvoid
Xnewgroup (ng)
Xchar *ng;
X{
X	active	*atmp, *aact;
X	char	*ptr;
X	char	*p;
X	int	ismod;
X	int	t;
X
X	if (ptr = index (ng, ':')) {
X		*ptr++ = '\0';
X		while (is8space (*ptr))
X			++ptr;
X	} else
X		ptr = skipc (ng, '\0');
X	ismod = (*ptr && Strnieql (ptr, "mod", 3));
X# ifndef	HASH_SEARCH
X	atmp = hact;
X	while (atmp)
X		if (Strieql (atmp->grp, ng))
X			break;
X		else
X			atmp = atmp->next;
X# else		/* HASH_SEARCH */
X	atmp = find_active (ng);
X# endif		/* HASH_SEARCH */
X# ifndef	AUTO_NEWGROUP
X	if (! isadm) {
X		if ((! atmp) || ((atmp -> aflag[0] == M_MOD) && (!ismod)) || ((atmp -> aflag[0] == M_NOT_MOD) && ismod)) {
X			char	*tmp;
X			char	*comment[6];
X
X			comment[0] = "A newgroupmessage has arrived here, but you have disabled\n";
X			comment[1] = "the automatic creation of a newsgroup. So you have to\n";
X			comment[2] = "execute the following command as News Admin:\n";
X			if (atmp)
X				comment[3] = "The state of moderation had been changed\n";
X			else
X				comment[3] = "This newsgroup is completely new\n";
X			if (tmp = malloc (strlen (ng) + 128)) {
X				sprintf (tmp, "inews '-c=newgroup:%s%s' -d=local </nil\n", ng, ismod ? " moderated" : "");
X				comment[4] = tmp;
X			} else
X				comment[4] = "inews '-c=<newsgroup> [<moderated>]' -d=local </nil\n";
X			comment[5] = NULL;
X			mail_to (news_owner, NULL, "Control Message: newgroup", ng, NULL, comment);
X			if (tmp)
X				free (tmp);
X		}
X		return;
X	}
X# endif		/* AUTO_NEWGROUP */
X	if (atmp) {
X		do_log ("Got newgroup for existing group %s\n", atmp->grp);
X		if (atmp->aflag[1] == M_IGNORE)
X			atmp->aflag[1] = M_USE;
X		if ((atmp->aflag[0] == M_MOD) && (!ismod)) {
X			do_log ("Group status changed from moderated to unmoderated\n");
X			atmp->aflag[0] = M_NOT_MOD;
X			for (t=0;atmp->moderator[t];++t)
X				free (atmp->moderator[t]);
X			free ((char *) atmp->moderator);
X			atmp->moderator = NULL;
X			act_rewrite = TRUE;
X		} else if ((atmp->aflag[0] == M_NOT_MOD) && ismod) {
X			do_log ("Group status changed from unmoderated to moderated\n");
X			atmp->aflag[0] = M_MOD;
X			if (atmp->moderator = (char **) malloc (sizeof (char *) * 3))
X				atmp->moderator[0] = NULL;
X			else {
X				do_log ("FATAL: Can't alloc memory\n");
X				do_exit (1);
X			}
X			act_rewrite = TRUE;
X		}
X		return;
X	}
X	if (!(atmp = (active *) malloc (sizeof (active)))) {
X		do_log ("FATAL: Can't alloc for newgroup\n");
X		do_exit (1);
X	}
X	if (!(atmp->grp = strdup (ng))) {
X		do_log ("FATAL: Can't alloc for newgroup\n");
X		do_exit (1);
X	}
X	p = atmp->grp;
X	while (*p) {
X		*p = to8lower (*p);
X		++p;
X	}
X	atmp->low = 0;
X	atmp->high = 0;
X	atmp->moderator = NULL;
X	if (ismod) {
X		atmp->aflag[0] = M_MOD;
X		if (!(atmp->moderator = (char **) malloc (sizeof (char *) * 3))) {
X			do_log ("FATAL: Can't alloc for newgroup\n");
X			do_exit (1);
X		}
X		atmp->moderator[0] = NULL;
X	} else
X		atmp->aflag[0] = M_NOT_MOD;
X	atmp->aflag[1] = M_USE;
X	atmp -> kblimit = -1;
X	atmp->next = NULL;
X	if (!hact)
X		hact = atmp;
X	else {
X		aact = hact;
X		while (aact->next)
X			aact = aact->next;
X		aact->next = atmp;
X	}
X# ifdef		HASH_SEARCH
X	atmp -> id = calc_hash (atmp -> grp, TRUE);
X	atmp -> hnext = hashact[atmp -> id % HASH_ACTIVE];
X	hashact[atmp -> id % HASH_ACTIVE] = atmp;
X# endif		/* HASH_SEARCH */
X	act_rewrite = TRUE;
X	do_log ("New newsgroup: %s\n", atmp->grp);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/crct.c' ; then
  echo 'File INEWS/crct.c already exists, overwriting it'
  del 'INEWS/crct.c'
fi
echo Extracting \"'INEWS/crct.c'\"
sed "s/^X//" >'INEWS/crct.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	crct.c_v $
X * Revision 1.1  90/08/31  15:32:51  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: crct.c_v 1.1 90/08/31 15:32:51 cs Exp $";
X# endif		LINT
X# include	<c8type.h>
X# include	<time.h>
X# include	"inews.h"
X
Xextern char	*malloc ();
Xextern char	*strdup ();
X
Xstatic void
Xmake_ctl_ngs (ng)
Xchar *ng;
X{
X	char		*ptr;
X	register char	*p;
X
X	if (ngs)
X		return;
X	if (!(ptr = strdup (ng)))
X		return;
X	skipc (ptr, '\0');
X	p = ptr;
X	while (*p) {
X		*p = to8lower (*p);
X		++p;
X	}
X	if (ngs = (charc *) malloc (sizeof (charc)))
X		if (ngs->text = malloc (strlen (ptr) + 10)) {
X			strcpy (ngs->text, ptr);
X			strcat (ngs->text, CTRL_POSTFIX);
X			ngs->next = NULL;
X		} else {
X			free ((char *) ngs);
X			ngs = NULL;
X		}
X	free (ptr);
X}
X
Xvoid
Xcreate_control_message (msg)
Xchar *msg;
X{
X	register int	t;
X	char		*fn;
X	char		*opts, *pars;
X	time_t		dummy;
X
X	if (do_init (FALSE) < 0)
X		exit (_errmsg (1, "Can't initialize the mess\n"));
X	opts = skipc (msg, ':');
X	pars = skipc (opts, '\0');
X	for (t=0;ctrlcodes[t];++t)
X		if (Strieql (ctrlcodes[t], msg))
X			break;
X	if (!ctrlcodes[t])
X		do_exit (_errmsg (1, "Unknown controlmessage %s.\n", msg));
X	if (t != CC_CANCEL) {
X		if (!isadm)
X			do_exit (_errmsg (1, "You aren't allowed to send control messages\n"));
X		if (! dists) {
X			if (dists = (charc *) malloc (sizeof (charc)))
X				if (dists -> text = strdup (DST_LOCAL))
X					dists -> next = NULL;
X				else {
X					free ((char *) dists);
X					dists = NULL;
X				}
X			if (! dists)
X				do_exit (_errmsg (1, "Can't make distribution %s for %s\n",
X					DST_LOCAL, ctrlcodes[t]));
X		}
X	}
X	switch (t) {
X		case CC_CANCEL:
X			if (!*opts)
X				do_exit (_errmsg (1, "Which article you wish to cancel?\n"));
X			if (!(fn = exists_message_id (opts, &dummy)))
X				do_exit (_errmsg (1, "This article isn't written here\n"));
X			else {
X				get_dists_and_ngs (fn);
X				free (fn);
X			}
X			break;
X		case CC_IHAVE:
X			do_exit (_errmsg (1, "Sorry, this implementation doesn't support %s\n", msg));
X			break;
X		case CC_SENDME:
X			break;
X		case CC_NEWGROUP:
X			if (!*opts)
X				do_exit (_errmsg (1, "Which group do you want to make?\n"));
X			make_ctl_ngs (opts);
X			break;
X		case CC_RMGROUP:
X			if (!*opts)
X				do_exit (_errmsg (1, "Which group do you want to remove?\n"));
X			make_ctl_ngs (opts);
X			break;
X		case CC_SENDSYS:
X		case CC_SENDUUNAME:
X		case CC_VERSION:
X		case CC_CHECKGROUPS:
X			break;
X	}
X	send_control (msg, opts, pars);
X	do_exit (0);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/crm.c' ; then
  echo 'File INEWS/crm.c already exists, overwriting it'
  del 'INEWS/crm.c'
fi
echo Extracting \"'INEWS/crm.c'\"
sed "s/^X//" >'INEWS/crm.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	crm.c_v $
X * Revision 1.2  91/05/22  13:17:29  ud
X * Added auto rmgroup
X * 
X * Revision 1.1  90/08/31  15:32:55  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: crm.c_v 1.2 91/05/22 13:17:29 ud Exp $";
X# endif		LINT
X# include	"inews.h"
X
Xvoid
Xrmgroup (ng)
Xchar *ng;
X{
X	active	*atmp, *at;
X	int	t;
X# ifdef		HASH_SEARCH
X	int	idx;
X	active	*tmp;
X# endif		/* HASH_SEARCH */
X
X	atmp = hact;
X	at = NULL;
X	while (atmp)
X		if (Strieql (atmp->grp, ng))
X			break;
X		else {
X			at = atmp;
X			atmp = atmp->next;
X		}
X# ifndef	AUTO_RMGROUP
X	if (! isadm) {
X
X		if (atmp) {
X			char	*comment[7];
X
X			comment[0] = "A rmgroup control message has arrived here, but you have\n";
X			comment[1] = "automatically remove of newsgroups disabled. So you have\n";
X			comment[2] = "to execute the following command by hand as News Admin:\n";
X			comment[3] = "inews '-c=rmgroup:";
X			comment[4] = ng;
X			comment[5] = "' -d=local </nil\n";
X			comment[6] = NULL;
X			mail_to (news_owner, NULL, "Control Message: rmgroup", ng, NULL, comment);
X		}
X		return;
X	}
X# endif		/* AUTO_RMGROUP */
X
X	if (atmp) {
X		if (at)
X			at->next = atmp->next;
X		else
X			hact = hact->next;
X		make_fn (ng);
X		unlink_in_newsdir_dir (ng);
X		free (atmp->grp);
X		if (atmp->moderator) {
X			t = 0;
X			while (atmp->moderator[t]) {
X				free (atmp->moderator[t]);
X				++t;
X			}
X		}
X		free ((char *) atmp->moderator);
X# ifdef		HASH_SEARCH
X		idx = atmp -> id % HASH_ACTIVE;
X		at = NULL;
X		for (tmp = hashact[idx]; tmp; )
X			if (tmp == atmp)
X				break;
X			else {
X				at = tmp;
X				tmp = tmp -> hnext;
X			}
X		if (tmp)
X			if (at)
X				at -> hnext = atmp -> hnext;
X			else
X				hashact[idx] = atmp -> next;
X# endif		/* HASH_SEARCH */
X		free ((char *) atmp);
X		act_rewrite = TRUE;
X		do_log ("Rmgroup: %s\n", ng);
X	} else
X		do_log ("Group %s doesn't exists (rmgroup)\n", ng);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/crth.c' ; then
  echo 'File INEWS/crth.c already exists, overwriting it'
  del 'INEWS/crth.c'
fi
echo Extracting \"'INEWS/crth.c'\"
sed "s/^X//" >'INEWS/crth.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log:	crth.c_v $
X * Revision 1.1  90/08/31  15:32:59  cs
X * Initial revision
X * 
X */
X# ifndef	LINT
Xstatic char rcsid[] = "$Id: crth.c_v 1.1 90/08/31 15:32:59 cs Exp $";
X# endif		LINT
X# include	<time.h>
X# include	<pwd.h>
X# include	"inews.h"
X
Xextern char	*getenv ();
Xextern char	*malloc ();
X
Xchar *
Xmake_own_address (need_fullname)
Xint need_fullname;
X{
X	char		*fullname;
X	struct passwd	*pw;
X	struct gecos	*gc;
X	char		*buf;
X
X	fullname = NULL;
X	if (need_fullname) {
X		setpwent ();
X		if ((pw = getpwnam (user)) && pw->pw_gecos && (gc = getgecos (pw->pw_gecos)) && (gc->fullname && *gc->fullname))
X			fullname = gc->fullname;
X		endpwent ();
X	}
X	if (!fullname)
X		if (!(fullname = getenv ("NAME")))
X			fullname = getenv ("FULLNAME");
X	if (buf = malloc (strlen (user) + strlen (fhost) + 4 + (fullname ? strlen (fullname) + 8 : 0))) {
X		strcpy (buf, user);
X		strcat (buf, "@");
X		strcat (buf, fhost);
X		if (fullname) {
X			strcat (buf, " (");
X			strcat (buf, fullname);
X			strcat (buf, ")");
X		}
X	}
X	return (buf);
X}
X
Xint
Xcreate_header (fornews, interactive)
Xint fornews;
Xint interactive;
X{
X	char		*buf;
X	time_t		tim;
X	char		*org;
X	char		*tmp;
X	struct passwd	*pw;
X	struct gecos	*gc;
X
X	if (!(buf = malloc (512)))
X		return (-1);
X	if (fornews)
X		insert_header (H_PATH, user, TRUE);
X	sprintf (buf, "%s@%s", user, fhost);
X	if (tmp = find_address_hl (H_FROM)) {
X		if (Stricmp (tmp, buf)) {
X			insert_header (H_REPLY_TO, tmp, interactive);
X			if (tmp = make_own_address (TRUE)) {
X				insert_header (H_SENDER, tmp, TRUE);
X				free (tmp);
X			} else
X				insert_header (H_SENDER, buf, TRUE);
X		}
X		free (tmp);
X	}
X	org = NULL;
X	setpwent ();
X	if ((pw = getpwnam (user)) && pw->pw_gecos && (gc = getgecos (pw->pw_gecos)) && (gc->fullname && *gc->fullname)) {
X		strcat (buf, " (");
X		strcat (buf, gc->fullname);
X		strcat (buf, ")");
X		if (gc->organization && *gc->organization)
X			org = gc->organization;
X	} else {
X		if (tmp = make_own_address (FALSE)) {
X			strcpy (buf, tmp);
X			free (tmp);
X		}
X	}
X	endpwent ();
X	insert_header (H_FROM, buf, interactive);
X	time (&tim);
X	strcpy (buf, ntime (&tim));
X	insert_header (H_DATE, buf, interactive);
X	if (!org)
X		org = getenv ("ORGANIZATION");
X	if (org)
X		insert_header (H_ORGANIZATION, org, interactive);
X	free (buf);
X	if (fornews) {
X		if (ngs && (tmp = catcharc (ngs, ","))) {
X			insert_header (H_NEWSGROUPS, tmp, interactive);
X			free (tmp);
X		}
X		if (dists && (tmp = catcharc (dists, ","))) {
X			insert_header (H_DISTRIBUTION, tmp, interactive);
X			free (tmp);
X		}
X		insert_header (H_POSTED, atime (&tim), interactive);
X	} else {
X		if (recv && (tmp = catcharc (recv, ", "))) {
X			insert_header (H_TO, tmp, interactive);
X			free (tmp);
X		}
X	}
X	if (interactive)
X		sort_header (FALSE);
X	return (0);
X}
__END__OF__THIS__FILE__
exit 0
: end of shell archive

-- 
Frank Kaefer # fkk@stasys.sta.sub.org # Starnberg, Germany
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads