Article View: de.comp.sources.os9
Article #9MNews Prerelease Part05/09
From: Frank Kaefer
Date: Wed, 23 Dec 1992 19:41
Date: Wed, 23 Dec 1992 19:41
2007 lines
47510 bytes
47510 bytes
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
Technical Details
Message-ID:
<1hafdfINNpt6@stasys.sta.sub.org>Path:
arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!cs.utexas.edu!sun-barr!news2me.EBay.Sun.COM!seven-up.East.Sun.COM!sungy!stasys!stasys!not-for-mailShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!sparky!uunet!zaphod.mps.ohio-state.edu!cs.utexas.edu!sun-barr!news2me.EBay.Sun.COM!seven-up.East.Sun.COM!sungy!stasys!stasys!not-for-mail From: frank.kaefer@stasys.sta.sub.org (Frank Kaefer) Newsgroups: de.comp.sources.os9,comp.os.os9 Subject: MNews Prerelease Part05/09 Message-ID: <1hafdfINNpt6@stasys.sta.sub.org> Date: 23 Dec 92 19:41:35 GMT Sender: news@stasys.sta.sub.org Followup-To: de.comp.sources.d Organization: Stasys News Server, Starnberg, Germany Lines: 2007 Approved: frank.kaefer@stasys.sta.sub.org (Frank Kaefer) NNTP-Posting-Host: stasys.sta.sub.org