Annotation of 43BSD/contrib/mh/uip/packf.c, revision 1.1.1.1

1.1       root        1: /* packf.c - pack a folder (used to be called "pack") */
                      2: 
                      3: #include "../h/mh.h"
                      4: #include "../h/dropsbr.h"
                      5: #include <errno.h>
                      6: #include <stdio.h>
                      7: #include <sys/types.h>
                      8: #include <sys/stat.h>
                      9: 
                     10: /*  */
                     11: 
                     12: static struct swit switches[] = {
                     13: #define FILESW 0
                     14:     "file name", 0,
                     15: 
                     16: #define        HELPSW  1
                     17:     "help", 4,
                     18: 
                     19:     NULL, NULL
                     20: };
                     21: 
                     22: /*  */
                     23: 
                     24: extern int errno;
                     25: 
                     26: 
                     27: static int  md = NOTOK;
                     28: 
                     29: char   *file = NULL;
                     30: 
                     31: /*  */
                     32: 
                     33: /* ARGSUSED */
                     34: 
                     35: main (argc, argv)
                     36: int     argc;
                     37: char  **argv;
                     38: {
                     39:     int     msgp = 0,
                     40:             fd,
                     41:             msgnum;
                     42:     char   *cp,
                     43:            *maildir,
                     44:            *msgnam,
                     45:            *folder = NULL,
                     46:             buf[100],
                     47:           **ap,
                     48:           **argp,
                     49:            *arguments[MAXARGS],
                     50:            *msgs[MAXARGS];
                     51:     struct msgs *mp;
                     52:     struct stat st;
                     53: 
                     54:     invo_name = r1bindex (argv[0], '/');
                     55:     if ((cp = m_find (invo_name)) != NULL) {
                     56:        ap = brkstring (cp = getcpy (cp), " ", "\n");
                     57:        ap = copyip (ap, arguments);
                     58:     }
                     59:     else
                     60:        ap = arguments;
                     61:     (void) copyip (argv + 1, ap);
                     62:     argp = arguments;
                     63: 
                     64: /*  */
                     65: 
                     66:     while (cp = *argp++) {
                     67:        if (*cp == '-')
                     68:            switch (smatch (++cp, switches)) {
                     69:                case AMBIGSW: 
                     70:                    ambigsw (cp, switches);
                     71:                    done (1);
                     72:                case UNKWNSW: 
                     73:                    adios (NULLCP, "-%s unknown", cp);
                     74:                case HELPSW: 
                     75:                    (void) sprintf (buf, "%s [+folder] [msgs] [switches]",
                     76:                            invo_name);
                     77:                    help (buf, switches);
                     78:                    done (1);
                     79: 
                     80:                case FILESW: 
                     81:                    if (file)
                     82:                        adios (NULLCP, "only one file at a time!");
                     83:                    if (!(file = *argp++) || *file == '-')
                     84:                        adios (NULLCP, "missing argument to %s", argp[-2]);
                     85:                    continue;
                     86:            }
                     87:        if (*cp == '+' || *cp == '@') {
                     88:            if (folder)
                     89:                adios (NULLCP, "only one folder at a time!");
                     90:            folder = path (cp + 1, *cp == '+' ? TFOLDER : TSUBCWF);
                     91:        }
                     92:        else
                     93:            msgs[msgp++] = cp;
                     94:     }
                     95: 
                     96: /*  */
                     97: 
                     98:     if (!file)
                     99:        file = "./msgbox";
                    100:     file = path (file, TFILE);
                    101:     if (stat (file, &st) == NOTOK) {
                    102:        if (errno != ENOENT)
                    103:            adios (file, "error on file");
                    104:        cp = concat ("Create file \"", file, "\"? ", NULLCP);
                    105:        if (!getanswer (cp))
                    106:            done (1);
                    107:        free (cp);
                    108:     }
                    109: 
                    110:     if (!m_find ("path"))
                    111:        free (path ("./", TFOLDER));
                    112:     if (!msgp)
                    113:        msgs[msgp++] = "all";
                    114:     if (!folder)
                    115:        folder = m_getfolder ();
                    116:     maildir = m_maildir (folder);
                    117: 
                    118:     if (chdir (maildir) == NOTOK)
                    119:        adios (maildir, "unable to change directory to ");
                    120:     if (!(mp = m_gmsg (folder)))
                    121:        adios (NULLCP, "unable to read folder %s", folder);
                    122:     if (mp -> hghmsg == 0)
                    123:        adios (NULLCP, "no messages in %s", folder);
                    124: 
                    125:     for (msgnum = 0; msgnum < msgp; msgnum++)
                    126:        if (!m_convert (mp, msgs[msgnum]))
                    127:            done (1);
                    128:     m_setseq (mp);
                    129: 
                    130:     if ((md = mbx_open (file, getuid (), getgid (), m_gmprot ())) == NOTOK)
                    131:        adios (file, "unable to open");
                    132: 
                    133:     for (msgnum = mp -> lowsel; msgnum <= mp -> hghsel; msgnum++)
                    134:        if (mp -> msgstats[msgnum] & SELECTED) {
                    135:            if ((fd = open (msgnam = m_name (msgnum), 0)) == NOTOK) {
                    136:                admonish (msgnam, "unable to read message");
                    137:                break;
                    138:            }
                    139: 
                    140:            if (mbx_copy (file, md, fd, 1, NULLCP, 1) == NOTOK)
                    141:                adios (file, "error writing to file");
                    142: 
                    143:            (void) close (fd);
                    144:        }
                    145:     (void) mbx_close (file, md);
                    146: 
                    147:     m_replace (pfolder, folder);
                    148:     if (mp -> hghsel != mp -> curmsg)
                    149:        m_setcur (mp, mp -> lowsel);
                    150:     m_sync (mp);
                    151:     m_update ();
                    152: 
                    153:     done (0);
                    154: }
                    155: 
                    156: /*  */
                    157: 
                    158: void done (status)
                    159: int status;
                    160: {
                    161:     (void) mbx_close (file, md);
                    162: 
                    163:     exit (status);
                    164: }

unix.superglobalmegacorp.com

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