Annotation of 43BSD/contrib/nntp/server/active.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char    *sccsid = "@(#)active.c 1.2     (Berkeley) 3/20/86";
                      3: #endif
                      4: 
                      5: #include "common.h"
                      6: 
                      7: /*
                      8:  * Routines to deal with the active file
                      9:  */
                     10: 
                     11: extern 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:        char            line[MAX_STRLEN];
                     34:        register int    i;
                     35:        register FILE   *act_fp;
                     36:        char            *malloc();
                     37: 
                     38:        i = 0;
                     39: 
                     40:        /* If we're here on an interrupt, free up all the */
                     41:        /* previous groups */
                     42: 
                     43:        if (num_groups != 0)
                     44:                for (i = 0; i < num_groups; ++i)
                     45:                        free(group_array[i]);
                     46: 
                     47:        act_fp = fopen(ACTIVE_FILE, "r");
                     48:        if (act_fp == NULL)
                     49:                return(0);
                     50: 
                     51:        while (i < MAX_GROUPS && fgets(line, sizeof(line), act_fp) != NULL) {
                     52:                if ((group_array[i] = malloc(strlen(line)+1)) == NULL) {
                     53:                        (void) fclose(act_fp);
                     54:                        return(0);
                     55:                }
                     56:                (void) strcpy(group_array[i++], line);
                     57:        }
                     58: 
                     59:        if (i == MAX_GROUPS) {
                     60:                syslog(LOG_ERR, "read_active: active file >= %d groups", i);
                     61:                syslog(LOG_ERR, "warning: recompile with MAX_GROUPS larger");
                     62:        }
                     63: 
                     64:        (void) fclose(act_fp);
                     65: 
                     66:        qsort((char *) group_array, i, sizeof(char *), act_cmp);
                     67: 
                     68:        return(i);
                     69: }
                     70: 
                     71: 
                     72: act_cmp(ptr1, ptr2)
                     73: char    **ptr1, **ptr2;
                     74: {
                     75:        return(strcmp(*ptr1, *ptr2));
                     76: }
                     77: 
                     78: /*
                     79:  * find_group -- find a given newsgroup and return
                     80:  *     the low and high message numbers in the group
                     81:  *     (space provided by user).
                     82:  *
                     83:  *     Parameters:     "group" is the name of the group
                     84:  *                     we're searching for.
                     85:  *                     "num_groups" is the total number
                     86:  *                     of groups in the group array.
                     87:  *                     "low_msg" and "high_msg" are
                     88:  *                     pointers to where we're supposed
                     89:  *                     to put the low and high message numbers.
                     90:  *
                     91:  *     Returns:        0 if all goes well,
                     92:  *                     -1 if we can't find the group.
                     93:  *
                     94:  *     Side effects:   None.
                     95:  */
                     96: 
                     97: find_group(group, num_groups, low_msg, high_msg)
                     98: char   *group;
                     99: int    num_groups;
                    100: int    *low_msg, *high_msg;
                    101: {
                    102:        char    kludgebuf[MAX_STRLEN];
                    103:        int     cond;
                    104:        int     low, high;
                    105:        int     length;
                    106:        register int mid;
                    107: 
                    108:        low = 0;
                    109:        high = num_groups-1;
                    110:        (void) strcpy(kludgebuf, group);
                    111:        (void) strcat(kludgebuf, " ");
                    112:        length = strlen(kludgebuf);
                    113: 
                    114:        while (low <= high) {
                    115:                mid = (low + high) / 2;
                    116:                if ((cond = strncmp(kludgebuf, group_array[mid], length)) < 0)
                    117:                        high = mid - 1;
                    118:                else if (cond > 0)
                    119:                        low = mid + 1;
                    120:                else {
                    121:                        (void) sscanf(group_array[mid], "%s %d %d",
                    122:                                kludgebuf, high_msg, low_msg);
                    123:                        return(0);
                    124:                }
                    125:        }
                    126:        return(-1);
                    127: }

unix.superglobalmegacorp.com

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