Annotation of researchv10dc/cmd/uucp/anlwrk.c, revision 1.1.1.1

1.1       root        1: /*     /sccs/src/cmd/uucp/s.anlwrk.c
                      2:        anlwrk.c        1.3     8/30/84 17:36:58
                      3: 
                      4:        This module contains routines that find C. files
                      5:        in a system spool directory, return the next C. file
                      6:        to process, and break up the C. line into arguments
                      7:        for processing.
                      8: */
                      9: #include "uucp.h"
                     10: VERSION(@(#)anlwrk.c   1.3);
                     11: 
                     12: #define BOOKMARK_PRE   'A'
                     13: #define CLEAN_RETURN(fp) {\
                     14:        if (fp != NULL) \
                     15:                (void) fclose(fp); \
                     16:        fp = NULL; \
                     17:        return(0); \
                     18: }
                     19: 
                     20: /* C.princetN0026 - ('C' + '.') - "princet" */
                     21: #define SUFSIZE        (MAXBASENAME - 2 - SYSNSIZE)
                     22: #define LLEN 50
                     23: #define MAXRQST 250
                     24: 
                     25: static void insert();
                     26: static int  bldflst();
                     27: 
                     28: static char  Filent[LLEN][NAMESIZE]; /* array of C. file names (text)        */
                     29: static char *Fptr[LLEN];            /* pointers to names in Filent          */
                     30: static short Nnext;                 /* index of next C. file in Fptr list   */
                     31: static short Nfiles = 0;            /* Number of files in Filent            */
                     32: 
                     33: /*
                     34:  * read a line from the workfile (C.file)
                     35:  *     file    -> work file  (Input/Output)  made '\0' after work completion
                     36:  *     wvec    -> address of array to return arguments (Output)
                     37:  *     wcount  -> maximum # of arguments to return in wvec
                     38:  *             NOTE: wvec should be large enough to accept wcount + 1 pointers
                     39:  *             since NULL is inserted after last item.
                     40:  * returns:
                     41:  *     0          ->  no more work in this file
                     42:  *     positive # -> number of arguments
                     43:  */
                     44: anlwrk(file, wvec, wcount)
                     45: char *file, **wvec;
                     46: {
                     47:        register i;
                     48:        register FILE *p_bookmark;    /* pointer to afile                   */
                     49:        static   FILE *fp = NULL;    /* currently opened C. file pointer    */
                     50:        static char afile[NAMESIZE+1]; /* file with line count for book marks */
                     51:        static char str[MAXRQST];    /* the string which  wvec points to    */
                     52:        static short acount;
                     53:        struct stat stbuf;
                     54:        int     nargs;          /* return value == # args in the line */
                     55: 
                     56:        if (file[0] == '\0') {
                     57:                if (fp != NULL)
                     58:                        errent("anlwrk",
                     59:                           "attempt made to use old workfile was thwarted", 0,
                     60:                           sccsid, __FILE__, __LINE__);
                     61:                CLEAN_RETURN(fp);
                     62:        }
                     63:        if (fp == NULL) {
                     64:                fp = fopen(file, "r");
                     65: 
                     66:                if (fp == NULL){ /* can't open C. file! */
                     67:                        errent(Ct_OPEN,file,errno, sccsid, __FILE__, __LINE__);
                     68:                        /* this may not work, but we'll try it */
                     69:                        /* It will fail if the C. name is more than */
                     70:                        /* the standard 14 characters - if this is the */
                     71:                        /* tocorrupt will exit with ASSERT */
                     72:                        toCorrupt(file);
                     73:                        return(0);
                     74:                }
                     75:                (void) fstat(fileno(fp), &stbuf);
                     76:                Nstat.t_qtime = stbuf.st_mtime;
                     77: 
                     78:                (void) strncpy(afile, BASENAME(file, '/'), NAMESIZE);
                     79:                afile[NAMESIZE] = NULLCHAR;
                     80:                *afile = BOOKMARK_PRE; /* make up name by replacing C with A */
                     81:                acount = 0;
                     82:                p_bookmark = fopen(afile, "r");
                     83:                if (p_bookmark != NULL) {
                     84:                        /* get count of already completed work */
                     85:                        i = fscanf(p_bookmark, "%hd", &acount);
                     86:                        (void) fclose(p_bookmark);
                     87:                        if (i <= 0)
                     88:                                acount = 0;
                     89: 
                     90:                        /* skip lines which have already been processed */
                     91:                        for (i = 0; i < acount; i++) {
                     92:                                if (fgets(str, MAXRQST, fp) == NULL)
                     93:                                        break;
                     94:                        }
                     95:                }
                     96: 
                     97:        }
                     98: 
                     99:        if (fgets(str, MAXRQST, fp) == NULL) {
                    100:                ASSERT(unlink(file) == 0, Ct_UNLINK, file, errno);
                    101:                (void) unlink(afile);
                    102:                DEBUG(4,"Finished Processing file: %s\n",file);
                    103:                *file = '\0';
                    104:                CLEAN_RETURN(fp);
                    105:        }
                    106: 
                    107:        nargs = getargs(str, wvec, wcount);
                    108: 
                    109:        /* sanity checks for C. file */
                    110:        if ((str[0] != 'R' && str[0] != 'S')    /* legal wrktypes are R and S */
                    111:         || (str[0] == 'R' && nargs < 6)        /* R lines need >= 6 entries */
                    112:         || (str[0] == 'S' && nargs < 7)) {     /* S lines need >= 7 entries */
                    113:                /* bad C. file - stash it */
                    114:                toCorrupt(file);
                    115:                (void) unlink(afile);
                    116:                *file = '\0';
                    117:                CLEAN_RETURN(fp);
                    118:        }
                    119: 
                    120:        p_bookmark = fopen(afile, "w"); /* update bookmark file */
                    121:        if (p_bookmark == NULL)
                    122:            errent(Ct_OPEN, afile, errno, sccsid, __FILE__, __LINE__);
                    123:        else {
                    124:            chmod(afile, CFILEMODE);
                    125:            (void) fprintf(p_bookmark, "%d", acount);
                    126:            (void) fclose(p_bookmark);
                    127:        }
                    128:        acount++;
                    129:        return(nargs);
                    130: }
                    131: 
                    132: /*
                    133:  * Check the list of work files (C.sys).
                    134:  * If it is empty or the present work is exhausted, it
                    135:  * will call gtwrk to generate a new list.
                    136:  *
                    137:  *     file    -> address of array to return full pathname in
                    138:  * returns:
                    139:  *     0       -> no more work (or some error)
                    140:  *     1       -> there is work
                    141:  */
                    142: iswrk(file)
                    143: char *file;
                    144: {
                    145:        if (Nfiles == 0  && (bldflst() == 0) )
                    146:                return(0);
                    147: 
                    148:        (void) sprintf(file, "%s/%s", RemSpool, Fptr[Nnext]);
                    149:        Nfiles--;
                    150:        Nnext++;
                    151:        return(1);
                    152: }
                    153: 
                    154: 
                    155: /*
                    156:  * build list of work files for given system using an insertion sort
                    157:  * Nfiles, Nnext, RemSpool and Rmtname are global
                    158:  *
                    159:  * return:
                    160:  *     number of C. files in list - (Nfiles)
                    161:  */
                    162: static
                    163: bldflst()
                    164: {
                    165:        register DIR *pdir;
                    166:        char filename[NAMESIZE];
                    167:        char prefix[SYSNSIZE+3];
                    168: 
                    169:        Nnext = Nfiles = 0;
                    170:        if ((pdir = opendir(RemSpool)) == NULL)
                    171:                return(0);
                    172: 
                    173:        (void) sprintf(prefix, "C.%.*s", SYSNSIZE, Rmtname);
                    174:        while (gnamef(pdir, filename) ) {
                    175:                if (!PREFIX(prefix, filename))
                    176:                        continue;
                    177:                if ((strlen(filename)-strlen(prefix)) != SUFSIZE) {
                    178:                        errent("bldflst: Funny filename", filename, 0,
                    179:                           sccsid, __FILE__, __LINE__);
                    180:                        continue;
                    181:                }
                    182:                insert(filename);
                    183:        }
                    184:        closedir(pdir);
                    185:        return(Nfiles);
                    186: }
                    187: 
                    188: /*
                    189:  * get work return
                    190:  *     file    -> place to deposit file name
                    191:  *     wrkvec  -> array to return arguments
                    192:  *     wcount  -> max number of args for wrkvec
                    193:  * returns:
                    194:  *     nargs   ->  number of arguments
                    195:  *     0       ->  no arguments - fail
                    196:  */
                    197: gtwvec(file, wrkvec, wcount)
                    198: char *file, *wrkvec;
                    199: {
                    200:        register int nargs;
                    201: 
                    202:        DEBUG(7, "gtwvec: dir %s\n", RemSpool);
                    203:        while ((nargs = anlwrk(file, wrkvec, wcount)) == 0) {
                    204:                if (!iswrk(file))
                    205:                        return(0);
                    206:        }
                    207:        DEBUG(7, "        return - %d\n", nargs);
                    208:        return(nargs);
                    209: }
                    210: 
                    211: 
                    212: /*
                    213:  * insert - insert file name in sorted list
                    214:  * return - none
                    215:  */
                    216: static
                    217: void
                    218: insert(file)
                    219: char *file;
                    220: {
                    221:        register i, j;
                    222:        register char *p;
                    223: 
                    224:        DEBUG(7, "insert(%s)  ", file);
                    225:        for (i = Nfiles; i>0; i--) {
                    226:            if (strcmp(file, Fptr[i-1]) > 0)
                    227:                break;
                    228:        }
                    229:        if (i == LLEN) /* if this is off the end get out */
                    230:            return;
                    231: 
                    232:        /* get p (pointer) to where the text of name will go */
                    233:        if (Nfiles == LLEN)     /* last possible entry */
                    234:            /* put in text of last and decrement Nfiles for make hole */
                    235:            p = strcpy(Fptr[--Nfiles], file);
                    236:        else
                    237:            p = strcpy(Filent[Nfiles], file);   /* copy to next free  */
                    238: 
                    239:        /* make a hole for new entry */
                    240:        for (j = Nfiles; j >i; j--)
                    241:            Fptr[j] = Fptr[j-1];
                    242: 
                    243:        DEBUG(7, "insert %s ", p);
                    244:        DEBUG(7, "at %d\n", i);
                    245:        Fptr[i] = p;
                    246:        Nfiles++;
                    247: }

unix.superglobalmegacorp.com

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