Annotation of 43BSD/contrib/nntp/support/mkgrdates.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char    *sccsid = "%W%  (Berkeley) %G%";
        !             3: #endif
        !             4: 
        !             5: /*
        !             6:  * Make a list of newsgroups which are "new" in the file NGDATE_FILE.
        !             7:  * "New" means having an entry in the active file, and having
        !             8:  * a message numbered "1" in the appropriate news directory.
        !             9:  * Since this involves a stat of all the newsgroups, we try
        !            10:  * to be intelligent about things -- if the active file's size
        !            11:  * since we last ran -- stored in STAT_FILE -- hasn't changed
        !            12:  * since last time, we assume things are ok, and exit without
        !            13:  * doing anything.  This could fail in extreme circumstances,
        !            14:  * but is "too painful to do right".
        !            15:  *
        !            16:  * Output in NGDATE_FILE is of the form
        !            17:  *
        !            18:  *     date newsgroup
        !            19:  *
        !            20:  * where "date" is the date the newsgroup was created, expressed as
        !            21:  * the number of seconds since 000000 Jan 1, 1970, GMT.  This file
        !            22:  * winds up sorted in cronological order.
        !            23:  *
        !            24:  *     Phil Lapsley
        !            25:  *     College of Engineering
        !            26:  *     University of California, Berkeley
        !            27:  *     (ARPA: [email protected]; UUCP: ...!ucbvax!phil)
        !            28:  */
        !            29: 
        !            30: #include <stdio.h>
        !            31: #include <sys/types.h>
        !            32: #include <sys/time.h>
        !            33: #include <sys/stat.h>
        !            34: #include "../common/conf.h"
        !            35: 
        !            36: #define MODE           0644    /* Better be readable by nntpd! */
        !            37: 
        !            38: extern int     linecmp();
        !            39: extern char    *index(), *malloc(), *strcpy(), *strcat();
        !            40: 
        !            41: main(argc, argv)
        !            42: int    argc;
        !            43: char   *argv[];
        !            44: {
        !            45:        char    *groups[MAX_GROUPS];
        !            46:        char    line[MAX_STRLEN], gr_name[MAX_STRLEN];
        !            47:        char    *cp;
        !            48:        int     i, j;
        !            49:        long    lastsize, crntsize;
        !            50:        long    birthtime;
        !            51:        struct tm *tmptr;
        !            52:        FILE    *stat_fp, *active_fp, *date_fp;
        !            53:        long    birthof();
        !            54: 
        !            55:        stat_fp = fopen(STAT_FILE, "r");
        !            56: 
        !            57:        if (stat_fp != NULL) {
        !            58:                (void) fscanf(stat_fp, "%d", &lastsize);
        !            59:                (void) fclose(stat_fp);
        !            60:        }
        !            61: 
        !            62:        active_fp = fopen(ACTIVE_FILE, "r");
        !            63:        if (active_fp == NULL) {
        !            64:                fprintf(stderr, "Can't read active file?\n");
        !            65:                perror(ACTIVE_FILE);
        !            66:                exit(1);
        !            67:        }
        !            68: 
        !            69:        /* Check length; if it's the same as last time, quit */
        !            70: 
        !            71:        (void) fseek(active_fp, (long) 0, 2);
        !            72:        crntsize = ftell(active_fp);
        !            73:        if (crntsize == lastsize) {
        !            74:                (void) fclose(active_fp);
        !            75:                exit(0);
        !            76:        }
        !            77: 
        !            78:        /* Ok, time to rebuild the date file */
        !            79: 
        !            80:        date_fp = fopen(NGDATE_FILE, "w");
        !            81: 
        !            82:        if (date_fp == NULL) {
        !            83:                perror(NGDATE_FILE);
        !            84:                (void) fclose(active_fp);
        !            85:                exit(1);
        !            86:        }
        !            87: 
        !            88:        rewind(active_fp);
        !            89: 
        !            90:        i = 0;
        !            91:        while (fgets(line, sizeof(line), active_fp) != NULL) {
        !            92:                if ((cp = index(line, ' ')) != NULL)
        !            93:                        *cp = '\0';
        !            94:                (void) strcpy(gr_name, line);
        !            95:                birthtime = birthof(line, atoi(cp + 1));
        !            96:                
        !            97:                if (birthtime == 0)     /* Skip ancient newsgroups */
        !            98:                        continue;
        !            99: 
        !           100:                (void) sprintf(line, "%ld %s", birthtime, gr_name);
        !           101:                groups[i] = malloc(strlen(line)+1);
        !           102:                if (groups[i] != NULL)
        !           103:                        (void) strcpy(groups[i++], line);
        !           104:                else {
        !           105:                        perror("malloc");
        !           106:                        exit(1);
        !           107:                }
        !           108:        }
        !           109: 
        !           110:        (void) fclose(active_fp);
        !           111: 
        !           112:        qsort((char *) groups, i, sizeof(char *), linecmp);
        !           113: 
        !           114:        for (j = 0; j < i; ++j)
        !           115:                fprintf(date_fp, "%s\n", groups[j]);
        !           116: 
        !           117:        (void) fclose(date_fp);
        !           118: 
        !           119:        (void) chmod(NGDATE_FILE, MODE);
        !           120: 
        !           121:        stat_fp = fopen(STAT_FILE, "w");
        !           122:        if (stat_fp == NULL) {
        !           123:                perror(STAT_FILE);
        !           124:                exit(1);
        !           125:        }
        !           126: 
        !           127:        fprintf(stat_fp, "%d\n", crntsize);
        !           128: 
        !           129:        (void) fclose(stat_fp);
        !           130: 
        !           131:        (void) chmod(STAT_FILE, MODE);
        !           132: 
        !           133:        exit(0);
        !           134: }
        !           135: 
        !           136: linecmp(line1, line2)
        !           137: char    **line1, **line2;
        !           138: {
        !           139:        return(0 - strcmp(*line1, *line2));
        !           140: }
        !           141: 
        !           142: 
        !           143: /* return creation time of newsgroup */
        !           144: 
        !           145: long
        !           146: birthof(group, highart)
        !           147: char   *group;
        !           148: int    highart;
        !           149: {
        !           150:        char    *cp, *index();
        !           151:        char    tst[128];
        !           152:        struct stat statbuf;
        !           153:  
        !           154:        while ((cp = index(group, '.')))
        !           155:                *cp = '/';
        !           156: 
        !           157:        (void) strcpy(tst, SPOOLDIR);
        !           158:        (void) strcat(tst, group);
        !           159:        if (highart)
        !           160:                (void) strcat(tst, "/1");
        !           161:        if (stat(tst, &statbuf) < 0)
        !           162:                return 0L;              /* not there, assume ancient */
        !           163:        else
        !           164:                return(statbuf.st_mtime);
        !           165: }

unix.superglobalmegacorp.com

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