Annotation of 43BSDReno/contrib/mh/zotnet/mf/muinc.c, revision 1.1

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

unix.superglobalmegacorp.com

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