|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.