|
|
1.1 ! root 1: /* uminc.c - uucp to mmdf 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: long lseek (); ! 18: ! 19: /* */ ! 20: ! 21: main (argc, argv) ! 22: int argc; ! 23: char *argv[]; ! 24: { ! 25: int fd, ! 26: tmp; ! 27: struct stat st1, ! 28: st2; ! 29: ! 30: mts_init (*argv); ! 31: sprintf (uucpbox, "%s/%s", UUCPDIR, UUCPFIL); ! 32: if (stat (uucpbox, &st1) == NOTOK || st1.st_size == 0L) ! 33: exit (0); ! 34: if ((uucp = lkopen (uucpbox, 0)) == NOTOK) ! 35: die ("unable to lock and open %s", uucpbox); ! 36: tmp = tmp_open (&fd); ! 37: ! 38: switch (fd = uucp2mmdf (uucp, fd, FALSE)) { ! 39: case MFOK: ! 40: break; ! 41: ! 42: case MFPRM: ! 43: die ("internal error while filtering UUCP mail"); ! 44: ! 45: case MFSIO: ! 46: die ("no free file pointers -- you lose"); ! 47: ! 48: case MFERR: ! 49: die ("i/o error while filtering UUCP mail"); ! 50: ! 51: case MFROM: ! 52: case MFHDR: ! 53: case MFTXT: ! 54: fprintf (stderr, "UUCP mailbox in bad format, patched...\n"); ! 55: break; ! 56: } ! 57: ! 58: sprintf (mmdfbox, "%s/%s", MAILDIR, MAILFIL); ! 59: mmdf = mbx_open (mmdfbox); ! 60: mbx_copy (tmp, mmdf); ! 61: close (tmp); ! 62: lkclose (mmdf, mmdfbox), mmdf = NOTOK; ! 63: ! 64: if (stat (uucpbox, &st2) != NOTOK && st1.st_mtime != st2.st_mtime) ! 65: fprintf (stderr, "UUCP mailbox has been updated... (%s)\n", ! 66: "so it won't be removed"); ! 67: else ! 68: if (unlink (uucpbox) == NOTOK) ! 69: if ((fd = creat (uucpbox, st1.st_mode & ~S_IFMT)) != NOTOK) ! 70: close (fd); ! 71: else ! 72: fprintf (stderr, "unable to remove or zero UUCP mailbox\n"); ! 73: lkclose (uucp, uucpbox), uucp = NOTOK; ! 74: ! 75: exit (0); ! 76: } ! 77: ! 78: /* */ ! 79: ! 80: static int mbx_open (file) ! 81: char *file; ! 82: { ! 83: int clear, ! 84: count, ! 85: fd; ! 86: extern int errno; ! 87: struct stat stbuf; ! 88: ! 89: for (clear = FALSE, count = 2; count > 0; count--) ! 90: if ((fd = lkopen (file, 6)) == NOTOK) ! 91: switch (errno) { ! 92: case ENOENT: ! 93: mbx_create (file); ! 94: clear++; ! 95: break; ! 96: ! 97: case ETXTBSY: ! 98: sleep (5); ! 99: break; ! 100: ! 101: default: ! 102: goto openerr; ! 103: } ! 104: else { ! 105: if (fstat (fd, &stbuf) == NOTOK) ! 106: die ("unable to stat MMDF mailbox '%s'", file); ! 107: clear = stbuf.st_size == 0L; ! 108: break; ! 109: } ! 110: ! 111: if (fd == NOTOK) { ! 112: openerr: ! 113: if (errno == ETXTBSY) ! 114: die ("your MMDF mailbox '%s' is busy", file); ! 115: else ! 116: die ("unable to open MMDF mailbox '%s'", file); ! 117: } ! 118: if (!clear) ! 119: mbx_chk (fd, file); ! 120: ! 121: return fd; ! 122: } ! 123: ! 124: /* */ ! 125: ! 126: static mbx_create (file) ! 127: char *file; ! 128: { ! 129: int fd; ! 130: ! 131: if ((fd = creat (file, MBXMODE)) == NOTOK) ! 132: die ("unable to create MMDF mailbox '%s'", file); ! 133: ! 134: close (fd); ! 135: } ! 136: ! 137: ! 138: static mbx_chk (fd, file) ! 139: int fd; ! 140: char *file; ! 141: { ! 142: int count; ! 143: char ldelim[20]; ! 144: ! 145: count = strlen (mmdlm2); ! 146: ! 147: if (lseek (fd, (long) - count, 2) == (long) NOTOK ! 148: || read (fd, ldelim, count) != count) ! 149: die ("error reading MMDF mailbox '%s'", file); ! 150: ldelim[count] = NULL; ! 151: ! 152: if (strcmp (ldelim, mmdlm2)) { ! 153: fprintf (stderr, ! 154: "MMDF mailbox '%s' has bad delimiter, patching...\n", ! 155: file); ! 156: if (write (fd, mmdlm2, count) != count) ! 157: die ("error writing MMDF mailbox '%s'", file); ! 158: } ! 159: } ! 160: ! 161: /* */ ! 162: ! 163: static mbx_copy (in, out) ! 164: int in, ! 165: out; ! 166: { ! 167: int i; ! 168: char buffer[BUFSIZ]; ! 169: ! 170: lseek (in, 0L, 0); ! 171: ! 172: while ((i = read (in, buffer, sizeof buffer)) > 0) ! 173: if (write (out, buffer, i) != i) ! 174: die ("error writing MMDF mailbox"); ! 175: if (i < 0) ! 176: die ("error reading temporary file"); ! 177: ! 178: close (in); ! 179: close (out); ! 180: } ! 181: ! 182: /* */ ! 183: ! 184: static int tmp_open (mbx_fd) ! 185: int *mbx_fd; ! 186: { ! 187: int fd; ! 188: char tmpfil[LINESIZ]; ! 189: ! 190: strcpy (tmpfil, "/tmp/umincXXXXXX"); ! 191: unlink (mktemp (tmpfil)); ! 192: if ((fd = creat (tmpfil, TMPMODE)) == NOTOK) ! 193: die ("unable to create temporary file '%s'", tmpfil); ! 194: close (fd); ! 195: ! 196: if ((fd = open (tmpfil, 2)) == NOTOK) ! 197: die ("unable to create temporary file '%s'", tmpfil); ! 198: unlink (tmpfil); ! 199: ! 200: if ((*mbx_fd = dup (fd)) == NOTOK) ! 201: die ("unable to duplicate fd for temporary file '%s'", tmpfil); ! 202: ! 203: return fd; ! 204: } ! 205: ! 206: /* */ ! 207: ! 208: static die (fmt, a, b, c, d) ! 209: char *fmt, ! 210: *a, ! 211: *b, ! 212: *c, ! 213: *d; ! 214: { ! 215: lkclose (mmdf, mmdfbox), mmdf = NOTOK; ! 216: lkclose (uucp, uucpbox), uucp = NOTOK; ! 217: ! 218: fflush (stdout); ! 219: fprintf (stderr, fmt, a, b, c, d); ! 220: putc ('\n', stderr); ! 221: ! 222: exit (1); ! 223: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.