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 s

⟦6a1011fd9⟧ TextFile

    Length: 8371 (0x20b3)
    Types: TextFile
    Names: »submit_txt.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Src/submit/submit_txt.c« 

TextFile

/* submit_txt.c: handles the bodies of the messages */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Src/submit/RCS/submit_txt.c,v 5.0 90/09/20 16:23:29 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Src/submit/RCS/submit_txt.c,v 5.0 90/09/20 16:23:29 pp Exp Locker: pp $
 *
 * $Log:	submit_txt.c,v $
 * Revision 5.0  90/09/20  16:23:29  pp
 * rcsforce : 5.0 public release
 * 
 */



#include "head.h"
#include "list_bpt.h"
#include "q.h"
#include "chan.h"
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/file.h>
#include <sys/stat.h>


extern Q_struct		Qstruct;
extern LIST_BPT		*bodies_all;
extern CHAN		*ch_inbound;
extern int		privileged;
extern char		*loc_dom_mta;
extern char		*mgt_inhost;
extern char		*msg_basedir;
extern char		*ad_unique;
extern char		*cont_p2;
extern char		*cont_p22;
extern char		*msg_fullpath[];


/* -- globals  -- */
char                    io_fpart[LINESIZE];
long                    msg_size;


/* -- static variables -- */
static FILE             *io_ofp;        /* -- output -- */
static int              io_linkpart;    /* -- linked part so no txt copy -- */
static char             *io_ostrend;
static char		io_tfname[FILNSIZE];


/* -- local routines -- */
int			txt_tend();
void			txt_input();
static int		txt_bptfind();
static int		txt_init();
static int		txt_pend();
static int		txt_pinit();
static int		txt_read();
static void		txt_bp_check();
static void		txt_copy();
static void		txt_in();
static void		txt_via();




/* ---------------------  Begin  Routines  -------------------------------- */




void txt_input (addvia)   /* -- control the text -- */
int	addvia;
{
	int             retval,
			nparts = 0,
			first = TRUE;

	PP_TRACE (("txt_input()"));

	/* -- set up to recieve text -- */
	if ((retval = txt_init()) != RP_OK)
		err_abrt (retval, "Text initialisation");

	while ((retval = txt_pinit()) == RP_OK) {
		PP_TRACE (("text loop"));
		/* -- add 822 trace -- */
		if (first && !io_linkpart && addvia)
			txt_via (io_ofp);
		first = FALSE;
		nparts++;
		if (io_linkpart)
			continue;
		txt_in();
		if ((retval = txt_pend()) != RP_OK)
			err_abrt (retval, "Text ending");
	}

	if (rp_isbad (txt_tend()))
		retval = RP_MECH;

	if (retval != RP_DONE)
		err_abrt (RP_MECH, "Unknown error in txt_input");

	if (nparts == 0)
		err_abrt (RP_USER, "Null message");

	txt_mgt();
}




int txt_tend()  /* -- finally finish -- */
{
	PP_TRACE (("txt_tend()"));

	if (io_ofp != NULLFILE) {
		if(fclose (io_ofp) == EOF)
			return RP_MECH;
		io_ofp = NULLFILE;
	}

	if (isstr (io_ostrend))
		* (io_ostrend - 1) = '\0';
	return RP_OK;
}




/* ----------------------  Static  Routines  -------------------------------- */




static int txt_init()
{
	char            lbuf[LINESIZE];
	int             retval;

	PP_TRACE (("txt_init ('%s', '%s')", msg_fullpath, msg_basedir));

	io_linkpart     = FALSE;
	*io_fpart       = '\0';
	msg_size        = 0;


	if (rp_isbad (retval = txt_read (lbuf)))
		return (retval);

	if (mkdir (msg_basedir, 0777) < 0)
		err_abrt (RP_FIO, "Cannot create base dir %s", msg_basedir);

	(void) strcpy (&io_tfname[0], msg_basedir);
	(void) strcat (&io_tfname[0], "/");

	/* -- make io_ostrend point to the end of the string. -- */
	io_ostrend = io_tfname + strlen (io_tfname);
	io_ofp = NULLFILE;

	pro_reply (RP_OK, "base %s", io_tfname);
	return (RP_OK);
}




static int txt_pinit()  /* -- initialise for reading a single part of a msg -- */
{
	struct stat     statbuf;
	char            lbuf[LINESIZE],
			*p,
			*splt;
	int             fd,
			retval;

	PP_DBG (("txt_pinit (%s)", io_tfname));

	io_linkpart = FALSE;    /* -- reset -- */

	if (rp_isbad (retval = txt_read (lbuf)))
		return (retval);

	if (lbuf[0] == '\0')
		return (RP_DONE);

	if ((splt = index (lbuf, ' ')) != NULL) {
		*splt++ = '\0';
		io_linkpart = TRUE;
		if (!privileged)
			err_abrt (RP_USER, "Mortals cannot link");
	}

	txt_bp_check (lbuf);

	(void) strcpy (io_ostrend, lbuf);

	for (p = io_ostrend; (p = index (p, '/')) != NULL; p++) {
		*p = '\0';
		(void) mkdir (io_tfname, 0777);
		*p = '/';
	}


	if (io_linkpart) {
		if (link (splt, io_tfname) < 0)
			err_abrt (RP_FIO, "Cannot link file '%s' to '%s'",
				splt, io_tfname);

		if (*io_fpart == '\0')
			(void) strcpy (io_fpart, io_tfname);

		/* -- check message size -- */
		if (stat (io_tfname, &statbuf) >= 0)
			msg_size += statbuf.st_size;

		pro_reply (RP_OK, "linked the files");
		return (RP_OK);
	}


	if ((fd = open (io_tfname, O_CREAT | O_WRONLY | O_EXCL, 0644)) < 0)
		err_abrt (RP_FIO, "Can't create file '%s'", io_tfname);


	if ((io_ofp = fdopen (fd, "w")) == NULLFILE) {
		(void) close (fd);
		(void) unlink (io_tfname);
		*io_tfname = '\0';
		err_abrt (RP_FIO, "cannot open io_tfname");
	}


	if (*io_fpart == '\0')
		(void) strcpy (io_fpart, io_tfname);


	pro_reply (RP_OK, "file is '%s'", io_tfname);

	return (RP_OK);
}




