|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T r
Length: 5253 (0x1485) Types: TextFile Names: »resend.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Uip/resend/resend.c«
/* resend.c: resend a message onwards */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Uip/resend/RCS/resend.c,v 5.0 90/09/20 16:34:37 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Uip/resend/RCS/resend.c,v 5.0 90/09/20 16:34:37 pp Exp Locker: pp $ * * $Log: resend.c,v $ * Revision 5.0 90/09/20 16:34:37 pp * rcsforce : 5.0 public release * */ #include "util.h" #include "prm.h" #include "q.h" #include "adr.h" #include "retcode.h" #include <pwd.h> #include <signal.h> #include <sys/stat.h> #include <varargs.h> extern char *strdup(); extern char *index(); extern UTC utclocalise(); extern char *loc_dom_site; extern char *local_822_chan; extern char *hdr_822_bp; extern char *ia5_bp; static char *username; #define ADR_TO 1 #define ADR_CC 2 static int list = ADR_TO; #define MAXADRS 100 static char *toadrs[MAXADRS]; static int tocnt = 0; static char *ccadrs[MAXADRS]; static int cccnt = 0; static RP_Buf rps; static RP_Buf *rp = &rps; static struct prm_vars prm; static Q_struct qs; static void adios (); #define prefix(a,b) (lexnequ ((a), (b), strlen(a)) == 0) main (argc, argv) int argc; char *argv[]; { char *cp; uip_init (argv[0]); pgminit (); if (argc <= 1) adios (NULLCP, "No addresses given"); while (--argc > 0) { cp = *++argv; if (*cp == '-') switch (cp[1]) { case 't': list = ADR_TO; break; case 'c': list = ADR_CC; break; default: adios (NULLCP, "Bad switch %s", cp); } else if (list == ADR_TO) toadrs[tocnt++] = cp; else ccadrs[cccnt++] = cp; } sendmail (); } pgminit () { extern struct passwd *getpwuid (); extern char *getmailid (); struct passwd *pwdptr; int realid; realid = getuid (); if ((pwdptr = getpwuid (realid)) == (struct passwd *) NULL) err_abrt (RP_PARM, "Unable to locate user's name"); username = strdup (pwdptr -> pw_name); } sendmail () { ADDR *adr; int i; prm_init (&prm); q_init (&qs); qs.inbound = list_rchan_new (loc_dom_site, local_822_chan); qs.encodedinfo.eit_types = list_bpt_new (hdr_822_bp); list_bpt_add (&qs.encodedinfo.eit_types, list_bpt_new (ia5_bp)); if (rp_isbad (io_init (rp)) || rp_isbad (io_wprm (&prm, rp)) || rp_isbad (io_wrq (&qs, rp))) adios (NULLCP, "Unable to start submit: %s", rp -> rp_line); adr = adr_new (username, AD_822_TYPE, 0); adr -> ad_status = AD_STAT_DONE; adr -> ad_resp = NO; if (rp_isbad (io_wadr (adr, AD_ORIGINATOR, rp))) adios (NULLCP, "Bad sender %s: %s", username, rp -> rp_line); adr_tfree (adr); for ( i = 0; i < tocnt; i++) { adr = adr_new (toadrs[i], AD_822_TYPE, 0); if (rp_isbad (io_wadr (adr, AD_RECIPIENT, rp))) adios (NULLCP, "Bad recipeint %s: %s", toadrs[i], rp -> rp_line); adr_tfree (adr); } for ( i = 0; i < cccnt; i++) { adr = adr_new (ccadrs[i], AD_822_TYPE, 0); if (rp_isbad (io_wadr (adr, AD_RECIPIENT, rp))) adios (NULLCP, "Bad recipeint %s: %s", ccadrs[i], rp -> rp_line); adr_tfree (adr); } if (rp_isbad (io_adend (rp)) || rp_isbad (io_tinit (rp)) || rp_isbad (io_tpart (hdr_822_bp, 0, rp))) adios (NULLCP, "Can't initialise for text submission: %s", rp -> rp_line); dumpheader(); doresent(); dobody (); } dumpheader() { char line[LINESIZE]; while (fgets (line, LINESIZE, stdin) != NULL) { if (line[0] == '\n') break; if (prefix ("resent-", line) || prefix ("received:", line) || prefix ("via:", line)) if (rp_isbad (io_tdata ("Old-", 4))) adios (NULLCP, "Data Copy failed"); if (rp_isbad (io_tdata (line, strlen (line)))) adios (NULLCP, "Data copy failed"); } } doresent() { char datbuf[64]; UTC now, lut; now = utcnow(); lut = utclocalise(now); UTC2rfc(lut, datbuf); /* rfc822 format date */ free ((char *) lut); sndhdr ("Resent-Date: ", datbuf); sndhdr ("Resent-From:", username); doto (); (void) sprintf (datbuf, "1.%s", ia5_bp); if ( rp_isbad (io_tdend (rp)) || rp_isbad (io_tpart (datbuf, 0, rp))) adios (NULLCP, "Can't setup for body part: %s", rp -> rp_line); } sndhdr (name, contents) char name[], contents[]; { char linebuf[LINESIZE]; (void) sprintf (linebuf, "%-10s%s\n", name, contents); if (rp_isbad (io_tdata (linebuf, strlen (linebuf)))) adios (NULLCP, "Data Copy failed"); } doto () { register int i; for (i = 0; i < tocnt; i++) sndhdr ("Resent-To:", toadrs[i]); for (i = 0; i < cccnt; i++) sndhdr ("Resent-Cc:", ccadrs[i]); } dobody () { char buffer[BUFSIZ]; register int i; while (!feof (stdin) && !ferror (stdin) && (i = fread (buffer, sizeof (char), sizeof (buffer), stdin)) > 0) if (rp_isbad (io_tdata (buffer, i))) adios (NULLCP, "Problem writing body"); if (ferror (stdin)) adios (NULLCP, "Problem reading body"); if (rp_isbad (io_tdend (rp)) || rp_isbad (io_tend (rp))) adios (NULLCP, "Error terminating: %s", rp -> rp_line); } #ifndef lint static void adios (va_alist) va_dcl { va_list ap; va_start (ap); _ll_log (pp_log_norm, LLOG_FATAL, ap); va_end (ap); _exit (1); } #else /* VARARGS2 */ static void adios (what, fmt) char *what, *fmt; { adios (what, fmt); } #endif