|
|
1.1 ! root 1: /* m_gmsg.c - read a folder */ ! 2: ! 3: #include "../h/mh.h" ! 4: #include <stdio.h> ! 5: #include <sys/types.h> ! 6: #include <sys/stat.h> ! 7: #ifndef BSD42 ! 8: #ifndef SYS5 ! 9: #include <ndir.h> ! 10: #else SYS5 ! 11: #include <dir.h> ! 12: #endif SYS5 ! 13: #else BSD42 ! 14: #include <sys/dir.h> ! 15: #endif BSD42 ! 16: ! 17: ! 18: #define NINFO (MAXFOLDER / 5) /* PLEASE be non-trivial... */ ! 19: struct info { ! 20: int msgno; ! 21: short stats; ! 22: char pad[sizeof (int) - sizeof (short)]; ! 23: }; ! 24: ! 25: static int len; ! 26: static struct info *head; ! 27: ! 28: /* */ ! 29: ! 30: struct msgs *m_gmsg (name) ! 31: register char *name; ! 32: { ! 33: #ifdef COMPAT ! 34: register int cur, ! 35: fd; ! 36: #endif COMPAT ! 37: register int i, ! 38: j; ! 39: register struct info *rover, ! 40: *tail; ! 41: #ifdef COMPAT ! 42: register char *cp; ! 43: char buffer[BUFSIZ]; ! 44: #endif COMPAT ! 45: register struct msgs *mp; ! 46: register struct direct *dp; ! 47: register DIR * dd; ! 48: struct stat st; ! 49: ! 50: if ((dd = opendir (name = m_mailpath (name))) == NULL) { ! 51: free (name); ! 52: return NULL; ! 53: } ! 54: (void) fstat (dd -> dd_fd, &st); ! 55: ! 56: mp = (struct msgs *) malloc (MSIZE (mp, 0, 0)); ! 57: if (mp == NULL) ! 58: adios (NULLCP, "unable to allocate folder storage"); ! 59: mp -> lowmsg = mp -> hghmsg = mp -> nummsg = 0; ! 60: mp -> curmsg = 0; ! 61: mp -> lowsel = mp -> hghsel = mp -> numsel = 0; ! 62: mp -> foldpath = name; ! 63: mp -> msgflags = NULL; ! 64: if (st.st_uid != getuid () || access (name, 02) == NOTOK) ! 65: mp -> msgflags |= READONLY; ! 66: #ifdef COMPAT ! 67: cur = 0; ! 68: #endif COMPAT ! 69: j = strlen (SBACKUP); ! 70: if (head == NULL) ! 71: if ((head = (struct info *) ! 72: malloc ((unsigned) ((len = NINFO) * sizeof *head))) == NULL) ! 73: adios (NULLCP, "unable to allocate info storage"); ! 74: tail = (rover = head) + len; ! 75: ! 76: while (dp = readdir (dd)) ! 77: if (i = m_atoi (dp -> d_name)) { ! 78: if (rover >= tail) { ! 79: register int curlen = tail - head; ! 80: ! 81: if ((tail = (struct info *) realloc ((char *) head, ! 82: (unsigned) ((len += NINFO) * sizeof *head))) ! 83: == NULL) ! 84: adios (NULLCP, "unable to allocate info storage"); ! 85: else ! 86: rover = tail + curlen, head = tail, tail += len; ! 87: } ! 88: if (i > mp -> hghmsg) ! 89: mp -> hghmsg = i; ! 90: mp -> nummsg++; ! 91: if (mp -> lowmsg == 0 || i < mp -> lowmsg) ! 92: mp -> lowmsg = i; ! 93: rover -> msgno = i; ! 94: rover -> stats = EXISTS; ! 95: #ifdef notdef ! 96: rover -> stats &= ~DELETED; ! 97: #endif notdef ! 98: rover++; ! 99: } ! 100: else ! 101: switch (dp -> d_name[0]) { ! 102: case '.': ! 103: continue; ! 104: ! 105: case ',': ! 106: #ifdef notdef ! 107: if ((i = m_atoi (dp -> d_name + 1)) { ! 108: register struct info *l; ! 109: ! 110: for (l = head; l < rover; l++) ! 111: if (l -> msgno == i) { ! 112: if (!(l -> stats & EXISTS)) ! 113: l -> stats |= DELETED; ! 114: break; ! 115: } ! 116: } ! 117: #endif notdef ! 118: continue; ! 119: ! 120: #ifdef MHE ! 121: case '+': ! 122: continue; ! 123: #endif MHE ! 124: ! 125: #ifdef UCI ! 126: case '_': ! 127: case '#': ! 128: continue; ! 129: #endif UCI ! 130: ! 131: default: ! 132: #ifdef COMPAT ! 133: if (strcmp (dp -> d_name, current) == 0) { ! 134: cur++; ! 135: continue; ! 136: } ! 137: #endif COMPAT ! 138: if (strcmp (dp -> d_name, LINK) == 0 ! 139: || strncmp (dp -> d_name, SBACKUP, j) == 0) ! 140: continue; ! 141: mp -> msgflags |= OTHERS; ! 142: continue; ! 143: } ! 144: ! 145: closedir (dd); ! 146: ! 147: /* */ ! 148: ! 149: #ifdef COMPAT ! 150: (void) sprintf (buffer, "%s-%s", current, name); ! 151: if (cp = m_find (buffer)) { ! 152: i = m_atoi (cp); ! 153: (void) m_delete(buffer); ! 154: if (i > 0) ! 155: mp -> curmsg = i; ! 156: } ! 157: if (mp -> curmsg == 0 && cur && (fd = open (current, 0)) != NOTOK) { ! 158: if ((i = read (fd, buffer, sizeof buffer)) > 0) { ! 159: if (cp = index (buffer, '\n')) ! 160: *cp = NULL; ! 161: if ((i = m_atoi (buffer)) > 0) ! 162: mp -> curmsg = i; ! 163: } ! 164: (void) close (fd); ! 165: } ! 166: if (cur && !(mp -> msgflags & READONLY)){ /* sneaky... */ ! 167: (void) sprintf (buffer, "%s/%s", name, current); ! 168: (void) unlink (buffer); ! 169: } ! 170: #endif COMPAT ! 171: ! 172: #ifndef MTR ! 173: mp -> lowoff = 1; ! 174: #else MTR ! 175: mp -> lowoff = mp -> lowmsg; ! 176: #endif MTR ! 177: mp -> hghoff = mp -> hghmsg + 1;/* for "new" in m_convert */ ! 178: ! 179: mp = (struct msgs *) ! 180: realloc ((char *) mp, MSIZE (mp, mp -> lowoff, mp -> hghoff)); ! 181: if (mp == NULL) ! 182: adios (NULLCP, "unable to allocate folder storage"); ! 183: #ifndef MTR ! 184: for (i = mp -> lowmsg; i <= mp -> hghmsg; i++) ! 185: mp -> msgstats[i] = 0; ! 186: #else MTR ! 187: mp -> msgstats = (short *) ! 188: calloc ((unsigned) 1, MSIZEX (mp, mp -> lowmsg, mp -> hghmsg)); ! 189: if (mp -> msgstats == NULL) ! 190: adios (NULLCP, "unable to allocate messages storage"); ! 191: mp -> msgstats = (mp -> msgbase = mp -> msgstats) - mp -> lowoff; ! 192: if (mp -> msgstats < 0) ! 193: adios (NULLCP, "m_gmsg() botch -- you lose big"); ! 194: #endif MTR ! 195: for (tail = head; tail < rover; tail++) ! 196: mp -> msgstats[tail -> msgno] = tail -> stats; ! 197: m_getatr (mp); ! 198: ! 199: return mp; ! 200: } ! 201: ! 202: /* */ ! 203: ! 204: static m_getatr (mp) ! 205: register struct msgs *mp; ! 206: { ! 207: int alen, ! 208: bits, ! 209: i, ! 210: j, ! 211: plen, ! 212: state; ! 213: register char *cp; ! 214: char name[NAMESZ], ! 215: field[BUFSIZ]; ! 216: register struct node *np; ! 217: register FILE * fp; ! 218: ! 219: bits = FFATTRSLOT; ! 220: ! 221: mp -> msgattrs[i = 0] = getcpy (current); ! 222: mp -> msgattrs[++i] = NULL; ! 223: mp -> attrstats = 0; /* initially, all public */ ! 224: ! 225: m_getdefs (); ! 226: if (mh_seq == NULL || *mh_seq == NULL) ! 227: goto private_only; ! 228: ! 229: (void) sprintf (field, "%s/%s", mp -> foldpath, mh_seq); ! 230: if (fp = fopen (field, "r")) { ! 231: for (state = FLD;;) { ! 232: switch (state = m_getfld (state, name, field, sizeof field, fp)) { ! 233: case FLD: ! 234: case FLDEOF: ! 235: (void) m_setatr (mp, getcpy (name), trimcpy (field)); ! 236: if (state == FLDEOF) ! 237: break; ! 238: continue; ! 239: ! 240: case BODY: ! 241: case BODYEOF: ! 242: adios (NULLCP, ! 243: "no blank lines are permitted in %s/%s", ! 244: mp -> foldpath, mh_seq);/* fall */ ! 245: ! 246: case FILEEOF: ! 247: break; ! 248: ! 249: default: ! 250: adios (NULLCP, "%s/%s is poorly formatted", ! 251: mp -> foldpath, mh_seq); ! 252: } ! 253: break; ! 254: } ! 255: (void) fclose (fp); ! 256: } ! 257: ! 258: private_only: ; ! 259: alen = strlen ("atr-"); ! 260: plen = strlen (mp -> foldpath) + 1; ! 261: ! 262: for (np = m_defs; np; np = np -> n_next) ! 263: if (ssequal ("atr-", np -> n_name) ! 264: && (j = strlen (np -> n_name) - plen) > alen ! 265: && *(np -> n_name + j) == '-' ! 266: && strcmp (mp -> foldpath, np -> n_name + j + 1) == 0) { ! 267: cp = getcpy (np -> n_name + alen); ! 268: *(cp + j - alen) = NULL; ! 269: if ((i = m_setatr (mp, cp, getcpy (np -> n_field))) != NOTOK) ! 270: mp -> attrstats |= 1 << (bits + i);/* private */ ! 271: } ! 272: } ! 273: ! 274: /* */ ! 275: ! 276: static int m_setatr (mp, name, field) ! 277: register struct msgs *mp; ! 278: register char *name, ! 279: *field; ! 280: { ! 281: int bits, ! 282: hack; ! 283: register int i, ! 284: j, ! 285: k; ! 286: register char *cp, ! 287: **ap; ! 288: ! 289: bits = FFATTRSLOT; ! 290: hack = strcmp (current, name) == 0;/* hack... */ ! 291: ! 292: for (i = 0; mp -> msgattrs[i]; i++) ! 293: if (strcmp (mp -> msgattrs[i], name) == 0) { ! 294: for (j = mp -> lowmsg; j <= mp -> hghmsg; j++) ! 295: mp -> msgstats[j] &= ~(1 << (bits + i)); ! 296: break; ! 297: } ! 298: if (i >= NATTRS) { ! 299: free (name); ! 300: free (field); ! 301: return NOTOK; ! 302: } ! 303: ! 304: if (mp -> msgattrs[i] == NULL) { ! 305: mp -> msgattrs[i] = name; ! 306: mp -> msgattrs[i + 1] = NULL; ! 307: } ! 308: else ! 309: free (name); ! 310: ! 311: for (ap = brkstring (field, " ", "\n"); ! 312: *ap; ! 313: ap++) { ! 314: if (cp = index (*ap, '-')) ! 315: *cp++ = NULL; ! 316: if ((j = m_atoi (*ap)) > 0) { ! 317: #ifdef notdef ! 318: if (hack && j >= mp -> lowmsg && j <= mp -> hghmsg ! 319: && (mp -> msgstats[j] & EXISTS)) ! 320: mp -> curmsg = j; ! 321: #else not notdef ! 322: if (hack) ! 323: mp -> curmsg = j; ! 324: #endif not notdef ! 325: for (k = cp ? m_atoi (cp) : j; j <= k; j++) ! 326: if (j >= mp -> lowmsg && j <= mp -> hghmsg ! 327: && (mp -> msgstats[j] & EXISTS)) ! 328: mp -> msgstats[j] |= 1 << (bits + i); ! 329: } ! 330: } ! 331: free (field); ! 332: ! 333: return i; ! 334: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.