]> diplodocus.org Git - nmh/blob - docs/historical/mh-6.8.5/sbr/RCS/m_gmsg.c,v
Always check that mktemp()/mktemp2() succeeds before trying to
[nmh] / docs / historical / mh-6.8.5 / sbr / RCS / m_gmsg.c,v
1 head 2.10;
2 access;
3 symbols;
4 locks; strict;
5 comment @ * @;
6
7
8 2.10
9 date 92.10.20.22.46.29; author jromine; state Exp;
10 branches;
11 next 2.9;
12
13 2.9
14 date 92.05.12.22.11.10; author jromine; state Exp;
15 branches;
16 next 2.8;
17
18 2.8
19 date 92.02.11.21.32.04; author jromine; state Exp;
20 branches;
21 next 2.7;
22
23 2.7
24 date 92.02.05.06.40.22; author jromine; state Exp;
25 branches;
26 next 2.6;
27
28 2.6
29 date 92.02.03.16.35.10; author jromine; state Exp;
30 branches;
31 next 2.5;
32
33 2.5
34 date 90.04.05.15.30.20; author sources; state Exp;
35 branches;
36 next 2.4;
37
38 2.4
39 date 90.04.05.14.43.48; author sources; state Exp;
40 branches;
41 next 2.3;
42
43 2.3
44 date 90.03.20.15.57.29; author sources; state Exp;
45 branches;
46 next 2.2;
47
48 2.2
49 date 90.02.06.13.08.58; author sources; state Exp;
50 branches;
51 next 2.1;
52
53 2.1
54 date 90.02.01.14.07.33; author sources; state Exp;
55 branches;
56 next 2.0;
57
58 2.0
59 date 89.11.17.15.57.24; author sources; state Exp;
60 branches;
61 next 1.1;
62
63 1.1
64 date 89.06.26.14.31.47; author sources; state Exp;
65 branches;
66 next ;
67
68
69 desc
70 @@
71
72
73 2.10
74 log
75 @NULL fix
76 @
77 text
78 @/* m_gmsg.c - read a folder */
79 #ifndef lint
80 static char ident[] = "@@(#)$Id: m_gmsg.c,v 2.9 1992/05/12 22:11:10 jromine Exp jromine $";
81 #endif /* lint */
82
83 #include "../h/mh.h"
84 #include "../h/local.h"
85 #include <stdio.h>
86
87
88 #define NINFO (MAXFOLDER / 5) /* PLEASE be non-trivial... */
89 struct info {
90 int msgno;
91 int stats;
92 };
93
94 static int len=0;
95 static struct info *head;
96
97 static m_getatr();
98 static int m_setatr();
99 /* \f */
100
101 struct msgs *m_gmsg (name)
102 register char *name;
103 {
104 #ifdef COMPAT
105 register int cur,
106 fd;
107 #endif /* COMPAT */
108 register int i,
109 j;
110 register struct info *rover,
111 *tail;
112 #ifdef COMPAT
113 register char *cp;
114 char buffer[BUFSIZ];
115 #endif /* COMPAT */
116 register struct msgs *mp;
117 #ifdef SYS5DIR
118 register struct dirent *dp;
119 DIR * dd;
120 #else /* SYS5DIR */
121 register struct direct *dp;
122 register DIR * dd;
123 #endif /* SYS5DIR */
124 struct stat st;
125
126 if ((dd = opendir (name = m_mailpath (name))) == NULL) {
127 free (name);
128 return NULL;
129 }
130 (void) fstat (dd -> dd_fd, &st);
131
132 mp = (struct msgs *) malloc (MHSIZE (mp, 0, 0));
133 if (mp == NULL)
134 adios (NULLCP, "unable to allocate folder storage");
135 mp -> lowmsg = mp -> hghmsg = mp -> nummsg = 0;
136 mp -> curmsg = 0;
137 mp -> lowsel = mp -> hghsel = mp -> numsel = 0;
138 mp -> foldpath = name;
139 mp -> msgflags = 0;
140 if (st.st_uid != getuid () || access (name, 02) == NOTOK)
141 mp -> msgflags |= READONLY;
142 #ifdef COMPAT
143 cur = 0;
144 #endif /* COMPAT */
145 j = strlen (SBACKUP);
146 if (head == NULL)
147 if ((head = (struct info *)
148 malloc ((unsigned) ((len = NINFO) * sizeof *head))) == NULL)
149 adios (NULLCP, "unable to allocate info storage");
150 tail = (rover = head) + len;
151
152 while (dp = readdir (dd))
153 if (i = m_atoi (dp -> d_name)) {
154 if (rover >= tail) {
155 register int curlen = tail - head;
156
157 if ((tail = (struct info *) realloc ((char *) head,
158 (unsigned) ((len += NINFO) * sizeof *head)))
159 == NULL)
160 adios (NULLCP, "unable to allocate info storage");
161 else
162 rover = tail + curlen, head = tail, tail += len;
163 }
164 if (i > mp -> hghmsg)
165 mp -> hghmsg = i;
166 mp -> nummsg++;
167 if (mp -> lowmsg == 0 || i < mp -> lowmsg)
168 mp -> lowmsg = i;
169 rover -> msgno = i;
170 rover -> stats = EXISTS;
171 #ifdef notdef
172 rover -> stats &= ~DELETED;
173 #endif /* notdef */
174 rover++;
175 }
176 else
177 switch (dp -> d_name[0]) {
178 case '.':
179 continue;
180
181 case ',':
182 #ifdef notdef
183 if ((i = m_atoi (dp -> d_name + 1)) {
184 register struct info *l;
185
186 for (l = head; l < rover; l++)
187 if (l -> msgno == i) {
188 if (!(l -> stats & EXISTS))
189 l -> stats |= DELETED;
190 break;
191 }
192 }
193 #endif /* notdef */
194 continue;
195
196 #ifdef MHE
197 case '+':
198 continue;
199 #endif /* MHE */
200
201 #ifdef UCI
202 case '_':
203 case '#':
204 continue;
205 #endif /* UCI */
206
207 default:
208 #ifdef COMPAT
209 if (strcmp (dp -> d_name, current) == 0) {
210 cur++;
211 continue;
212 }
213 #endif /* COMPAT */
214 if (strcmp (dp -> d_name, LINK) == 0
215 || strncmp (dp -> d_name, SBACKUP, j) == 0)
216 continue;
217 mp -> msgflags |= OTHERS;
218 continue;
219 }
220
221 closedir (dd);
222
223 /* \f */
224
225 #ifdef COMPAT
226 (void) sprintf (buffer, "%s-%s", current, name);
227 if (cp = m_find (buffer)) {
228 i = m_atoi (cp);
229 (void) m_delete(buffer);
230 if (i > 0)
231 mp -> curmsg = i;
232 }
233 if (mp -> curmsg == 0 && cur && (fd = open (current, 0)) != NOTOK) {
234 if ((i = read (fd, buffer, sizeof buffer)) > 0) {
235 if (cp = index (buffer, '\n'))
236 *cp = 0;
237 if ((i = m_atoi (buffer)) > 0)
238 mp -> curmsg = i;
239 }
240 (void) close (fd);
241 }
242 if (cur && !(mp -> msgflags & READONLY)){ /* sneaky... */
243 (void) sprintf (buffer, "%s/%s", name, current);
244 (void) unlink (buffer);
245 }
246 #endif /* COMPAT */
247
248 #ifndef MTR
249 mp -> lowoff = 1;
250 #else /* MTR */
251 mp -> lowoff = mp -> lowmsg;
252 #endif /* MTR */
253 mp -> hghoff = mp -> hghmsg + 1;/* for "new" in m_convert */
254
255 mp = (struct msgs *)
256 realloc ((char *) mp, MHSIZE (mp, mp -> lowoff, mp -> hghoff));
257 if (mp == NULL)
258 adios (NULLCP, "unable to allocate folder storage");
259 #ifndef MTR
260 for (i = mp -> lowmsg; i <= mp -> hghmsg; i++)
261 mp -> msgstats[i] = 0;
262 #else /* MTR */
263 mp -> msgstats = (int *)
264 calloc ((unsigned) 1, MHSIZEX (mp, mp -> lowmsg, mp -> hghmsg));
265 if (mp -> msgstats == NULL)
266 adios (NULLCP, "unable to allocate messages storage");
267 mp -> msgstats = (mp -> msgbase = mp -> msgstats) - mp -> lowoff;
268 if (mp -> msgstats < (int *)0) /* non portable */
269 adios (NULLCP, "m_gmsg() botch -- you lose big");
270 #endif /* MTR */
271 for (tail = head; tail < rover; tail++)
272 mp -> msgstats[tail -> msgno] = tail -> stats;
273 m_getatr (mp);
274
275 return mp;
276 }
277
278 /* \f */
279
280 static m_getatr (mp)
281 register struct msgs *mp;
282 {
283 int alen,
284 bits,
285 i,
286 j,
287 plen,
288 state;
289 register char *cp;
290 char name[NAMESZ],
291 field[BUFSIZ * 2];
292 register struct node *np;
293 register FILE * fp;
294
295 bits = FFATTRSLOT;
296
297 mp -> msgattrs[i = 0] = getcpy (current);
298 mp -> msgattrs[++i] = '\0';
299 mp -> attrstats = 0; /* initially, all public */
300
301 m_getdefs ();
302 if (mh_seq == '\0' || *mh_seq == '\0')
303 goto private_only;
304
305 (void) sprintf (field, "%s/%s", mp -> foldpath, mh_seq);
306 if (fp = fopen (field, "r")) {
307 for (state = FLD;;) {
308 switch (state = m_getfld (state, name, field, sizeof field, fp)) {
309 case FLD:
310 case FLDEOF:
311 (void) m_setatr (mp, getcpy (name), trimcpy (field));
312 if (state == FLDEOF)
313 break;
314 continue;
315
316 case BODY:
317 case BODYEOF:
318 adios (NULLCP,
319 "no blank lines are permitted in %s/%s",
320 mp -> foldpath, mh_seq);/* fall */
321
322 case FILEEOF:
323 break;
324
325 default:
326 adios (NULLCP, "%s/%s is poorly formatted",
327 mp -> foldpath, mh_seq);
328 }
329 break;
330 }
331 (void) fclose (fp);
332 }
333
334 private_only: ;
335 alen = strlen ("atr-");
336 plen = strlen (mp -> foldpath) + 1;
337
338 for (np = m_defs; np; np = np -> n_next)
339 if (ssequal ("atr-", np -> n_name)
340 && (j = strlen (np -> n_name) - plen) > alen
341 && *(np -> n_name + j) == '-'
342 && strcmp (mp -> foldpath, np -> n_name + j + 1) == 0) {
343 cp = getcpy (np -> n_name + alen);
344 *(cp + j - alen) = '\0';
345 if ((i = m_setatr (mp, cp, getcpy (np -> n_field))) != NOTOK)
346 mp -> attrstats |= 1 << (bits + i);/* private */
347 }
348 }
349
350 /* \f */
351
352 static int m_setatr (mp, name, field)
353 register struct msgs *mp;
354 register char *name,
355 *field;
356 {
357 int bits,
358 hack;
359 register int i,
360 j,
361 k;
362 register char *cp,
363 **ap;
364
365 bits = FFATTRSLOT;
366 hack = strcmp (current, name) == 0;/* hack... */
367 /* if we're going to use UNSEEN, it should be set here! */
368
369 for (i = 0; mp -> msgattrs[i]; i++)
370 if (strcmp (mp -> msgattrs[i], name) == 0) {
371 for (j = mp -> lowmsg; j <= mp -> hghmsg; j++)
372 mp -> msgstats[j] &= ~(1 << (bits + i));
373 break;
374 }
375 if (i >= NATTRS) {
376 free (name);
377 free (field);
378 return NOTOK;
379 }
380
381 if (mp -> msgattrs[i] == NULL) {
382 mp -> msgattrs[i] = name;
383 mp -> msgattrs[i + 1] = NULL;
384 }
385 else
386 free (name);
387
388 for (ap = brkstring (field, " ", "\n");
389 *ap;
390 ap++) {
391 if (cp = index (*ap, '-'))
392 *cp++ = '\0';
393 if ((j = m_atoi (*ap)) > 0) {
394 #ifdef notdef
395 if (hack && j >= mp -> lowmsg && j <= mp -> hghmsg
396 && (mp -> msgstats[j] & EXISTS))
397 mp -> curmsg = j;
398 #else /* not notdef */
399 if (hack)
400 mp -> curmsg = j;
401 #endif /* not notdef */
402 for (k = cp ? m_atoi (cp) : j; j <= k; j++)
403 if (j >= mp -> lowmsg && j <= mp -> hghmsg
404 && (mp -> msgstats[j] & EXISTS))
405 mp -> msgstats[j] |= 1 << (bits + i);
406 }
407 }
408 free (field);
409
410 return i;
411 }
412 @
413
414
415 2.9
416 log
417 @fix ifdefs
418 @
419 text
420 @d3 1
421 a3 1
422 static char ident[] = "@@(#)$Id: m_gmsg.c,v 2.8 1992/02/11 21:32:04 jromine Exp jromine $";
423 d159 1
424 a159 1
425 *cp = NULL;
426 @
427
428
429 2.8
430 log
431 @put sequences in an "int"
432 @
433 text
434 @d3 2
435 a4 2
436 static char ident[] = "@@(#)$Id: m_gmsg.c,v 2.7 1992/02/05 06:40:22 jromine Exp $";
437 #endif lint
438 d30 1
439 a30 1
440 #endif COMPAT
441 d38 1
442 a38 1
443 #endif COMPAT
444 d43 1
445 a43 1
446 #else SYS5DIR
447 d46 1
448 a46 1
449 #endif SYS5DIR
450 d62 1
451 a62 1
452 mp -> msgflags = NULL;
453 d67 1
454 a67 1
455 #endif COMPAT
456 d96 1
457 a96 1
458 #endif notdef
459 d116 1
460 a116 1
461 #endif notdef
462 d122 1
463 a122 1
464 #endif MHE
465 d128 1
466 a128 1
467 #endif UCI
468 d136 1
469 a136 1
470 #endif COMPAT
471 d169 1
472 a169 1
473 #endif COMPAT
474 d173 1
475 a173 1
476 #else MTR
477 d175 1
478 a175 1
479 #endif MTR
480 d185 1
481 a185 1
482 #else MTR
483 d193 1
484 a193 1
485 #endif MTR
486 d221 1
487 a221 1
488 mp -> msgattrs[++i] = NULL;
489 d225 1
490 a225 1
491 if (mh_seq == NULL || *mh_seq == NULL)
492 d267 1
493 a267 1
494 *(cp + j - alen) = NULL;
495 d315 1
496 a315 1
497 *cp++ = NULL;
498 d321 1
499 a321 1
500 #else not notdef
501 d324 1
502 a324 1
503 #endif not notdef
504 @
505
506
507 2.7
508 log
509 @comment
510 @
511 text
512 @d3 1
513 a3 1
514 static char ident[] = "@@(#)$Id: m_gmsg.c,v 2.6 1992/02/03 16:35:10 jromine Exp jromine $";
515 d14 1
516 a14 2
517 short stats;
518 char pad[sizeof (int) - sizeof (short)];
519 d186 1
520 a186 1
521 mp -> msgstats = (short *)
522 d191 1
523 a191 1
524 if (mp -> msgstats < (short *)0) /* non portable */
525 @
526
527
528 2.6
529 log
530 @fix
531 @
532 text
533 @d3 1
534 a3 1
535 static char ident[] = "@@(#)$Id: m_gmsg.c,v 2.5 1990/04/05 15:30:20 sources Exp jromine $";
536 d291 1
537 @
538
539
540 2.5
541 log
542 @add ID
543 @
544 text
545 @d3 1
546 a3 1
547 static char ident[] = "@@(#)$Id:$";
548 d56 1
549 a56 1
550 mp = (struct msgs *) malloc (MSIZE (mp, 0, 0));
551 d180 1
552 a180 1
553 realloc ((char *) mp, MSIZE (mp, mp -> lowoff, mp -> hghoff));
554 d188 1
555 a188 1
556 calloc ((unsigned) 1, MSIZEX (mp, mp -> lowmsg, mp -> hghmsg));
557 @
558
559
560 2.4
561 log
562 @add ID
563 @
564 text
565 @d3 1
566 a3 1
567 static char ident[] = "$Id:";
568 @
569
570
571 2.3
572 log
573 @cast null pointer
574 @
575 text
576 @d2 3
577 @
578
579
580 2.2
581 log
582 @ANSI Compilance
583 @
584 text
585 @d189 1
586 a189 1
587 if (mp -> msgstats < 0)
588 @
589
590
591 2.1
592 log
593 @increase message sequence buffer size by factor of 2. I hope this
594 is worth it, since it'll make things bigger.
595 @
596 text
597 @d18 2
598 @
599
600
601 2.0
602 log
603 @changes for SUN40 shared libraries and NNTP under bbc
604 @
605 text
606 @d210 1
607 a210 1
608 field[BUFSIZ];
609 @
610
611
612 1.1
613 log
614 @Initial revision
615 @
616 text
617 @d36 4
618 d42 1
619 @