Annotation of 43BSD/contrib/mh/zotnet/mf/uminc.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.