static int txt_pend()  /* -- end of the text input part -- */
{
	int     retval = RP_OK;

	PP_TRACE (("txt_pend()"));

	(void) fflush (io_ofp);
	if (ferror (io_ofp))
		retval = RP_FIO;
	if (fclose (io_ofp) == EOF)
		retval = RP_FIO;
	io_ofp = NULLFILE;

	if (retval == RP_OK)
		pro_reply (retval, "got this text part");
	else
		pro_reply (retval, "text copy failure");

	return (retval);
}




static void txt_in()  /* -- input the text -- */
{
	long    datalen;

	PP_TRACE (("txt_in()"));

	while (fread ((char *)&datalen, sizeof (datalen), 1, stdin) > 0) {
		datalen = ntohl (datalen);
		if (datalen == 0)
			return;
		txt_copy (stdin, io_ofp, datalen);
		PP_DBG (("submit/txt_in copied %d bytes",datalen));
	}
}




static void txt_copy (ifp, ofp, len)
FILE    *ifp,
	*ofp;
long    len;
{
	char    buf[BUFSIZ];
	int     dlen,
		nc;

	PP_TRACE (("submit/txt_copy (ifp, ofp, %d)", len));

	while (len > 0) {
		dlen = len < sizeof (buf) ? len : sizeof (buf);
		nc = fread (buf, sizeof (buf[0]), dlen, ifp);
		if (nc <= 0)
			err_abrt (RP_FIO, "Read error");
		msg_size += nc;
		if (fwrite (buf, sizeof (buf[0]), nc, ofp) != nc)
			err_abrt (RP_FIO, "Write error");
		len -= nc;
	}
}




static int txt_read (buf)  /* -- read the control flow -- */
char    *buf;
{
	register int    c;
	register char   *p;

	PP_TRACE (("txt_read()"));
	for (p = buf; (c = getc (stdin)) != EOF && c != '\n'; *p++ = c);
	*p = '\0';
	PP_DBG (("text_read - read '%.10s'", buf));
	return ((c == EOF) ? RP_EOF : RP_OK);
}




static void txt_via (fp)
FILE    *fp;
{
	char    buf[BUFSIZ];
	char    thedate[LINESIZE];
	char	showstr[BUFSIZ];
	UTC     ut, lt;
	extern UTC utclocalise();

	ut = utcnow();
	lt = utclocalise(ut);
	UTC2rfc(lt, thedate);
	free ((char *)ut);
	free ((char *)lt);

	if (ch_inbound -> ch_ad_subtype == AD_JNT)
		(void) sprintf (buf, "Via: %s; %s\n",
				loc_dom_mta, thedate);
	else {
		if ( ch_inbound -> ch_show && 
		     (strncmp (ch_inbound -> ch_show, "via", 3) == 0
		     || strncmp (ch_inbound -> ch_show, "with", 4) == 0)) {
			strcpy (showstr, " ");
			strcat (showstr, ch_inbound -> ch_show);
		}
		else showstr[0] = '\0';
			
		(void) sprintf (buf, "Received: from %s by %s%s id <%s@%s>; %s\n",
				mgt_inhost, loc_dom_mta,
				showstr,
				ad_unique + 4, loc_dom_mta,
				thedate);
	}
	fputs (buf, fp);
}




static void txt_bp_check (file)
char    *file;
{
	char		*p;

	if (*file == '/')
		err_abrt (RP_PARM, "File has full pathname %s", file);

	if (p = index (file, '/')) {
		if (!isdigit (*file) || strncmp (p - 4, ".ipm", 4) != 0)
			err_abrt (RP_PARM, "Not a forwarded message %s", file);
		txt_bp_check (++p);
		return;
	}


	/* -- check against content types -- */
	if (strcmp (file, cont_p2) == 0 || strcmp (file, cont_p22) == 0)
		return; 

	if (isdigit (*file)) {
		for (p = file + 1; isdigit (*p); p++)
			continue;
		if (*p != '.')
			err_abrt (RP_PARM, "Bad filename syntax %s", file);
		p++;
	}
	else    p = file;



	/* -- check if this body part is allowed -- */

	if (!txt_bptfind (bodies_all, p))
		err_abrt (RP_PARM, "Unknown body part '%s'", file);



	/* -- check the file against the list of eits in Q -- */

	if (!txt_bptfind (Qstruct.encodedinfo.eit_types, p))
		err_abrt (RP_PARM, 
			"'%s' is not specified in the orig encoded info", file);

	return;
}




static int txt_bptfind (list, item)
LIST_BPT        *list;
char            *item;
{

	if (list_bpt_find (list, item))
		return TRUE;

	return FALSE;
}