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 u

⟦00e48028c⟧ TextFile

    Length: 3091 (0xc13)
    Types: TextFile
    Names: »uu_wtmail.c«

Derivation

└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
    └─⟦3658e588a⟧ »EurOpenD3/mail/mh/mh-6.7.tar.Z« 
        └─⟦c75e36ecb⟧ 
            └─⟦this⟧ »mh-6.7/zotnet/mf/mmdfI/src/uucp/uu_wtmail.c« 

TextFile

/* uu_wtmail.c - write mail to UUCP */

#include "util.h"
#include "mmdf.h"
#include "ch.h"
#include <signal.h>

/* \f

 */

extern int  errno;

int     broken_pipe;
void	pipeser ();

extern struct ll_struct *logptr;

FILE * uucpf;

Chan * curchan;


char   *index ();
FILE * popen ();

/* \f

 */

uu_init (chanptr)
Chan * chanptr;
{
#ifdef DEBUG
    ll_log (logptr, LLOGBTR, "uu_init (chanptr=%s)", chanptr -> ch_spec);
#endif

    curchan = chanptr;

    return RP_OK;
}


uu_end (result)
short   result;
{
#ifdef DEBUG
    ll_log (logptr, LLOGBTR, "uu_end (result=0%o)", result);
#endif

    return RP_OK;
}

/* \f

 */

uu_sbinit () {
#ifdef DEBUG
    ll_log (logptr, LLOGBTR, "uu_sbinit ()");
#endif

    return RP_OK;
}

uu_sbend () {
#ifdef DEBUG
    ll_log (logptr, LLOGBTR, "uu_sbend ()");
#endif

    return RP_OK;
}

/* \f

 */

uu_wtadr (host, adr, sender)
char   *host,
       *adr,
       *sender;
{
    char   *p,
            linebuf[LINESIZE],
            nextnode[LINESIZE],
            who[LINESIZE];

#ifdef DEBUG
    ll_log (logptr, LLOGBTR, "uu_wtadr(host='%s',adr='%s')", host, adr);
#endif

    if (host == NULL || host[0] == NULL)
	strcpy (who, adr);
    else {
	if (!ch_h2adr (curchan, TRUE, host, nextnode))
	    return RP_USER;	/* No such host */
	sprintf (who, nextnode, adr);
    }

    if ((p = index (who, '!')) != NULL) {
	*p++ = NULL;
	strcpy (nextnode, who);
	strcpy (who, p);
	lowerfy (nextnode);
    }
    else
	strcpy (nextnode, "");

    printx ("Queuing UUCP mail for %s via %s...\n", who, nextnode);
    sprintf (linebuf, "uux -p %s!rmail \\(%s\\)", nextnode, who);
    if ((uucpf = popen (linebuf, "w")) == NULL) {
	ll_log (logptr, LLOGFAT, "unable to popen() UUX (errno %d)", errno);
	return RP_AGN;
    }

    return RP_OK;
}

/* \f

 */

uu_txtcpy () {
    short   result;
    int     len;
    int     (*pstat) ();
    char    buffer[BUFSIZ];

#ifdef DEBUG
    ll_log (logptr, LLOGBTR, " uu_txtcpy()");
#endif

    mf_rtinit (0L);
    broken_pipe = 0;
    pstat = signal (SIGPIPE, pipeser);

    while (rp_gval (result = mf_rtxt (buffer, &len)) == RP_OK && !broken_pipe)
	if (fwrite (buffer, sizeof *buffer, len, uucpf) != len) {
	    ll_log (logptr, LLOGFAT, "write on pipe lost (errno %d)", errno);
	    ll_log (logptr, LLOGFAT, "pclose() returns %d", pclose (uucpf));
	    signal (SIGPIPE, pstat);
	    return (broken_pipe ? RP_USER : RP_LIO);
	}

    fflush (uucpf);
    if (broken_pipe) {
	ll_log (logptr, LLOGFAT, "pipe to UUX broke -- probably bad host");
	ll_log (logptr, LLOGFAT, "pclose() returns %d", pclose (uucpf));
	signal (SIGPIPE, pstat);
	return RP_USER;
    }
    signal (SIGPIPE, pstat);

    return (rp_gval (result) == RP_DONE ? RP_MOK : result);
}

/* \f

 */

uu_wttend () {
    short   result;
    int     (*pstat) ();

    pstat = signal (SIGPIPE, pipeser);
    result = pclose (uucpf) ? (broken_pipe ? RP_USER : RP_LIO) : RP_MOK;
    signal (SIGPIPE, pstat);

    return result;
}

/* \f

 */

lowerfy (s)
char   *s;
{
    while (*s = uptolow (*s))
	s++;
}


void pipeser (i)
int     i;
{
    broken_pipe++;
    signal (SIGPIPE, SIG_IGN);
}