Thread View: de.comp.sources.os9
1 messages
1 total messages
Started by Frank Kaefer
Wed, 23 Dec 1992 19:41
MNews Prerelease Part04/09
Author: Frank Kaefer
Date: Wed, 23 Dec 1992 19:41
Date: Wed, 23 Dec 1992 19:41
2043 lines
45933 bytes
45933 bytes
Submitted-by: Ulrich Dessauer <ud@Nightmare.ddt.sub.org>
Archive-name: mnews/part04
: ----- Cut here ----- Cut here ----- Cut here ----- Cut here -----
: Use sh filename to extract shell archive
: This shell archive contains following files:
: 'INEWS/inrd.c 1557 bytes'
: 'INEWS/limit.c 1752 bytes'
: 'INEWS/list.c 1183 bytes'
: 'INEWS/mail.c 1947 bytes'
: 'INEWS/makh.c 2443 bytes'
: 'INEWS/mcan.c 2482 bytes'
: 'INEWS/mhead.c 1363 bytes'
: 'INEWS/mid.c 3093 bytes'
: 'INEWS/misc.c 5154 bytes'
: 'INEWS/mit.c 314 bytes'
: 'INEWS/oart.c 1037 bytes'
: 'INEWS/ohist.c 3849 bytes'
: 'INEWS/pargs.c 6543 bytes'
: 'INEWS/pit.c 1246 bytes'
: 'INEWS/pmail.c 2650 bytes'
:
if test -f 'INEWS/inrd.c' ; then
echo 'File INEWS/inrd.c already exists, overwriting it'
del 'INEWS/inrd.c'
fi
echo Extracting \"'INEWS/inrd.c'\"
sed "s/^X//" >'INEWS/inrd.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: inrd.c_v $
X * Revision 1.2 91/05/22 13:04:04 ud
X * Added flag driven character conversation
X *
X * Revision 1.1 90/08/31 15:34:22 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: inrd.c_v 1.2 91/05/22 13:04:04 ud Exp $";
X# endif LINT
X# include "inews.h"
X
Xint
Xreadin (fd, buf, len)
Xregister int fd;
Xregister char *buf;
Xregister int len;
X{
X register int n, siz;
X register char *ptr;
X
X ptr = buf;
X siz = 0;
X while ((n = readln (fd, ptr, len)) > 0) {
X siz += n;
X len -= n;
X if (catlines && (n > 1) && (ptr[n-2] == '\\') && (ptr[n-1] == '\n')) {
X ptr += (n - 2);
X len += 2;
X siz -= 2;
X } else if ((ptr[n-1] == '\n') || (len <= 0))
X break;
X else
X ptr += n;
X }
X if (conv_it && doconv && (siz > 0))
X conv_charset (buf, siz);
X return (siz);
X}
X
Xchar *
Xreadbuf (fd, len)
Xregister int fd;
Xregister int *len;
X{
X static char *buf = NULL;
X static int size = 0;
X register char *ptr;
X register int n, siz;
X
X siz = 0;
X ptr = buf;
X do {
X if (siz >= size) {
X size += 256;
X if (! (buf = realloc (buf, size + 8))) {
X size = 0;
X return (NULL);
X }
X ptr = buf + siz;
X }
X if ((n = readln (fd, ptr, size - siz)) > 0) {
X ptr += n;
X siz += n;
X if (*(ptr - 1) == '\n') {
X if (catlines && (n + siz > 1) && (*(ptr - 2) == '\\')) {
X ptr -= 2;
X n -= 2;
X siz -= 2;
X } else
X break;
X }
X } else {
X *ptr = '\0';
X break;
X }
X } while (1);
X if (len)
X *len = siz;
X if (siz) {
X *ptr = '\0';
X if (conv_it && doconv)
X conv_charset (buf, siz);
X return (buf);
X } else
X return (NULL);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/limit.c' ; then
echo 'File INEWS/limit.c already exists, overwriting it'
del 'INEWS/limit.c'
fi
echo Extracting \"'INEWS/limit.c'\"
sed "s/^X//" >'INEWS/limit.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: limit.c_v $
X * Revision 1.1 90/08/31 15:34:26 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: limit.c_v 1.1 90/08/31 15:34:26 cs Exp $";
X# endif LINT
X# include <modes.h>
X# include "inews.h"
X
Xextern char *malloc ();
Xextern char *strdup ();
X
Xcharc *
Xget_limit_newsgroups ()
X{
X register int fd;
X register char *buf;
X int n;
X charc *tmp, *lhead, *lprev;
X char *prefix;
X char *ptmp, *ctmp;
X
X lhead = NULL;
X lprev = NULL;
X if ((fd = open (CHK_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 prefix = skipc (buf, '\0');
X if (!dists) {
X if (Stricmp (buf, DST_WORLD))
X continue;
X } else {
X tmp = dists;
X while (tmp)
X if (Strieql (tmp->text, buf))
X break;
X else
X tmp = tmp->next;
X if (!tmp)
X continue;
X }
X ptmp = prefix;
X while (ctmp = skipc (ptmp, ',')) {
X tmp = lhead;
X while (tmp)
X if (Strieql (tmp->text, ptmp))
X break;
X else
X tmp = tmp->next;
X if ((!tmp) && (tmp = (charc *) malloc (sizeof (charc))))
X if (tmp->text = strdup (ptmp)) {
X tmp->next = NULL;
X if (!lprev)
X lhead = tmp;
X else
X lprev->next = tmp;
X lprev = tmp;
X } else
X free ((char *) tmp);
X if (!ctmp[0])
X break;
X ptmp = ctmp;
X }
X }
X catlines = FALSE;
X close (fd);
X return (lhead);
X}
X
Xint
Xcheck_limit (lm, s)
Xregister charc *lm;
Xregister char *s;
X{
X if (!lm)
X return (TRUE);
X while (lm) {
X if (lm -> text[0] == '!') {
X if (_cmpnam (s, lm -> text + 1, strlen (lm -> text + 1)) == 0) {
X lm = NULL;
X break;
X }
X } else if (_cmpnam (s, lm->text, strlen (lm->text)) == 0)
X break;
X lm = lm->next;
X }
X return (lm ? TRUE : FALSE);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/list.c' ; then
echo 'File INEWS/list.c already exists, overwriting it'
del 'INEWS/list.c'
fi
echo Extracting \"'INEWS/list.c'\"
sed "s/^X//" >'INEWS/list.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: list.c_v $
X * Revision 1.1 91/05/22 13:35:52 ud
X * Initial revision
X *
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: list.c_v 1.1 91/05/22 13:35:52 ud Exp $";
X# endif LINT
X# include <stdio.h>
X# include "inews.h"
X
X# ifdef IN_MEMORY
Xvoid
Xadd_list (l, s, n)
Xlist **l;
Xchar *s;
Xint n;
X{
X list *tmp;
X register list *run;
X
X if (tmp = (list *) malloc (sizeof (list)))
X if (tmp->text = malloc (n + 2)) {
X strncpy (tmp->text, s, n);
X tmp->text[n] = '\0';
X tmp->len =
X tmp->siz = n;
X tmp->next = NULL;
X if (!*l)
X *l = tmp;
X else {
X for (run = *l; run->next; run = run->next)
X ;
X run->next = tmp;
X }
X } else {
X free ((char *) tmp);
X tmp = NULL;
X }
X if (! tmp) {
X do_log ("Out of memory in add_list ()\n");
X do_exit (1);
X }
X}
X
Xvoid
Xfree_list (l)
Xregister list *l;
X{
X register list *tmp;
X
X while (l) {
X tmp = l;
X l = l->next;
X free (tmp->text);
X free ((char *) tmp);
X }
X}
X
Xlist *
Xget_file (fn)
Xchar *fn;
X{
X FILE *fp;
X char buf[256];
X int n;
X list *l;
X
X if (! (fp = fopen (fn, "r")))
X return (NULL);
X l = NULL;
X while (fgets (buf, 256, fp))
X add_list (&l, buf, strlen (buf));
X fclose (fp);
X return (l);
X}
X# endif /* IN_MEMORY */
__END__OF__THIS__FILE__
if test -f 'INEWS/mail.c' ; then
echo 'File INEWS/mail.c already exists, overwriting it'
del 'INEWS/mail.c'
fi
echo Extracting \"'INEWS/mail.c'\"
sed "s/^X//" >'INEWS/mail.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: mail.c_v $
X * Revision 1.3 91/05/22 13:18:02 ud
X * Added in memory option
X *
X * Revision 1.2 90/12/01 15:48:39 ud
X * A new switch had been added to allow sending a copy of a mail
X * to the local postmaster
X *
X * Revision 1.1 90/08/31 15:34:29 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: mail.c_v 1.3 91/05/22 13:18:02 ud Exp $";
X# endif LINT
X# include <stdio.h>
X# include "inews.h"
X
Xextern char *malloc ();
Xextern FILE *xpopen ();
X
Xvoid
Xmail_to (to, reply_to, subj, subjv, fn, comment)
Xchar *to, *reply_to, *subj, *subjv;
X# ifndef IN_MEMORY
Xchar *fn;
X# else /* IN_MEMORY */
Xlist *fn;
X# endif /* IN_MEMORY */
Xchar **comment;
X{
X FILE *pp;
X# ifndef IN_MEMORY
X FILE *fp;
X# else /* IN_MEMORY */
X list *ltmp;
X# endif /* IN_MEMORY */
X char buf[80];
X char *cmd;
X int t;
X
X if (!(cmd = malloc (strlen (to) + 50)))
X return;
X# ifdef COPY_TO_POSTMASTER
X sprintf (cmd, "rmail postmaster '%s'", to);
X# else /* COPY_TO_POSTMASTER */
X sprintf (cmd, "rmail '%s'", to);
X# endif /* COPY_TO_POSTMASTER */
X if (!(pp = xpopen (cmd, "w"))) {
X do_log ("FATAL: Can't fork '%s'\n", cmd);
X return;
X }
X fprintf (pp, "From: %s@%s (News Subsystem)\n", news_owner, fhost);
X fprintf (pp, "To: %s\n", to);
X# ifdef COPY_TO_POSTMASTER
X fprintf (pp, "Cc: postmaster@%s\n", fhost);
X# endif /* COPY_TO_POSTMASTER */
X if (reply_to)
X fprintf (pp, "Reply-To: %s\n", reply_to);
X else
X fprintf (pp, "Reply-To: Postmaster@%s\n", fhost);
X fprintf (pp, "Subject: %s %s\n", subj, subjv ? subjv : "");
X fprintf (pp, "\n");
X if (comment && comment[0]) {
X for (t=0;comment[t];++t)
X fputs (comment[t], pp);
X fputs ("\n\n", pp);
X }
X# ifndef IN_MEMORY
X if (fn && (fp = fopen (fn, "r"))) {
X while (fgets (buf, 78, fp))
X fputs (buf, pp);
X fclose (fp);
X }
X# else /* IN_MEMORY */
X for (ltmp = fn; ltmp; ltmp = ltmp->next)
X fwrite (ltmp->text, sizeof (char), ltmp->len, pp);
X# endif /* IN_MEMORY */
X pclose (pp);
X free (cmd);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/makh.c' ; then
echo 'File INEWS/makh.c already exists, overwriting it'
del 'INEWS/makh.c'
fi
echo Extracting \"'INEWS/makh.c'\"
sed "s/^X//" >'INEWS/makh.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: makh.c_v $
X * Revision 1.1 90/08/31 15:34:33 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: makh.c_v 1.1 90/08/31 15:34:33 cs Exp $";
X# endif LINT
X# include <time.h>
X# include "inews.h"
X
Xextern char *index ();
Xextern char *malloc ();
Xextern char *strdup ();
X
Xcharc *
Xmake_head (id)
Xint id;
X{
X charc *dest;
X register char *p1, *from;
X time_t tim;
X
X if (!(dest = (charc *) malloc (sizeof (charc))))
X return (NULL);
X dest->next = NULL;
X switch (id) {
X case H_PATH:
X if (!(from = find_address ())) {
X do_log ("No Path: Field found!\n");
X do_exit (1);
X }
X if (!(dest->text = malloc (strlen (from) + strlen (hlines[H_PATH] + 2) + 6))) {
X do_log ("Unable to alloc while creating Path:\n");
X do_exit (1);
X }
X strcpy (dest->text, hlines[H_PATH] + 2);
X strcat (dest->text, " ");
X strcat (dest->text, from);
X free (from);
X break;
X case H_FROM:
X if (!(from = find_from (FALSE))) {
X do_log ("No From: Field found!\n");
X do_exit (1);
X }
X if (!(dest->text = malloc (strlen (from) + strlen (hlines[H_FROM] + 2) + 6))) {
X do_log ("Can't alloc memory when creating From: Field\n");
X do_exit (1);
X }
X strcpy (dest->text, hlines[H_FROM] + 2);
X strcat (dest->text, " ");
X strcat (dest->text, from);
X break;
X case H_SUBJECT:
X if (!(dest->text = strdup ("Subject: [none]"))) {
X do_log ("Can't alloc memory in Field Subject:\n");
X do_exit (1);
X }
X break;
X case H_NEWSGROUPS:
X do_log ("No Newsgroups: Field found!\n");
X do_exit (1);
X break;
X case H_MESSAGE_ID:
X p1 = get_msgid ();
X if (!(dest->text = malloc (strlen (p1) + strlen (hlines[H_MESSAGE_ID] + 2) + 6))) {
X do_log ("Can't alloc memory in Field Message-ID:\n");
X do_exit (1);
X }
X strcpy (dest->text, hlines[H_MESSAGE_ID] + 2);
X strcat (dest->text, " ");
X strcat (dest->text, p1);
X break;
X case H_DATE:
X if (!(dest->text = malloc (60))) {
X do_log ("Can't alloc memory in Field Date\n");
X do_exit (1);
X }
X strcpy (dest->text, hlines[H_DATE] + 2);
X strcat (dest->text, " ");
X time (&tim);
X strcat (dest->text, ntime (&tim));
X break;
X case H_LINES:
X if (!(dest->text = malloc (strlen (hlines[H_LINES]) + 20))) {
X do_log ("Can't alloc memory in Lines: field.\n");
X do_exit (1);
X }
X sprintf (dest->text, "%s %d", hlines[H_LINES] + 2, lines);
X break;
X default:
X free ((char *) dest);
X dest = NULL;
X break;
X }
X return (dest);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/mcan.c' ; then
echo 'File INEWS/mcan.c already exists, overwriting it'
del 'INEWS/mcan.c'
fi
echo Extracting \"'INEWS/mcan.c'\"
sed "s/^X//" >'INEWS/mcan.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: mcan.c_v $
X * Revision 1.1 90/08/31 15:34:37 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: mcan.c_v 1.1 90/08/31 15:34:37 cs Exp $";
X# endif LINT
X# include <modes.h>
X# include "inews.h"
X
Xextern char *malloc ();
Xextern char *rindex ();
Xextern char *strdup ();
X
Xint
Xmay_cancel (fn)
Xchar *fn;
X{
X int fd;
X char *buf;
X char *from, *sender, *reply;
X char *tfrom, *tsender;
X char *news, *newsorig, *ptr;
X int n;
X int ret;
X
X if (!(buf = malloc (strlen (newsdir) + strlen (fn) + 8))) {
X do_log ("FATAL: Can't alloc in may_cancel()\n");
X do_exit (1);
X }
X strcpy (buf, newsdir);
X strcat (buf, "/");
X strcat (buf, fn);
X fd = open (buf, S_IREAD);
X free (buf);
X if (fd < 0)
X return (TRUE);
X if (!(tfrom = find_address_hl (H_FROM)))
X tfrom = find_address_hl (H_REPLY_TO);
X tsender = find_address_hl (H_SENDER);
X if ((!tfrom) && (!tsender)) {
X close (fd);
X do_log ("No from/reply-to/sender in cancel message\n");
X return (FALSE);
X }
X if ((!tfrom) || (!(ptr = rindex (tfrom, '@')))) {
X if (tsender && (ptr = rindex (tsender, '@')))
X newsorig = tsender;
X } else
X newsorig = tfrom;
X news = NULL;
X if (ptr && (Strnieql (news_owner, newsorig, strlen (news_owner)) && newsorig[strlen (news_owner)] == '@'))
X news = strdup (ptr + 1);
X from = NULL;
X reply = NULL;
X sender = NULL;
X conv_it = TRUE;
X while (buf = readbuf (fd, & n)) {
X if (n == 1)
X break;
X buf[n - 1] = '\0';
X if ((!from) && (Strnieql (buf, hlines[H_FROM] + 2, strlen (hlines[H_FROM] + 2))))
X from = extract_address (buf);
X else if ((!reply) && (Strnieql (buf, hlines[H_REPLY_TO] + 2, strlen (hlines[H_REPLY_TO] + 2))))
X reply = extract_address (buf);
X else if ((!sender) && (Strnieql (buf, hlines[H_SENDER] + 2, strlen (hlines[H_SENDER] + 2))))
X sender = extract_address (buf);
X }
X conv_it = FALSE;
X close (fd);
X if (reply)
X if (!from)
X from = reply;
X else
X free (reply);
X ret = FALSE;
X if (tsender && sender)
X ret = Strieql (sender, tsender);
X if ((!ret) && (tsender && from))
X ret = Strieql (from, tsender);
X if ((!ret) && (tfrom && sender))
X ret = Strieql (sender, tfrom);
X if ((!ret) && (tfrom && from))
X ret = Strieql (from, tfrom);
X if ((!ret) && news) {
X if ((!sender) || (!(ptr = rindex (sender, '@'))))
X if (from)
X ptr = rindex (from, '@');
X if (ptr)
X ret = Strieql (news, ptr + 1);
X }
X if (from)
X free (from);
X if (tfrom)
X free (tfrom);
X if (sender)
X free (sender);
X if (tsender)
X free (tsender);
X if (news)
X free (news);
X return (ret);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/mhead.c' ; then
echo 'File INEWS/mhead.c already exists, overwriting it'
del 'INEWS/mhead.c'
fi
echo Extracting \"'INEWS/mhead.c'\"
sed "s/^X//" >'INEWS/mhead.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: mhead.c_v $
X * Revision 1.1 90/08/31 15:34:42 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: mhead.c_v 1.1 90/08/31 15:34:42 cs Exp $";
X# endif LINT
X# include <c8type.h>
X# include "inews.h"
X
Xextern char *malloc ();
Xextern char *strdup ();
X
Xcharc *
Xsplit_fields (s, lc)
Xchar *s;
Xint lc;
X{
X charc *top, *tmp, *act;
X char *buf;
X register char *sav, *ptr, *p;
X int len;
X
X top = NULL;
X act = NULL;
X if (!(buf = strdup (s))) {
X do_log ("Can't alloc memory in split_fields\n");
X do_exit (1);
X }
X ptr = buf;
X while (is8space (*ptr) || (*ptr == ','))
X ++ptr;
X while (*ptr) {
X sav = ptr;
X while (*ptr && (!is8space (*ptr)) && (*ptr != ','))
X ++ptr;
X if (*ptr) {
X *ptr++ = '\0';
X while (is8space (*ptr) || (*ptr == ','))
X ++ptr;
X }
X if (!sav[0])
X continue;
X if (!(tmp = (charc *) malloc (sizeof (charc)))) {
X do_log ("Can't alloc memory during split_fields\n");
X do_exit (1);
X }
X len = strlen (sav);
X if (len < 10)
X len = 10;
X len += 2;
X if (!(tmp->text = malloc (len))) {
X do_log ("Can't alloc memory during split_fields\n");
X do_exit (1);
X } else
X strcpy (tmp->text, sav);
X p = tmp->text;
X if (lc)
X while (*p) {
X *p = to8lower (*p);
X ++p;
X }
X tmp->nr = 0;
X tmp->next = NULL;
X if (!act)
X top = tmp;
X else
X act->next = tmp;
X act = tmp;
X }
X free (buf);
X return (top);
X}
X
__END__OF__THIS__FILE__
if test -f 'INEWS/mid.c' ; then
echo 'File INEWS/mid.c already exists, overwriting it'
del 'INEWS/mid.c'
fi
echo Extracting \"'INEWS/mid.c'\"
sed "s/^X//" >'INEWS/mid.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: mid.c_v $
X * Revision 1.3 91/05/22 13:35:19 ud
X * Added short message-ids
X *
X * Revision 1.2 91/01/02 21:23:12 ud
X * Added ndbm for history support
X *
X * Revision 1.1 90/08/31 15:34:45 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: mid.c_v 1.3 91/05/22 13:35:19 ud Exp $";
X# endif LINT
X# include <c8type.h>
X# include <modes.h>
X# include <time.h>
X# include "inews.h"
X# include "hist.h"
X
X# define SEQ ".seq"
X
Xextern char *malloc ();
Xextern char *strdup ();
X
Xstatic int yetcreated = FALSE;
Xstatic char msgid[128];
X
X# ifdef SHORT_MSGID
Xstatic char msgmap[] = {
X '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',',
X '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8',
X '9', ':', ';', '=', '?', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
X 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
X 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', ']', '^', '_', '`',
X 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
X 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
X 'y', 'z', '{', '|', '}', '~'
X};
X# endif /* SHORT_MSGID */
X
Xchar *
Xget_msgid ()
X{
X int fd;
X unsigned int id;
X register char *ptr;
X
X if (yetcreated)
X return (msgid);
X if (access (SEQ, 0) < 0) {
X fd = create (SEQ, S_IWRITE, 03);
X id = 0;
X } else if ((fd = open (SEQ, S_IREAD | S_IWRITE)) != -1) {
X if (read (fd, &id, sizeof (int)) != sizeof (int))
X id = 0;
X lseek (fd, 0, 0);
X }
X ++id;
X if (fd != -1) {
X write (fd, &id, sizeof (int));
X close (fd);
X }
X yetcreated = TRUE;
X# ifndef SHORT_MSGID
X sprintf (msgid, "<%d@%s>", id, fhost);
X# else /* SHORT_MSGID */
X ptr = msgid;
X *ptr++ = '<';
X while (id != 0) {
X *ptr++ = msgmap[id % sizeof (msgmap)];
X id /= sizeof (msgmap);
X }
X sprintf (ptr, "@%s>", fhost);
X# endif /* SHORT_MSGID */
X return (msgid);
X}
X
Xvoid
Xset_msgid (s)
Xchar *s;
X{
X if (!yetcreated) {
X strncpy (msgid, s, 120);
X yetcreated = TRUE;
X }
X}
X
Xvoid
Xclear_msgid ()
X{
X yetcreated = FALSE;
X}
X
Xchar *
Xexists_message_id (id, tim)
Xchar *id;
Xtime_t *tim;
X{
X# ifndef USE_NDBM
X register char *p1, *p2;
X char *buf;
X int fd;
X char *sav;
X char *fn;
X char *flag;
X int n;
X
X if ((fd = open_hist (id, S_IREAD)) < 0)
X return (NULL);
X while (buf = readbuf (fd, & n)) {
X buf[n-1] = '\0';
X sav = skipc (buf, '\0');
X flag = skipc (sav, '\0');
X if (Mideql (sav, id)) {
X fn = skipc (flag, '\0');
X break;
X }
X }
X close (fd);
X if (n > 0) {
X *tim = atol (buf);
X skipc (fn, '\0');
X p1 = buf;
X p2 = fn;
X while (*p2)
X *p1++ = *p2++;
X *p1 = '\0';
X return (strdup (buf));
X }
X return (NULL);
X# else /* USE_NDBM */
X register char *ptr;
X
X if (!(db = open_hist (S_IREAD)))
X return (NULL);
X key.dptr = lower_mid (id);
X key.dsize = strlen (id) + 1;
X dat = dbm_fetch (db, key);
X dbm_close (db);
X if (dat.dptr == NULL)
X return (NULL);
X memcpy (&hist, dat.dptr, sizeof (history));
X skipc (hist.fns, '\0');
X *tim = hist.tim;
X return (strdup (hist.fns));
X# endif /* USE_NDBM */
X}
X
Xvoid
Xcheck_message_id (id)
Xchar *id;
X{
X time_t dummy;
X
X if (exists_message_id (id, &dummy)) {
X do_log ("Duplicated article received '%s'\n", id);
X do_exit (0);
X }
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/misc.c' ; then
echo 'File INEWS/misc.c already exists, overwriting it'
del 'INEWS/misc.c'
fi
echo Extracting \"'INEWS/misc.c'\"
sed "s/^X//" >'INEWS/misc.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: misc.c_v $
X * Revision 1.2 91/05/22 13:09:21 ud
X * Added 8 bit support and assembler routines
X *
X * Revision 1.1 90/08/31 15:34:49 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: misc.c_v 1.2 91/05/22 13:09:21 ud Exp $";
X# endif LINT
X# include <c8type.h>
X# include <modes.h>
X# include <time.h>
X# include "inews.h"
X
Xextern char *malloc ();
Xextern char *strdup ();
X
Xstatic char *months[] = {
X "Jan", "Feb", "Mar", "Apr", "May", "Jun",
X "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", NULL
X};
X
X# ifndef USE_ASM
Xchar *
Xskipc (s, c)
Xregister char *s;
Xregister char c;
X{
X if (c)
X while (*s && (*s != c))
X ++s;
X else
X while (*s && (!is8space (*s)))
X ++s;
X if (*s) {
X *s++ = '\0';
X while (is8space (*s))
X ++s;
X }
X return (s);
X}
X
Xchar *
Xskipn (s, c)
Xregister char *s;
Xregister char c;
X{
X if (c)
X while (*s && (*s != c))
X ++s;
X else
X while (*s && (!is8space (*s)))
X ++s;
X if (*s) {
X ++s;
X while (is8space (*s))
X ++s;
X }
X return (s);
X}
X# else /* USE_ASM */
X# asm
Xxskip:
X move.l d0,a0
X andi.l #255,d1
X tst.b d1
X bne.b skip2
Xl1
X tst.b (a0)
X beq.b fin
X move.b (a0),d1
X lea.l _ch8codes(a6),a1
X btst.b #4,0(a1,d1)
X bne.b fin
X adda.l #1,a0
X bra.b l1
Xskip2
X tst.b (a0)
X beq.b fin
X cmp.b (a0),d1
X beq.b fin
X adda.l #1,a0
X bra.b skip2
Xfin
X tst.b (a0)
X beq.s finfin
X tst.b d2
X beq.s no_clr
X clr.b (a0)
Xno_clr
X addq.l #1,a0
Xfinfin
X tst.b (a0)
X beq.b lastfin
X move.b (a0),d2
X lea.l _ch8codes(a6),a1
X btst.b #4,0(a1,d2)
X beq.b lastfin
X adda.l #1,a0
X bra.b finfin
Xlastfin
X move.l a0,d0
X rts
X*
Xskipc:
X move.l d2,-(sp)
X move.l #1,d2
Xdoit
X bsr xskip
X move.l (sp)+,d2
X rts
Xskipn:
X move.l d2,-(sp)
X clr.l d2
X bra doit
X# endasm
X# endif /* USE_ASM */
X
Xchar *
Xitoa (n)
Xint n;
X{
X static char nbuf[34];
X register char *p;
X int prefix;
X
X p = nbuf + 32;
X *p = '\0';
X if (n == 0)
X *--p = '0';
X else {
X if (n < 0) {
X n = -n;
X prefix = -1;
X } else
X prefix = 1;
X while (n > 0) {
X *--p = (n % 10) + '0';
X n = n / 10;
X }
X if (prefix < 0)
X *--p = '-';
X }
X return (p);
X}
X
Xvoid
Xfree_field (fld)
Xregister charc *fld;
X{
X register charc *tmp;
X
X while (fld) {
X tmp = fld->next;
X free (fld->text);
X free ((char *) fld);
X fld = tmp;
X }
X}
X
Xcharc *
Xcopy_field (fld)
Xregister charc *fld;
X{
X register charc *hd, *tmp, *cur;
X register int err;
X
X cur = NULL;
X err = 0;
X while (fld) {
X if (tmp = (charc *) malloc (sizeof (charc)))
X if (tmp->text = strdup (fld->text)) {
X tmp->nr = fld->nr;
X tmp->next = NULL;
X if (!cur)
X hd = tmp;
X else
X cur->next = tmp;
X cur = tmp;
X } else {
X ++err;
X break;
X }
X else {
X ++err;
X break;
X }
X fld = fld->next;
X }
X if (err && hd) {
X free_field (hd);
X hd = NULL;
X }
X return (hd);
X}
X
Xchar *
Xcatcharc (hd, sp)
Xcharc *hd;
Xchar *sp;
X{
X register charc *tmp;
X register char *p1, *p2;
X char *ptr;
X int siz;
X register int slen;
X
X slen = strlen (sp);
X tmp = hd;
X siz = 0;
X while (tmp) {
X siz += strlen (tmp->text) + slen + 4;
X tmp = tmp->next;
X }
X if (!(ptr = malloc (siz + 10)))
X return (NULL);
X p1 = ptr;
X tmp = hd;
X while (tmp) {
X if (tmp != hd) {
X p2 = sp;
X while (*p2)
X *p1++ = *p2++;
X }
X p2 = tmp->text;
X while (*p2)
X *p1++ = *p2++;
X tmp = tmp->next;
X }
X *p1 = '\0';
X return (ptr);
X}
X
Xchar *
Xget_realfilename (fn, fd)
Xchar *fn;
Xint *fd;
X{
X char *newfn;
X int len;
X int n;
X
X if (!(newfn = malloc (512)))
X return (NULL);
X if ((*fd = open (fn, S_IREAD)) < 0) {
X free (newfn);
X return (NULL);
X }
X len = strlen (LINK_ID);
X if (read (*fd, newfn, len) == len) {
X if (Strneql (newfn, LINK_ID, len)) {
X if ((n = readln (*fd, newfn, 500)) > 0) {
X newfn[n - 1] = '\0';
X close (*fd);
X if ((*fd = open (newfn, S_IREAD)) < 0) {
X free (newfn);
X newfn = NULL;
X }
X return (newfn);
X } else {
X free (newfn);
X close (*fd);
X return (NULL);
X }
X } else {
X lseek (*fd, 0, 0);
X strcpy (newfn, fn);
X return (newfn);
X }
X } else {
X close (*fd);
X free (newfn);
X return (NULL);
X }
X}
X
Xchar *
Xmake_realfilename (s, n, fd)
Xchar *s;
Xint n;
Xint *fd;
X{
X char *rfn, *fn;
X
X if (!(rfn = malloc (strlen (s) + 40)))
X return (NULL);
X sprintf (rfn, "%s/%d", s, n);
X make_fn (rfn);
X fn = get_realfilename (rfn, fd);
X free (rfn);
X return (fn);
X}
X
Xchar *
Xntime (tim)
Xtime_t *tim;
X{
X struct tm *tt;
X static char tbuf[64];
X
X if (tt = gmtime (tim)) {
X sprintf (tbuf, "%d %s %04d %02d:%02d:%02d GMT",
X tt->tm_mday,
X months[tt->tm_mon],
X tt->tm_year + 1900,
X tt->tm_hour,
X tt->tm_min,
X tt->tm_sec);
X } else
X strcpy (tbuf, "");
X return (tbuf);
X}
X
X# ifndef SEND_WORLD
Xint
Xdist_is_world ()
X{
X charc *hd;
X charc *ptr;
X register charc *tmp;
X int ret;
X
X ret = TRUE;
X if (hd = get_header_line (H_DISTRIBUTION))
X if (ptr = split_fields (hd->text)) {
X ret = FALSE;
X for (tmp = ptr; tmp; tmp = tmp->next)
X if (Strieql (tmp->text, DST_WORLD)) {
X ret = TRUE;
X break;
X }
X free_field (ptr);
X }
X if (ret)
X block_forward = TRUE;
X return (ret);
X}
X# endif /* SEND_WORLD */
X
X# ifdef HASH_SEARCH
Xhash_t
Xcalc_hash (str, icase)
Xregister char *str;
Xregister int icase;
X{
X register hash_t ret;
X
X ret = 0;
X while (*str)
X ret += (icase ? tolower (*str++) : *str++) & 0xff;
X return (ret);
X}
X# endif /* HASH_SEARCH */
__END__OF__THIS__FILE__
if test -f 'INEWS/mit.c' ; then
echo 'File INEWS/mit.c already exists, overwriting it'
del 'INEWS/mit.c'
fi
echo Extracting \"'INEWS/mit.c'\"
sed "s/^X//" >'INEWS/mit.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: mit.c_v $
X * Revision 1.1 90/08/31 15:34:54 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: mit.c_v 1.1 90/08/31 15:34:54 cs Exp $";
X# endif LINT
X# include "inews.h"
X
Xvoid
Xmail_it (rec)
Xchar *rec;
X{
X mail_to (rec, NULL, "This is a moderated group", NULL, newstmp, NULL);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/oart.c' ; then
echo 'File INEWS/oart.c already exists, overwriting it'
del 'INEWS/oart.c'
fi
echo Extracting \"'INEWS/oart.c'\"
sed "s/^X//" >'INEWS/oart.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log$
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id$";
X# endif LINT
X# include <c8type.h>
X# include <modes.h>
X# include "inews.h"
X
Xextern char *malloc ();
X
Xstatic char *nfn = NULL;
X
Xchar *
Xopen_article (fn, readit)
Xchar *fn;
Xint readit;
X{
X register char *p1, *p2;
X register int n;
X int fd;
X char buf[32];
X
X if (! nfn)
X if (! (nfn = malloc (1024)))
X return (NULL);
X for (p1 = fn, p2 = nfn, n = 0; *p1;)
X if ((*p1 == '/') || (*p1 == '.')) {
X *p2++ = '/';
X ++p1;
X n = 0;
X } else {
X if ((! is8alnum (*p1)) && (! index ("$_.", *p1))) {
X ++p1;
X *p2++ = '_';
X } else
X *p2++ = *p1++;
X if (++n > 26)
X while (*p1 && (*p1 != '/'))
X ++p1;
X }
X *p2 = '\0';
X if (readit && ((fd = open (nfn, S_IREAD)) != -1)) {
X n = strlen (LINK_ID);
X if ((read (fd, buf, n) == n) && Strneql (buf, LINK_ID, n))
X if ((n = read (fd, nfn, 1000)) > 0) {
X nfn[n] = '\0';
X if (access (nfn, 0) == -1)
X n = -1;
X } else
X n = -1;
X close (fd);
X if (n < 0)
X return (open_article (fn, FALSE));
X }
X return (nfn);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/ohist.c' ; then
echo 'File INEWS/ohist.c already exists, overwriting it'
del 'INEWS/ohist.c'
fi
echo Extracting \"'INEWS/ohist.c'\"
sed "s/^X//" >'INEWS/ohist.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: ohist.c_v $
X * Revision 1.4 91/05/22 13:07:32 ud
X * - Included assembler routines
X * - better ndbm support
X *
X * Revision 1.3 91/01/02 21:24:47 ud
X * Added ndbm support for history, optional
X *
X * Revision 1.2 90/12/01 15:45:16 ud
X * Changed generating of filenames for historyfiles to hashing mode
X *
X * Revision 1.1 90/08/31 15:34:57 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: ohist.c_v 1.4 91/05/22 13:07:32 ud Exp $";
X# endif LINT
X# include <c8type.h>
X# include <modes.h>
X# include <direct.h>
X# include "inews.h"
X# include "hist.h"
X
X# ifndef USE_ASM
Xint
XMideql (id1, id2)
Xregister char *id1, *id2;
X{
X register int is_local;
X
X is_local = TRUE;
X while (*id1 && *id2)
X if (is_local ? (*id1 != *id2) : (to8lower (*id1) != to8lower (*id2)))
X return (FALSE);
X else {
X if (*id1 == '@')
X is_local = FALSE;
X ++id1;
X ++id2;
X }
X return (!(*id1 || *id2));
X}
X# else /* USE_ASM */
X# asm
XMideql:
X move.l d2,-(sp)
X move.l d0,a0
X move.l d1,a1
X moveq.l #1,d0
Xloop
X tst.b (a0)
X beq.b fin
X tst.b (a1)
X beq.b fin
X tst.b d0
X beq no_sense
X move.b (a0),d1
X cmp.b (a1),d1
X bne.b fin
X cmp.b #$40,d1
X bne.s reloop
X clr.l d0
Xreloop
X addq.l #1,a0
X addq.l #1,a1
X bra.b loop
Xno_sense
X move.b (a0),d1
X cmp.b #$5a,d1
X bgt.s no1
X cmp.b #$41,d1
X blt.s no1
X and.b #$20,d1
Xno1
X move.b (a1),d2
X cmp.b #$5a,d2
X bgt.s no2
X cmp.b #$41,d2
X blt.s no2
X and.b #$20,d2
Xno2
X cmp.b d0,d1
X beq.b reloop
Xfin
X move.l #1,d0
X move.b (a0),d1
X sub.b (a1),d1
X beq.s Okay
X clr.l d0
XOkay
X move.l (sp)+,d2
X rts
X# endasm
X# endif /* USE_ASM */
X
X# ifndef USE_NDBM
Xint
Xopen_hist (id, mode)
Xchar *id;
Xint mode;
X{
X int fd;
X char fn[80];
X register int is_local;
X register char *ptr;
X register unsigned int count;
X
X ptr = id;
X count = 0;
X is_local = TRUE;
X while (*ptr) {
X count += (is_local ? *ptr : to8lower (*ptr)) & 0xff;
X if (*ptr++ == '@')
X is_local = FALSE;
X }
X sprintf (fn, HIST_FILE, count % HIST_MAXIMUM);
X if ((fd = open (fn, mode)) < 0)
X if (mode & S_IWRITE)
X fd = create (fn, mode, 03);
X return (fd);
X}
X# else /* USE_NDBM */
Xchar *
Xlower_mid (id)
Xchar *id;
X{
X static int siz = 0;
X static char *buf = NULL;
X int len;
X register char *p1, *p2;
X register int is_local;
X
X if ((len = strlen (id)) >= siz) {
X siz = len + 32;
X if (!(buf = realloc (buf, siz + 2)))
X return (NULL);
X }
X is_local = TRUE;
X p1 = id;
X p2 = buf;
X while (*p1) {
X *p2++ = is_local ? *p1 : to8lower (*p1);
X if (*p1++ == '@')
X is_local = FALSE;
X }
X *p2 = '\0';
X return (buf);
X}
X
Xvoid
Xfill_hist ()
X{
X dat.dsize = strlen (hist.fns) + 1 + sizeof (int) + sizeof (time_t);
X dat.dptr = (char *) &hist;
X}
X
Xstatic void
Xcheck_history (suffix)
Xchar *suffix;
X{
X int fd, fdo;
X char fn[40];
X char *buf;
X int n, siz;
X struct fildes fdes;
X
X strcpy (fn, HISTORY);
X strcat (fn, suffix);
X if ((fd = open (fn, 0)) != -1) {
X if (_gs_gfd (fd, &fdes, sizeof (struct fildes)) != -1) {
X for (t = 0; t < 48; ++t)
X if (! (fdes.fdseg[t].addr[0] ||
X fdes.fdseg[t].addr[0] ||
X fdes.fdseg[t].addr[0]))
X break;
X if (t > 43) {
X do_log ("%s has %d file segments\n", fn, t);
X if (rename (fn, TEMP_FILE) == 0) {
X if ((fdo = create (fn, S_IWRITE | S_ISIZE, 013, _gs_size (fd)) != -1) {
X siz = 5000;
X do {
X if (! (buf = malloc (siz + 32)))
X siz -= 1000;
X } while ((! buf) && (siz > 0));
X if (! buf) {
X buf = &c;
X siz = 1;
X }
X while ((n = read (fd, buf, siz)) > 0)
X write (fdo, buf, n);
X close (fdo);
X if (siz > 1)
X free (buf);
X } else
X rename (TEMP_FILE, fn);
X } else
X do_log ("rename (%s, %s) failed\n", fn, TEMP_FILE);
X }
X close (fd);
X }
X}
X
Xvoid
Xcheck_history_size ()
X{
X check_history (DIREXT);
X check_history (PAGEXT);
X}
X
XDBM *
Xopen_hist (mode)
Xint mode;
X{
X return (dbm_open (HISTORY, mode, 013));
X}
X# endif /* USE_NDBM */
__END__OF__THIS__FILE__
if test -f 'INEWS/pargs.c' ; then
echo 'File INEWS/pargs.c already exists, overwriting it'
del 'INEWS/pargs.c'
fi
echo Extracting \"'INEWS/pargs.c'\"
sed "s/^X//" >'INEWS/pargs.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: pargs.c_v $
X * Revision 1.3 91/05/22 13:10:38 ud
X * Added ndbm file checks
X *
X * Revision 1.2 90/12/01 15:42:35 ud
X * Added new option for rebuildig history
X * Currently only for converting from old format to new
X * hashing format possible
X *
X * Revision 1.1 90/08/31 15:35:01 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: pargs.c_v 1.3 91/05/22 13:10:38 ud Exp $";
X# endif LINT
X# include "inews.h"
X
Xextern char *rindex ();
Xextern char *strdup ();
X
Xstatic char *help[] = {
X "Syntax: inews [<opts>]\n",
X "Function: stores and forwards news articles\n",
X "Options:\n",
X " -a runs in admin mode (execute control-messages)\n",
X " -e=<days> removes all article that are longer than <days> on the machine\n",
X " -E=<days> remove older entries from the history file (to use with `-e')\n",
X " -r rebuilds the active file\n",
X " -H rebuilds all history files (warning! slow!)\n",
X# ifdef USE_NDBM
X " -C check DBM history files for file segment list\n",
X# endif /* USE_NDBM */
X " -h create a new message (insert missing header lines)\n",
X " -t enable translation of 8 bit chars even w/o `-h' option\n",
X " -D enable auto.determination of distribution w/o `-h'\n",
X " -v verbose mode, prints log messages on screen, too\n",
X " -c=<ctrl> send <ctrl> as control message\n",
X " -g=<grps> specify list of groups\n",
X " -d=<dist> specify list of distribution(s)\n",
X "\n",
X " -M=<msgid> retreives the filename for this message id and writes it\n",
X " to stdout (more -M's can be used to get more filenames).\n",
X " -R respool droped articles\n",
X "\n",
X " -m=<mode> mode of user-interface (mode can be `read' or `write'\n",
X " -p=<rec> if mode is <mail> these are the receivers\n",
X NULL
X};
X
Xstatic void
Xusage ()
X{
X register int t;
X
X for (t=0;help[t];++t)
X writeln (2, help[t], strlen (help[t]));
X}
X
Xvoid
Xparse_args (ac, av)
Xint ac;
Xchar *av[];
X{
X register int t;
X register char *ptr;
X charc *tmp, *t2;
X int muid, ruid;
X char *expire, *exphist;
X char *ctrlmsg;
X int rebuild_active;
X int rebuild_history;
X int check_dbmsiz;
X char *srcfn;
X charc *retr_msgid;
X int mode;
X int rev_conv;
X int do_respool;
X
X isadm = FALSE;
X expire = NULL;
X exphist = NULL;
X ctrlmsg = NULL;
X rebuild_active = FALSE;
X rebuild_history = FALSE;
X check_dbmsiz = FALSE;
X retr_msgid = NULL;
X if (ptr = rindex (av[0], '/'))
X ++ptr;
X else
X ptr = av[0];
X mode = (! _strccmp (ptr, "mnews") ? M_READ : M_NONE);
X doconv = FALSE;
X conv_it = FALSE;
X rev_conv = FALSE;
X do_respool = FALSE;
X srcfn = NULL;
X crthd = FALSE;
X ins_dist = FALSE;
X for (t=1;t<ac;++t)
X if (av[t][0] == '-') {
X ptr = av[t] + 1;
X while (*ptr) {
X switch (*ptr) {
X case 'v':
X verbose = TRUE;
X break;
X case 'h':
X crthd = TRUE;
X /* Fall through ... */
X case 't':
X doconv = TRUE;
X break;
X case 'D':
X ins_dist = TRUE;
X break;
X case 'r':
X rebuild_active = TRUE;
X break;
X case 'H':
X rebuild_history = TRUE;
X break;
X# ifdef USE_NDBM
X case 'C':
X check_dbmsiz = TRUE;
X break;
X# endif /* USE_NDBM */
X case 'e':
X ptr += (*(ptr+1) == '=') ? 2 : 1;
X expire = ptr;
X while (*ptr)
X ++ptr;
X break;
X case 'E':
X ptr += (*(ptr+1) == '=') ? 2 : 1;
X exphist = ptr;
X while (*ptr)
X ++ptr;
X break;
X case 'c':
X ptr += (*(ptr+1) == '=') ? 2 : 1;
X ctrlmsg = ptr;
X while (*ptr)
X ++ptr;
X break;
X case 'g':
X ptr += (*(ptr+1) == '=') ? 2 : 1;
X tmp = split_fields (ptr, TRUE);
X if (tmp) {
X if (!ngs)
X ngs = tmp;
X else {
X t2 = ngs;
X while (t2->next)
X t2 = t2->next;
X t2->next = tmp;
X }
X }
X while (*ptr)
X ++ptr;
X break;
X case 'd':
X ptr += (*(ptr+1) == '=') ? 2 : 1;
X tmp = split_fields (ptr, TRUE);
X if (tmp) {
X if (!dists)
X dists = tmp;
X else {
X t2 = dists;
X while (t2->next)
X t2 = t2->next;
X t2->next = tmp;
X }
X }
X while (*ptr)
X ++ptr;
X break;
X case 'a':
X break;
X case 'M':
X ptr += (*(ptr+1) == '=') ? 2 : 1;
X if ((tmp = (charc *) malloc (sizeof (charc))) && (tmp->text = strdup (ptr))) {
X tmp->next = NULL;
X if (!retr_msgid)
X retr_msgid = tmp;
X else {
X for (t2 = retr_msgid; t2->next; t2 = t2->next)
X ;
X t2->next = tmp;
X }
X } else
X exit (_errmsg (1, "Out of memory.\n"));
X while (*ptr)
X ++ptr;
X break;
X case 'R':
X do_respool = TRUE;
X break;
X case 'm':
X ptr += (*(ptr+1) == '=') ? 2 : 1;
X if (Strieql (ptr, "read"))
X mode = M_READ;
X else if (Strieql (ptr, "write"))
X mode = M_WRITE;
X else if (Strieql (ptr, "mail"))
X mode = M_MAIL;
X else
X exit (_errmsg (1, "Unknown mode %s.\n", ptr));
X while (*ptr)
X ++ptr;
X break;
X case 'p':
X ptr += (*(ptr+1) == '=') ? 2 : 1;
X tmp = split_fields (ptr, FALSE);
X if (tmp) {
X if (!recv)
X recv= tmp;
X else {
X t2 = recv;
X while (t2->next)
X t2 = t2->next;
X t2->next = tmp;
X }
X }
X while (*ptr)
X ++ptr;
X break;
X case '?':
X default:
X usage ();
X exit (*ptr == '?' ? 0 :
X _errmsg (1, "Unknown option '%c'\n", *ptr));
X break;
X }
X if (*ptr)
X ++ptr;
X }
X } else if (!srcfn)
X srcfn = strdup (av[t]);
X
X if (mode != M_NONE) {
X doconv = TRUE;
X rev_conv = TRUE;
X verbose = TRUE;
X }
X
X setup_convtable (doconv, rev_conv);
X
X muid = getmuid ();
X ruid = getuid ();
X isadm = (muid == ruid) || (ruid == 0);
X
X if (mode != M_NONE) {
X user_interface (mode, srcfn);
X do_exit (0);
X }
X
X setuid (getmuid ());
X
X if (retr_msgid) {
X retreive_message_id (retr_msgid);
X do_exit (0);
X }
X
X if (do_respool) {
X if (do_init (FALSE) < 0)
X exit (_errmsg (1, "Can't init in respool\n"));
X respool (FALSE);
X do_exit (0);
X }
X
X if ((expire != NULL) || rebuild_active || rebuild_history || check_dbmsiz) {
X if (!isadm)
X exit (_errmsg (1, "Sorry, admin-mode requires %03d.%03d!\n", muid >> 16, muid & 0xffff));
X do_admin ((expire != NULL ? TRUE : FALSE), expire, exphist, rebuild_active, rebuild_history, check_dbmsiz);
X do_exit (0);
X }
X if (ctrlmsg) {
X create_control_message (ctrlmsg, isadm);
X do_exit (0);
X }
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/pit.c' ; then
echo 'File INEWS/pit.c already exists, overwriting it'
del 'INEWS/pit.c'
fi
echo Extracting \"'INEWS/pit.c'\"
sed "s/^X//" >'INEWS/pit.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: pit.c_v $
X * Revision 1.1 90/08/31 15:35:06 cs
X * Initial revision
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: pit.c_v 1.1 90/08/31 15:35:06 cs Exp $";
X# endif LINT
X# include <stdio.h>
X# include <errno.h>
X# include "inews.h"
X
Xextern char *malloc ();
Xextern char *strdup ();
Xextern FILE *xpopen ();
X
Xvoid
Xpipe_it (cmd)
Xchar *cmd;
X{
X char *rcmd;
X char *rfn;
X FILE *pp;
X FILE *fp;
X char *buf;
X int n;
X
X if (!(buf = malloc (512))) {
X do_log ("FATAL: Can't alloc for command %s\n", cmd);
X return;
X }
X if (!(rcmd = strdup (cmd))) {
X do_log ("FATAL: Can't alloc for command %s\n", cmd);
X return;
X }
X if (!(rfn = malloc (strlen (newsdir) + strlen (realfile) + 6))) {
X do_log ("FATAL: Can't malloc in pipe_it(%s)\n", cmd);
X return;
X }
X sprintf (rfn, "%s/%s", newsdir, realfile);
X if (!(fp = fopen (rfn, "r"))) {
X do_log ("FATAL: Can't open %s\n", realfile);
X return;
X }
X if (!(pp = xpopen (rcmd, "w"))) {
X fclose (fp);
X do_log ("FATAL: Can't fork command %s\n", rcmd);
X return;
X }
X while (fgets (buf, 500, fp))
X if (fputs (buf, pp) == -1) {
X do_log ("Broken pipe for %s (%d)?\n", cmd, errno);
X break;
X }
X fclose (fp);
X if (n = pclose (pp))
X do_log ("Pclose(%s) returned %d\n", cmd, n);
X free (rcmd);
X free (buf);
X}
__END__OF__THIS__FILE__
if test -f 'INEWS/pmail.c' ; then
echo 'File INEWS/pmail.c already exists, overwriting it'
del 'INEWS/pmail.c'
fi
echo Extracting \"'INEWS/pmail.c'\"
sed "s/^X//" >'INEWS/pmail.c' <<'__END__OF__THIS__FILE__'
X/*
X * $Log: pmail.c_v $
X * Revision 1.1 91/09/11 18:17:54 ud
X * Initial revision
X *
X *
X */
X# ifndef LINT
Xstatic char rcsid[] = "$Id: pmail.c_v 1.1 91/09/11 18:17:54 ud Exp $";
X# endif LINT
X# include <stdio.h>
X# include <c8type.h>
X# include "inews.h"
X
X# ifdef CAN_MAIL
Xextern char *index ();
Xextern char *malloc ();
Xextern char *rindex ();
Xextern FILE *xpopen ();
X
Xstatic struct {
X char *text;
X int len;
X} pattern[] = {
X "To: ", 4,
X "Cc: ", 4,
X "Bcc: ", 5,
X NULL, 0
X};
X
Xvoid
Xsend_private_mail ()
X{
X register charc *tmp;
X register int t;
X charc *rec;
X charc *cur, *prev;
X charc *path;
X char *pt;
X int len;
X char *ptr, *tptr;
X char *quote;
X# ifdef IN_MEMORY
X list *ltmp;
X# else /* IN_MEMORY */
X int ch;
X FILE *fp;
X# endif /* IN_MEMORY */
X FILE *pp;
X
X if (! crthd)
X return;
X
X tmp = head;
X prev = NULL;
X rec = NULL;
X for (tmp = head; tmp; tmp = tmp -> next)
X for (t = 0; pattern[t].text; ++t)
X if (Strnieql (pattern[t].text, tmp -> text, pattern[t].len)) {
X ptr = skip_field (tmp -> text);
X if (! (cur = split_fields (ptr, FALSE)))
X break;
X if (! prev)
X rec = cur;
X else
X prev -> next = cur;
X while (cur -> next)
X cur = cur -> next;
X prev = cur;
X }
X if (! rec)
X return;
X len = strlen (MAILCMD) + 4;
X for (tmp = rec; tmp; tmp = tmp -> next)
X len += strlen (tmp -> text) + 5;
X if (! (ptr = malloc (len))) {
X free_field (rec);
X return;
X }
X strcpy (ptr, MAILCMD);
X for (tmp = rec; tmp; tmp = tmp -> next) {
X if (tptr = index (tmp -> text, '<')) {
X strcpy (tmp -> text, tptr + 1);
X if (tptr = index (tmp -> text, '>'))
X *tptr = '\0';
X } else if (tmp -> text[0] == '(') {
X if (tptr = rindex (tmp -> text, ')')) {
X ++tptr;
X while (is8space (*tptr))
X ++tptr;
X strcpy (tmp -> text, tptr);
X }
X } else {
X tptr = tmp -> text;
X while (*tptr && (! is8space (*tptr)))
X ++tptr;
X *tptr = '\0';
X }
X if (tmp -> text[0]) {
X if (index (tmp -> text, '\''))
X quote = "\"";
X else
X quote = "'";
X strcat (ptr, " ");
X strcat (ptr, quote);
X strcat (ptr, tmp -> text);
X strcat (ptr, quote);
X }
X }
X do_log ("Mail using `%s'\n", ptr);
X if (pp = xpopen (ptr, "w")) {
X for (tmp = head; tmp; tmp = tmp -> next)
X if (Strnicmp (tmp -> text, pattern[2].text, pattern[2].len))
X fprintf (pp, "%s\n", tmp -> text);
X putc ('\n', pp);
X# ifdef IN_MEMORY
X for (ltmp = newstmp; ltmp; ltmp = ltmp->next)
X fputs (ltmp -> text, pp);
X# else /* IN_MEMORY */
X if (fp = fopen (newstmp, "r")) {
X while ((ch = getc (fp)) != EOF)
X putc (ch, pp);
X fclose (fp);
X }
X# endif /* IN_MEMORY */
X pclose (pp);
X }
X free (ptr);
X free_field (rec);
X}
X# endif /* CAN_MAIL */
__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