Annotation of 43BSD/contrib/mh/sbr/m_gmsg.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

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