DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T r

⟦059160a98⟧ TextFile

    Length: 5253 (0x1485)
    Types: TextFile
    Names: »resend.c«

Derivation

└─⟦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« 

TextFile

/* 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