SRI-NOSC/mmdf/sndsubs.c

#include "mailer.h"

struct iobuf    namebuf,
		resbuf;
struct adr adr;
int     infd;                     /* handle on source text        */
char   *txtname;
char   *sender;
char *eosstr;

initcom (argc, argv)
int     argc;
char   *argv[];

/*      [name,] infd, namebuf.fildes, resbuf.fildes, logbuf.files,]
		txtfile , sender */
{
    infd = atoi (argv[1]);
    namebuf.fildes = atoi (argv[2]);
    resbuf.fildes = atoi (argv[3]);
    initlog (atoi (argv[4]));
    txtname = strdup (argv[5]);         /* Name of text file */
    sender = strdup (argv[6]);
    if (infd == 0 && (infd = open (txtname, 0)) == -1)
    {                                   /* probably in debug mode       */
	perror ("Unable to open first message file \"%s\"", txtname);
	putresp (NOTOK, "Unable to open first message file.\n");
	exit (-1);
    }
}

getname()
{
    int c;
    char *ptr;

    zero (&adr, sizeof adr);
    c = gcread (&namebuf, &adr, sizeof adr - 1, "\000\n\377");
    switch (c)
    {
     case NOTOK:
	perror ("error reading name from pipe\n");
	putresp (NOTOK, "error reading name from pipe\n");
	return (NOTOK);
     case OK:                       /* closed the pipe / all done       */
	dbglog ("getname: returning OK -> NOTOK");
	return (NOTOK);
     case 1:                        /* only sent a newline/null */
	dbglog ("getname: returning DONE");
	return (DONE);              /* This list is done        */
    }
    ptr = &adr;
    ptr[c] = '\0';
    dbglog ("getname got: \"%s\"", ptr);
    return (strequ (eosstr, ptr) ? DONE : OK);
}

putresp (resp, str)
    int resp;
    char *str;
{
    dbglog ("putresp: '%d' \"%s\"", resp, (str == 0) ? "" : str);
    putc (resp, &resbuf);
    if (str != 0)
	puts (str, &resbuf);
    putc ('\0', &resbuf);
    fflush (&resbuf);
}

newfile ()
{
    int c;

    if (txtname != 0)
    {
	free (txtname);
	txtname = 0;
    }
    if (sender != 0)
    {
	free (sender);
	sender = 0;
    }
    dbglog ("newfile:");
    switch (getname ())         /* name of next message file            */
    {
     case NOTOK:                /* normal end or i/o error; never sure  */
     case DONE:
/*      putresp (OK, 0);        ** normal end                   */
	return (DONE);
     case OK:
	break;
     default:
	return (NOTOK);
    }
    txtname = strdup (&adr);
    c = strlen (txtname) - 1;
    if (txtname[c] == '\n')
	txtname[c] = '\0';
    close (infd);
    if ((infd = open (txtname, 0)) == -1)
    {
	putresp (NOTOK, "Unable to open next message file.");
	perror ("Unable to open message file.\n");
	return (NOTOK);
    }
    putresp (OK, 0);

    switch (getname ())         /* name of return mailbox       */
    {
     case OK:
	break;
     case DONE:
     case NOTOK:
     default:
	putresp (NOTOK, "eof/pipe error reading return address.");
	perror ("eof/pipe error reading return address.");
	return (NOTOK);
    }
    sender = strdup (&adr);
    c = strlen (sender) - 1;
    if (sender[c] == '\n')
	sender[c] = '\0';

    putresp (OK, 0);
    return (OK);
}

infdsize ()
{
    struct inode    inode;

    return (fstat (infd, &inode) < OK ? NOTOK : (inode.fsize >> 9));
}