annotate uip/packf.c @ 10:a6481689f99c

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