|
|
1.1 ! root 1: /* muinc.c - mmdf to uucp inc */ ! 2: ! 3: #include "mf.h" ! 4: #include <stdio.h> ! 5: #include "../mts/mts.h" ! 6: #include <errno.h> ! 7: #include <sys/types.h> ! 8: #include <sys/stat.h> ! 9: ! 10: ! 11: static int mmdf = NOTOK; ! 12: static int uucp = NOTOK; ! 13: static char mmdfbox[LINESIZ]; ! 14: static char uucpbox[LINESIZ]; ! 15: ! 16: /* */ ! 17: ! 18: main (argc, argv) ! 19: int argc; ! 20: char *argv[]; ! 21: { ! 22: int fd, ! 23: tmp; ! 24: struct stat st1, ! 25: st2; ! 26: ! 27: mts_init (*argv); ! 28: sprintf (mmdfbox, "%s/%s", MAILDIR, MAILFIL); ! 29: if (stat (mmdfbox, &st1) == NOTOK || st1.st_size == 0L) ! 30: exit (0); ! 31: if ((mmdf = lkopen (mmdfbox, 0)) == NOTOK) ! 32: die ("unable to lock and open %s", mmdfbox); ! 33: tmp = tmp_open (&fd); ! 34: ! 35: switch (fd = mmdf2uucp (mmdf, fd, FALSE)) { ! 36: case MFOK: ! 37: break; ! 38: ! 39: case MFPRM: ! 40: die ("internal error while filtering MMDF mail"); ! 41: ! 42: case MFSIO: ! 43: die ("no free file pointers -- you lose"); ! 44: ! 45: case MFERR: ! 46: die ("i/o error while filtering MMDF mail"); ! 47: ! 48: case MFROM: ! 49: case MFHDR: ! 50: case MFTXT: ! 51: fprintf (stderr, "MMDF mailbox in bad format, patched...\n"); ! 52: break; ! 53: } ! 54: ! 55: sprintf (uucpbox, "%s/%s", UUCPDIR, UUCPFIL); ! 56: uucp = mbx_open (uucpbox); ! 57: mbx_copy (tmp, uucp); ! 58: close (tmp); ! 59: lkclose (uucp, uucpbox), uucp = NOTOK; ! 60: ! 61: if (stat (mmdfbox, &st2) != NOTOK && st1.st_mtime != st2.st_mtime) ! 62: fprintf (stderr, "MMDF mailbox has been updated... (%s)\n", ! 63: "so it won't be zero'd"); ! 64: else ! 65: if ((fd = creat (mmdfbox, st1.st_mode & ~S_IFMT)) != NOTOK) ! 66: close (fd); ! 67: else ! 68: fprintf (stderr, "unable to zero MMDF mailbox\n"); ! 69: lkclose (mmdf, mmdfbox), mmdf = NOTOK; ! 70: ! 71: exit (0); ! 72: } ! 73: ! 74: /* */ ! 75: ! 76: static int mbx_open (file) ! 77: char *file; ! 78: { ! 79: int count, ! 80: fd; ! 81: extern int errno; ! 82: ! 83: for (count = 2; count > 0; count--) ! 84: if ((fd = lkopen (file, 1)) == NOTOK) ! 85: switch (errno) { ! 86: case ENOENT: ! 87: mbx_create (file); ! 88: break; ! 89: case ETXTBSY: ! 90: sleep (5); ! 91: break; ! 92: default: ! 93: goto openerr; ! 94: } ! 95: ! 96: if (fd == NOTOK) { ! 97: openerr: ! 98: if (errno == ETXTBSY) ! 99: die ("your UUCP mailbox '%s' is busy", file); ! 100: else ! 101: die ("unable to open UUCP mailbox '%s'", file); ! 102: } ! 103: ! 104: lseek (fd, 0L, 2); ! 105: ! 106: return fd; ! 107: } ! 108: ! 109: /* */ ! 110: ! 111: static mbx_create (file) ! 112: char *file; ! 113: { ! 114: int fd; ! 115: ! 116: if ((fd = creat (file, MBXMODE)) == NOTOK) ! 117: die ("unable to create UUCP mailbox '%s'", file); ! 118: ! 119: close (fd); ! 120: } ! 121: ! 122: /* */ ! 123: ! 124: static mbx_copy (in, out) ! 125: int in, ! 126: out; ! 127: { ! 128: int i; ! 129: char buffer[BUFSIZ]; ! 130: ! 131: lseek (in, 0L, 0); ! 132: ! 133: while ((i = read (in, buffer, sizeof buffer)) > 0) ! 134: if (write (out, buffer, i) != i) ! 135: die ("error writing UUCP mailbox"); ! 136: if (i < 0) ! 137: die ("error reading temporary file"); ! 138: } ! 139: ! 140: /* */ ! 141: ! 142: static int tmp_open (mbx_fd) ! 143: int *mbx_fd; ! 144: { ! 145: int fd; ! 146: char tmpfil[LINESIZ]; ! 147: ! 148: strcpy (tmpfil, "/tmp/muincXXXXXX"); ! 149: unlink (mktemp (tmpfil)); ! 150: if ((fd = creat (tmpfil, TMPMODE)) == NOTOK) ! 151: die ("unable to create temporary file '%s'", tmpfil); ! 152: close (fd); ! 153: ! 154: if ((fd = open (tmpfil, 2)) == NOTOK) ! 155: die ("unable to create temporary file '%s'", tmpfil); ! 156: unlink (tmpfil); ! 157: ! 158: if ((*mbx_fd = dup (fd)) == NOTOK) ! 159: die ("unable to duplicate fd for temporary file '%s'", tmpfil); ! 160: ! 161: return fd; ! 162: } ! 163: ! 164: /* */ ! 165: ! 166: static die (fmt, a, b, c, d) ! 167: char *fmt, ! 168: *a, ! 169: *b, ! 170: *c, ! 171: *d; ! 172: { ! 173: lkclose (mmdf, mmdfbox), mmdf = NOTOK; ! 174: lkclose (uucp, uucpbox), uucp = NOTOK; ! 175: ! 176: fflush (stdout); ! 177: fprintf (stderr, fmt, a, b, c, d); ! 178: putc ('\n', stderr); ! 179: ! 180: exit (1); ! 181: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.