|
|
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 m
Length: 3505 (0xdb1)
Types: TextFile
Names: »muinc.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦3658e588a⟧ »EurOpenD3/mail/mh/mh-6.7.tar.Z«
└─⟦c75e36ecb⟧
└─⟦this⟧ »mh-6.7/zotnet/mf/muinc.c«
/* muinc.c - mmdf to uucp inc */
#include "mf.h"
#include <stdio.h>
#include "../mts/mts.h"
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
static int mmdf = NOTOK;
static int uucp = NOTOK;
static char mmdfbox[LINESIZ];
static char uucpbox[LINESIZ];
/* \f
*/
main (argc, argv)
int argc;
char *argv[];
{
int fd,
tmp;
struct stat st1,
st2;
mts_init (*argv);
sprintf (mmdfbox, "%s/%s", MAILDIR, MAILFIL);
if (stat (mmdfbox, &st1) == NOTOK || st1.st_size == 0L)
exit (0);
if ((mmdf = lkopen (mmdfbox, 0)) == NOTOK)
die ("unable to lock and open %s", mmdfbox);
tmp = tmp_open (&fd);
switch (fd = mmdf2uucp (mmdf, fd, FALSE)) {
case MFOK:
break;
case MFPRM:
die ("internal error while filtering MMDF mail");
case MFSIO:
die ("no free file pointers -- you lose");
case MFERR:
die ("i/o error while filtering MMDF mail");
case MFROM:
case MFHDR:
case MFTXT:
fprintf (stderr, "MMDF mailbox in bad format, patched...\n");
break;
}
sprintf (uucpbox, "%s/%s", UUCPDIR, UUCPFIL);
uucp = mbx_open (uucpbox);
mbx_copy (tmp, uucp);
close (tmp);
lkclose (uucp, uucpbox), uucp = NOTOK;
if (stat (mmdfbox, &st2) != NOTOK && st1.st_mtime != st2.st_mtime)
fprintf (stderr, "MMDF mailbox has been updated... (%s)\n",
"so it won't be zero'd");
else
if ((fd = creat (mmdfbox, st1.st_mode & ~S_IFMT)) != NOTOK)
close (fd);
else
fprintf (stderr, "unable to zero MMDF mailbox\n");
lkclose (mmdf, mmdfbox), mmdf = NOTOK;
exit (0);
}
/* \f
*/
static int mbx_open (file)
char *file;
{
int count,
fd;
extern int errno;
for (count = 2; count > 0; count--)
if ((fd = lkopen (file, 1)) == NOTOK)
switch (errno) {
case ENOENT:
mbx_create (file);
break;
case ETXTBSY:
sleep (5);
break;
default:
goto openerr;
}
if (fd == NOTOK) {
openerr:
if (errno == ETXTBSY)
die ("your UUCP mailbox '%s' is busy", file);
else
die ("unable to open UUCP mailbox '%s'", file);
}
lseek (fd, 0L, 2);
return fd;
}
/* \f
*/
static mbx_create (file)
char *file;
{
int fd;
if ((fd = creat (file, MBXMODE)) == NOTOK)
die ("unable to create UUCP mailbox '%s'", file);
close (fd);
}
/* \f
*/
static mbx_copy (in, out)
int in,
out;
{
int i;
char buffer[BUFSIZ];
lseek (in, 0L, 0);
while ((i = read (in, buffer, sizeof buffer)) > 0)
if (write (out, buffer, i) != i)
die ("error writing UUCP mailbox");
if (i < 0)
die ("error reading temporary file");
}
/* \f
*/
static int tmp_open (mbx_fd)
int *mbx_fd;
{
int fd;
char tmpfil[LINESIZ];
strcpy (tmpfil, "/tmp/muincXXXXXX");
unlink (mktemp (tmpfil));
if ((fd = creat (tmpfil, TMPMODE)) == NOTOK)
die ("unable to create temporary file '%s'", tmpfil);
close (fd);
if ((fd = open (tmpfil, 2)) == NOTOK)
die ("unable to create temporary file '%s'", tmpfil);
unlink (tmpfil);
if ((*mbx_fd = dup (fd)) == NOTOK)
die ("unable to duplicate fd for temporary file '%s'", tmpfil);
return fd;
}
/* \f
*/
static die (fmt, a, b, c, d)
char *fmt,
*a,
*b,
*c,
*d;
{
lkclose (mmdf, mmdfbox), mmdf = NOTOK;
lkclose (uucp, uucpbox), uucp = NOTOK;
fflush (stdout);
fprintf (stderr, fmt, a, b, c, d);
putc ('\n', stderr);
exit (1);
}