Annotation of 43BSDTahoe/new/nntp/server/active.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char    *sccsid = "@(#)active.c 1.11    (Berkeley) 7/17/87";
                      3: #endif
                      4: 
                      5: #include "common.h"
                      6: 
                      7: /*
                      8:  * Routines to deal with the active file
                      9:  */
                     10: 
                     11: int    act_cmp();
                     12: 
                     13: /*
                     14:  * read_groups -- read the active file into memory, sort it,
                     15:  *     and return the number of newsgroups read in.
                     16:  *     If FASTFORK is true, this can be called by interrupt,
                     17:  *     and may have to free up the old storage.  We decide
                     18:  *     this by the fact that "num_groups" will be non-zero if
                     19:  *     we're here on an interrupt.
                     20:  *
                     21:  *     Parameters:     None.
                     22:  *
                     23:  *     Returns:        Number of newsgroups read into
                     24:  *                     memory.
                     25:  *                     Zero on error.
                     26:  *
                     27:  *     Side effects:   Reads newsgroups into "group_array"
                     28:  *                     and sorts them.
                     29:  */
                     30: 
                     31: read_groups()
                     32: {
                     33:        register int    i;
                     34:        register int    act_fd;
                     35:        register char   *actbuf, *cp, *end;
                     36:        char            *malloc();
                     37:        struct stat     statbuf;
                     38: 
                     39:        /*
                     40:         * If we're here on an interrupt, free up all the
                     41:         * previous groups.
                     42:         */
                     43: 
                     44:        if (num_groups != 0) {
                     45:                (void) free(group_array[0]);    /* Assume [0] -> actbuf */
                     46:                (void) free(group_array);
                     47:        }
                     48: 
                     49:        act_fd = open(activefile, O_RDONLY);
                     50:        if (act_fd < 0) {
                     51: #ifdef SYSLOG
                     52:                syslog(LOG_ERR, "read_groups: open %s: %m", activefile);
                     53: #endif
                     54:                return (0);
                     55:        }
                     56: 
                     57:        if (fstat(act_fd, &statbuf) < 0) {
                     58: #ifdef SYSLOG
                     59:                syslog(LOG_ERR, "read_groups: fstat: %m");
                     60: #endif
                     61:                (void) close(act_fd);
                     62:                return (0);
                     63:        }
                     64: 
                     65:        actbuf = malloc(statbuf.st_size);
                     66:        if (actbuf == NULL) {
                     67: #ifdef SYSLOG
                     68:                syslog(LOG_ERR, "read_groups: malloc %d bytes: %m",
                     69:                        statbuf.st_size);
                     70: #endif
                     71:                (void) close(act_fd);
                     72:                return (0);
                     73:        }
                     74: 
                     75:        if (read(act_fd, actbuf, (int)statbuf.st_size) != statbuf.st_size) {
                     76: #ifdef SYSLOG
                     77:                syslog(LOG_ERR, "read_groups: read %d bytes: %m",
                     78:                        statbuf.st_size);
                     79: #endif
                     80:                (void) close(act_fd);
                     81:                return (0);
                     82:        }
                     83: 
                     84:        (void) close(act_fd);
                     85: 
                     86:        for (i = 0, cp = actbuf, end = actbuf + statbuf.st_size; cp < end; cp++)
                     87:                if (*cp == '\n')
                     88:                        i++;
                     89: 
                     90:        group_array = (char **) malloc(i * (sizeof (char *)));
                     91:        if (group_array == NULL) {
                     92: #ifdef SYSLOG
                     93:                syslog(LOG_ERR, "read_groups: malloc %d bytes: %m",
                     94:                        i * sizeof (char **));
                     95: #endif
                     96:                (void) close(act_fd);
                     97:                return (0);
                     98:        }
                     99: 
                    100:        cp = actbuf;
                    101:        i = 0;
                    102:        while (cp < end) {
                    103:                group_array[i++] = cp;
                    104:                cp = index(cp, '\n');
                    105:                if (cp == NULL)
                    106:                        break;
                    107:                *cp = '\0';
                    108:                cp++;
                    109:        }
                    110: 
                    111:        qsort((char *) group_array, i, sizeof (char *), act_cmp);
                    112: 
                    113:        return (i);
                    114: }
                    115: 
                    116: 
                    117: act_cmp(ptr1, ptr2)
                    118:        char     **ptr1, **ptr2;
                    119: {
                    120:        return(strcmp(*ptr1, *ptr2));
                    121: }
                    122: 
                    123: 
                    124: /*
                    125:  * find_group -- find a given newsgroup and return
                    126:  *     the low and high message numbers in the group
                    127:  *     (space provided by user).
                    128:  *
                    129:  *     Parameters:     "group" is the name of the group
                    130:  *                     we're searching for.
                    131:  *                     "num_groups" is the total number
                    132:  *                     of groups in the group array.
                    133:  *                     "low_msg" and "high_msg" are
                    134:  *                     pointers to where we're supposed
                    135:  *                     to put the low and high message numbers.
                    136:  *
                    137:  *     Returns:        0 if all goes well,
                    138:  *                     -1 if we can't find the group.
                    139:  *
                    140:  *     Side effects:   None.
                    141:  */
                    142: 
                    143: find_group(group, num_groups, low_msg, high_msg)
                    144:        char            *group;
                    145:        int             num_groups;
                    146:        int             *low_msg, *high_msg;
                    147: {
                    148:        char            kludgebuf[MAX_STRLEN];
                    149:        int             cond;
                    150:        register int    low, high, mid;
                    151:        int             length;
                    152: 
                    153:        low = 0;
                    154:        high = num_groups-1;
                    155:        (void) strcpy(kludgebuf, group);
                    156:        (void) strcat(kludgebuf, " ");
                    157:        length = strlen(kludgebuf);
                    158: 
                    159:        while (low <= high) {
                    160:                mid = (low + high) / 2;
                    161:                if ((cond = strncmp(kludgebuf, group_array[mid], length)) < 0)
                    162:                        high = mid - 1;
                    163:                else if (cond > 0)
                    164:                        low = mid + 1;
                    165:                else {
                    166:                        (void) sscanf(group_array[mid], "%s %d %d",
                    167:                                kludgebuf, high_msg, low_msg);
                    168:                        return(0);
                    169:                }
                    170:        }
                    171:        return(-1);
                    172: }

unix.superglobalmegacorp.com

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