|
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 p
Length: 7424 (0x1d00) Types: TextFile Names: »pps_mail.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Lib/pp/pps_mail.c«
/* pps_mail.c: simple mail interface */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/pp/RCS/pps_mail.c,v 5.0 90/09/20 16:11:18 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Lib/pp/RCS/pps_mail.c,v 5.0 90/09/20 16:11:18 pp Exp Locker: pp $ * * $Log: pps_mail.c,v $ * Revision 5.0 90/09/20 16:11:18 pp * rcsforce : 5.0 public release * */ /* __________________________________________________________________________ PP Simple interface, sort of equivalent to the MMDF ml_ library. Works through submit though (as does the newer MMDF). This code makes several assumptions. 1) The input will always be RFC-822. 2) The input will always be a local submission - i.e. you can't pretend you are a channel. ___________________________________________________________________________ */ #include "head.h" #include <isode/cmd_srch.h> #include "prm.h" #include "q.h" #include "adr.h" #include <pwd.h> #define INIT 1 #define TO 2 #define CC 3 #define HEADER 4 #define BODY 5 extern char *loc_dom_site; extern char *local_822_chan; extern char *hdr_822_bp; extern char *ia5_bp; static int state = INIT; static Q_struct qs; static char *cc[120]; static char *sender; static char *subject; static char *to[120]; static int cccnt; static int tocnt; static struct prm_vars pv; int pps_end (); static int pps_adrhdr (); static void pps_set (); /* --------------------- Start of Routines ------------------------------ */ int pps_init (subj, rp) char *subj; /* the subject field - or not */ RP_Buf *rp; { struct passwd *pwd; LIST_BPT *new; ADDR *ap; if (state != INIT) (void) pps_end (NOTOK, rp); tocnt = cccnt = 0; if (subj) subject = strdup (subj); else subject = NULLCP; if (rp_isbad (io_init(rp))) return (pps_end (NOTOK, rp)); if (rp_isbad (io_wprm (&pv, rp))) return (pps_end (NOTOK, rp)); q_init (&qs); qs.inbound = list_rchan_new (loc_dom_site, local_822_chan); qs.encodedinfo.eit_types = list_bpt_new (hdr_822_bp); new = list_bpt_new (ia5_bp); list_bpt_add (&qs.encodedinfo.eit_types, new); if (rp_isbad (io_wrq (&qs, rp))) return (pps_end (NOTOK, rp)); if ((pwd = getpwuid (getuid())) == NULL) return (pps_end (NOTOK, rp)); ap = adr_new (pwd->pw_name, AD_822_TYPE, 0); ap -> ad_status = AD_STAT_DONE; ap -> ad_resp = NO; sender = strdup (pwd->pw_name); (void) io_wadr (ap, AD_ORIGINATOR, rp); adr_tfree (ap); if (rp_isbad (rp -> rp_val)) return (pps_end (NOTOK, rp)); state = TO; return (OK); } int pps_adr (adr, rp) char *adr; RP_Buf *rp; { ADDR *ap; int retval; if (state != TO && state != CC) { pps_set (rp, RP_MECH, "Out of sync"); return (pps_end (NOTOK, rp)); } switch (state) { case TO: to[tocnt++] = strdup (adr); break; case CC: cc[cccnt++] = strdup (adr); break; default: return (pps_end (NOTOK, rp)); } ap = adr_new (adr, AD_822_TYPE, 0); retval = io_wadr (ap, AD_RECIPIENT, rp); adr_tfree (ap); if (rp_isbad (retval)) return (pps_end (NOTOK, rp)); return (OK); } int pps_aend(rp) RP_Buf *rp; { UTC ut, lt; extern UTC utclocalise(); char buf[BUFSIZ]; if (state != TO && state != CC) { pps_set (rp, RP_MECH, "Out of sync"); return (pps_end (NOTOK, rp)); } if (rp_isbad (io_adend (rp))) return (pps_end (NOTOK, rp)); if (rp_isbad (io_tinit (rp)) || rp_isbad (io_tpart ("hdr.822", FALSE, rp))) return (pps_end (NOTOK, rp)); state = HEADER; ut = utcnow (); lt = utclocalise(ut); UTC2rfc (lt, buf); pps_hdr ("Date:", buf, rp); free ((char *)ut); free ((char *)lt); pps_hdr ("From:", sender, rp); free (sender); sender = NULLCP; if (tocnt > 0 && pps_adrhdr ("To:", to, tocnt, rp) != OK) return NOTOK; if (cccnt > 0 && pps_adrhdr ("Cc:", cc, cccnt, rp) != OK) return NOTOK; if (isstr (subject)) { pps_hdr ("Subject:", subject, rp); free (subject); subject = NULLCP; } return (OK); } int pps_tinit(rp) RP_Buf *rp; { if (rp_isbad (io_tdata ("\n", 1))) { pps_set (rp, RP_MECH, "Write error"); return (NOTOK); } if (rp_isbad (io_tdend (rp)) || rp_isbad (io_tpart ("1.ia5", FALSE, rp))) return (pps_end (NOTOK, rp)); state = BODY; return (OK); } int pps_txt (str, rp) char *str; RP_Buf *rp; { if (state != BODY) { pps_set (rp, RP_MECH, "Out of sync"); return (pps_end (NOTOK, rp)); } if (rp_isbad (io_tdata (str, strlen (str)))) { pps_set (rp, RP_FIO, "Bad data transfer"); return (pps_end (NOTOK, rp)); } return (OK); } int pps_file (fp, rp) FILE *fp; RP_Buf *rp; { char copybuf[BUFSIZ]; int n; if (state != BODY) { pps_set (rp, RP_MECH, "Out of sync"); return (pps_end (NOTOK, rp)); } while (!feof (fp) && !ferror(fp)) { if ((n = fread (copybuf, sizeof (char), sizeof (copybuf), fp)) > 0) if (rp_isbad (io_tdata (copybuf, n))) { pps_set (rp, RP_FIO, "Bad data transfer"); return pps_end (NOTOK, rp); } } return (OK); } int pps_end (type, rp) int type; RP_Buf *rp; { int i; if (type == OK && state == BODY) { if (rp_isbad (io_tdend (rp))) return (pps_end (NOTOK, rp)); if (rp_isbad (io_tend (rp))) return (pps_end (NOTOK, rp)); } io_end (type); for (i = 0; i < tocnt; i++) free (to[i]); tocnt = 0; for (i = 0; i < cccnt; i++) free (cc[i]); cccnt = 0; if (subject) free (subject); if (sender) free (sender); sender = NULLCP; subject = NULLCP; state = INIT; return (type); } int pps_to(rp) RP_Buf *rp; { if (state == TO || state == CC) { state = TO; return (OK); } pps_set (rp, RP_MECH, "Out of sync"); return (pps_end (NOTOK, rp)); } int pps_cc(rp) RP_Buf *rp; { if (state == TO || state == CC) { state = CC; return (OK); } pps_set (rp, RP_MECH, "Out of sync"); return pps_end(NOTOK, rp); } int pps_hdr (name, contents, rp) char *name, *contents; RP_Buf *rp; { char buffer[LINESIZE]; if (state != HEADER) { pps_set (rp, RP_MECH, "Out of sync"); return (pps_end (NOTOK, rp)); } (void) sprintf (buffer, "%-10s%s\n", name, contents); if (rp_isbad (io_tdata (buffer, strlen (buffer)))) { pps_set (rp, RP_MECH, "Write error"); return pps_end (NOTOK, rp); } return (OK); } int pps_1adr (subj, addr, rp) char *subj, *addr; RP_Buf *rp; { if (pps_init (subj, rp) == OK && pps_adr (addr, rp) == OK && pps_aend(rp) == OK && pps_tinit(rp) == OK) return (OK); return (NOTOK); } /* --------------------- Static Routines ------------------------------- */ static int pps_adrhdr (field, adr_array, count, rp) char *field; char *adr_array[]; int count; RP_Buf *rp; { char buffer[LINESIZE]; int i; if (state != HEADER) { pps_set (rp, RP_MECH, "Out of sync"); return (pps_end (NOTOK, rp)); } (void) sprintf (buffer, "%-10s", field); for (i = 0; i < count; i++) { (void) strcat (buffer, adr_array[i]); if (i != count - 1 ) { if (strlen (buffer) > 64) { (void) strcat (buffer, ",\n\t"); (void) io_tdata (buffer, strlen (buffer)); buffer[0] = '\0'; } else (void) strcat (buffer, ", "); } } if (buffer[0]) (void) io_tdata (buffer, strlen (buffer)); if (rp_isbad (io_tdata ("\n", 1))) { pps_set (rp, RP_MECH, "Write error"); return pps_end (NOTOK, rp); } return (OK); } static void pps_set (rp, val, str) RP_Buf *rp; int val; char *str; { rp -> rp_val = val; (void) strcpy (rp -> rp_line, str); }