Annotation of 43BSDTahoe/new/news/src/funcs.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * This software is Copyright (c) 1986 by Rick Adams.
        !             3:  *
        !             4:  * Permission is hereby granted to copy, reproduce, redistribute or
        !             5:  * otherwise use this software as long as: there is no monetary
        !             6:  * profit gained specifically from the use or reproduction or this
        !             7:  * software, it is not sold, rented, traded or otherwise marketed, and
        !             8:  * this copyright notice is included prominently in any copy
        !             9:  * made.
        !            10:  *
        !            11:  * The author make no claims as to the fitness or correctness of
        !            12:  * this software for any use whatsoever, and it is provided as is. 
        !            13:  * Any use of this software is at the user's own risk.
        !            14:  *
        !            15:  * funcs - functions used by many programs
        !            16:  */
        !            17: 
        !            18: #ifdef SCCSID
        !            19: static char    *SccsId = "@(#)funcs.c  2.36    10/7/87";
        !            20: #endif /* SCCSID */
        !            21: 
        !            22: /*LINTLIBRARY*/
        !            23: 
        !            24: #include "params.h"
        !            25: #include <errno.h>
        !            26: #if defined(USG) || defined(BSD4_2) || defined(BSD4_1C)
        !            27: #include <fcntl.h>
        !            28: #endif /* !v7 */
        !            29: 
        !            30: extern char *Progname;
        !            31: 
        !            32: /*
        !            33:  * News group matching.
        !            34:  *
        !            35:  * nglist is a list of newsgroups.
        !            36:  * sublist is a list of subscriptions.
        !            37:  * sublist may have "meta newsgroups" in it.
        !            38:  * All fields are NGDELIM separated,
        !            39:  * and there is an NGDELIM at the end of each argument.
        !            40:  *
        !            41:  * Currently implemented glitches:
        !            42:  * sublist uses 'all' like shell uses '*', and '.' like shell '/'.
        !            43:  * If subscription X matches Y, it also matches Y.anything.
        !            44:  */
        !            45: ngmatch(nglist, sublist)
        !            46: register char *nglist, *sublist;
        !            47: {
        !            48:        register char *n, *s;
        !            49:        register int rc;
        !            50: 
        !            51:        rc = FALSE;
        !            52:        for (n = nglist; *n != '\0' && rc == FALSE;) {
        !            53:                for (s = sublist; *s != '\0';) {
        !            54:                        if (*s != NEGCHAR)
        !            55:                                rc = rc || ptrncmp(s, n);
        !            56:                        else
        !            57:                                rc = rc && !ptrncmp(s+1, n);
        !            58:                        while (*s++ != NGDELIM && *s != '\0')
        !            59:                                ;
        !            60:                }
        !            61:                while (*n++ != NGDELIM && *n != '\0')
        !            62:                        ;
        !            63:        }
        !            64:        return rc;
        !            65: }
        !            66: 
        !            67: /*
        !            68:  * Compare two newsgroups for equality.
        !            69:  * The first one may be a "meta" newsgroup.
        !            70:  */
        !            71: ptrncmp(ng1, ng2)
        !            72: register char *ng1, *ng2;
        !            73: {
        !            74:        while (*ng1 != NGDELIM && *ng1 != '\0') {
        !            75:                if (ng1[0]=='a' && ng1[1]=='l' && ng1[2]=='l') {
        !            76:                        ng1 += 3;
        !            77:                        while (*ng2 != NGDELIM && *ng2 != '.' && *ng2 != '\0')
        !            78:                                if (ptrncmp(ng1, ng2++))
        !            79:                                        return(TRUE);
        !            80:                        return ptrncmp(ng1, ng2);
        !            81:                } else if (*ng1++ != *ng2++)
        !            82:                        return FALSE;
        !            83:        }
        !            84:        return *ng2 == '.' || *ng2 == NGDELIM || *ng2 == '\0';
        !            85: }
        !            86: 
        !            87: /*
        !            88:  * Exec the shell.
        !            89:  * This version resets uid, gid, and umask.
        !            90:  * Called with fsubr(ushell, s, NULL)
        !            91:  */
        !            92: /* ARGSUSED */
        !            93: ushell(s, dummy)
        !            94: char *s, *dummy;
        !            95: {
        !            96:        (void) umask(savmask);
        !            97:        (void) setgid(gid);
        !            98:        (void) setuid(uid);
        !            99:        xshell(s);
        !           100: }
        !           101: 
        !           102: /*
        !           103:  * Exec the shell.
        !           104:  */
        !           105: 
        !           106: #ifdef lint
        !           107: char   **environ;
        !           108: #else /* !lint */
        !           109: extern char    **environ;
        !           110: #endif /* !lint */
        !           111: 
        !           112: xshell(s)
        !           113: char *s;
        !           114: {
        !           115:        char *env[100], **envp;
        !           116:        char a[BUFLEN + 2];
        !           117:        extern char filename[];
        !           118:        /* set $A */
        !           119:        (void) sprintf(a, "A=%s", filename);
        !           120:        env[0] = a;
        !           121:        for (envp = env + 1 ; *environ != NULL && envp < env + 98 ; environ++)
        !           122:                if ((*environ)[0] != 'A' || (*environ)[1] != '=')
        !           123:                        *envp++ = *environ;
        !           124:        *envp = NULL;
        !           125: 
        !           126:        execle(SHELL, SHELL, "-c", s, (char *)0, env);
        !           127:        xerror("No shell!");
        !           128: }
        !           129: 
        !           130: /*
        !           131:  * Fork and call a subroutine with two args.
        !           132:  * Return pid without waiting.
        !           133:  */
        !           134: fsubr(f, s1, s2)
        !           135: int (*f)();
        !           136: char *s1, *s2;
        !           137: {
        !           138:        register int pid;
        !           139: 
        !           140:        /* this may NOT be a vfork */
        !           141:        while ((pid = fork()) == -1)
        !           142:                sleep((unsigned)1);
        !           143:        if (pid == 0) {
        !           144:                (*f)(s1, s2);
        !           145:                exit(0);
        !           146:        }
        !           147:        return pid;
        !           148: }
        !           149: 
        !           150: /*
        !           151:  * Wait on a child process.
        !           152:  */
        !           153: fwait(pid)
        !           154: register int pid;
        !           155: {
        !           156:        register int w;
        !           157:        int status;
        !           158:        int (*onhup)(), (*onint)();
        !           159: 
        !           160:        onint = signal(SIGINT, SIG_IGN);
        !           161:        onhup = signal(SIGHUP, SIG_IGN);
        !           162:        while ((w = wait(&status)) != pid && w != -1)
        !           163:                ;
        !           164:        if (w == -1)
        !           165:                status = -1;
        !           166:        (void) signal(SIGINT, onint);
        !           167:        (void) signal(SIGHUP, onhup);
        !           168:        return status;
        !           169: }
        !           170: 
        !           171: /*
        !           172:  * Strip trailing newlines, blanks, and tabs from 's'.
        !           173:  * Return TRUE if newline was found, else FALSE.
        !           174:  */
        !           175: nstrip(s)
        !           176: register char *s;
        !           177: {
        !           178:        register char *p;
        !           179:        register int rc;
        !           180: 
        !           181:        rc = FALSE;
        !           182:        p = s;
        !           183:        while (*p)
        !           184:                if (*p++ == '\n')
        !           185:                        rc = TRUE;
        !           186:        while (--p >= s && (*p == '\n' || *p == ' ' || *p == '\t'));
        !           187:        *++p = '\0';
        !           188:        return rc;
        !           189: }
        !           190: 
        !           191: /*
        !           192:  * Local open routine.
        !           193:  */
        !           194: FILE *
        !           195: xfopen(name, fmode)
        !           196: register char *name, *fmode;
        !           197: {
        !           198:        register FILE *fp;
        !           199:        char    *fname;
        !           200:        extern int errno;
        !           201: 
        !           202:        if ((fp = fopen(name, fmode)) == NULL) {
        !           203: #ifdef IHCC
        !           204:                /*
        !           205:                 * IHCC users only see the "filename" that was in trouble,
        !           206:                 * not the whole path.  (for security!)
        !           207:                 */
        !           208:                fname = rindex(name, '/') + 1;
        !           209: #else
        !           210:                fname = name;
        !           211: #endif
        !           212:                xerror("Cannot open %s (%s): %s", fname, fmode, errmsg(errno));
        !           213:        }
        !           214:        /* kludge for setuid not being honored for root */
        !           215:        if ((uid == 0) && (duid != 0) && ((*fmode == 'a') || (*fmode == 'w')))
        !           216:                (void) chown(name, duid, dgid);
        !           217:        return fp;
        !           218: }
        !           219: 
        !           220: char *
        !           221: errmsg(code)
        !           222: int code;
        !           223: {
        !           224:        extern int sys_nerr;
        !           225:        extern char *sys_errlist[];
        !           226:        static char ebuf[6+5+1];
        !           227: 
        !           228:        if (code > sys_nerr) {
        !           229:                (void) sprintf(ebuf, "Error %d", code);
        !           230:                return ebuf;
        !           231:        } else
        !           232:                return sys_errlist[code];
        !           233: }
        !           234: /* From UC Berkeley @(#)strcasecmp.c   1.3 (Berkeley) 8/3/87 */
        !           235: 
        !           236: /*
        !           237:  * This array is designed for mapping upper and lower case letter
        !           238:  * together for a case independent comparison.  The mappings are
        !           239:  * based upon ascii character sequences.
        !           240:  */
        !           241: char charmap[] = {
        !           242:        '\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
        !           243:        '\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
        !           244:        '\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
        !           245:        '\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
        !           246:        '\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
        !           247:        '\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
        !           248:        '\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
        !           249:        '\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
        !           250:        '\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
        !           251:        '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
        !           252:        '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
        !           253:        '\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
        !           254:        '\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
        !           255:        '\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
        !           256:        '\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
        !           257:        '\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
        !           258:        '\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
        !           259:        '\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
        !           260:        '\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
        !           261:        '\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
        !           262:        '\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
        !           263:        '\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
        !           264:        '\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
        !           265:        '\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
        !           266:        '\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
        !           267:        '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
        !           268:        '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
        !           269:        '\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
        !           270:        '\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
        !           271:        '\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
        !           272:        '\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
        !           273:        '\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
        !           274: };
        !           275: 
        !           276: strcasecmp(s1, s2)
        !           277: register char *s1, *s2;
        !           278: {
        !           279:        register char *cm = charmap;
        !           280: 
        !           281:        while (cm[*s1] == cm[*s2++])
        !           282:                if (*s1++ == '\0')
        !           283:                        return 0;
        !           284:        return cm[*s1] - cm[*--s2];
        !           285: }
        !           286: 
        !           287: strncasecmp(s1, s2, n)
        !           288: register char *s1, *s2;
        !           289: register int n;
        !           290: {
        !           291:        register char *cm = charmap;
        !           292: 
        !           293:        while (--n >= 0 && cm[*s1] == cm[*s2++])
        !           294:                if (*s1++ == '\0')
        !           295:                        return 0;
        !           296:        return n < 0 ? 0 : cm[*s1] - cm[*--s2];
        !           297: }
        !           298: 
        !           299: prefix(full, pref)
        !           300: register char *full, *pref;
        !           301: {
        !           302:        register char *cm = charmap;
        !           303: 
        !           304:        while (*pref != '\0') {
        !           305:                if (cm[*full++] != cm[*pref++])
        !           306:                        return FALSE;
        !           307:        }
        !           308:        return TRUE;
        !           309: }
        !           310: 
        !           311: char *
        !           312: dirname(ngname)
        !           313: char *ngname;
        !           314: {
        !           315:        static char rbuf[BUFLEN];
        !           316:        register char *p;
        !           317: 
        !           318:        (void) sprintf(rbuf, "%s/%s", SPOOL, ngname);
        !           319: 
        !           320:        for (p=rbuf+strlen(SPOOL); *p; p++)
        !           321:                if (*p == '.')
        !           322:                        *p = '/';
        !           323:        return rbuf;
        !           324: }
        !           325: 
        !           326: /*
        !           327:  * Return TRUE iff ngname is a valid newsgroup name
        !           328:  */
        !           329: validng(ngname)
        !           330: char *ngname;
        !           331: {
        !           332:        register FILE *fp;
        !           333:        register char *p, *q;
        !           334:        char abuf[BUFLEN];
        !           335: 
        !           336:        fp = xfopen(ACTIVE, "r");
        !           337:        while(fgets(abuf, BUFLEN, fp) != NULL) {
        !           338:                p = abuf;
        !           339:                q = ngname;
        !           340:                while (*p++ == *q++)
        !           341:                        ;
        !           342:                if (*--q == '\0' && *--p == ' ') {
        !           343:                        (void) fclose(fp);
        !           344:                        return TRUE;
        !           345:                }
        !           346:        }
        !           347:        (void) fclose(fp);
        !           348:        return FALSE;
        !           349: }
        !           350: 
        !           351: /* VARARGS1 */
        !           352: xerror(message, arg1, arg2, arg3)
        !           353: char *message;
        !           354: long arg1, arg2, arg3;
        !           355: {
        !           356:        char buffer[LBUFLEN];
        !           357: 
        !           358:        fflush(stdout);
        !           359:        (void) sprintf(buffer, message, arg1, arg2, arg3);
        !           360:        logerr(buffer);
        !           361:        xxit(1);
        !           362: }
        !           363: 
        !           364: /* VARARGS1 */
        !           365: log(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9)
        !           366: char *fmt;
        !           367: long a1, a2, a3, a4, a5, a6, a7, a8, a9;
        !           368: {
        !           369:        _dolog(0, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9);
        !           370: }
        !           371: 
        !           372: /* VARARGS1 */
        !           373: logerr(fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9)
        !           374: char *fmt;
        !           375: long a1, a2, a3, a4, a5, a6, a7, a8, a9;
        !           376: {
        !           377:        _dolog(1, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9);
        !           378: }
        !           379: 
        !           380: char *lfsuffix[] = {
        !           381:        "log",
        !           382:        "errlog",
        !           383:        NULL,
        !           384: };
        !           385: 
        !           386: /*
        !           387:  * Log the given message, with printf strings and parameters allowed,
        !           388:  * on the log file, if it can be written.  The date and an attempt at
        !           389:  * figuring out the remote system name are also logged.
        !           390:  */
        !           391: /* VARARGS1 */
        !           392: _dolog(which, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9)
        !           393: char *fmt;
        !           394: long a1, a2, a3, a4, a5, a6, a7, a8, a9;
        !           395: {
        !           396:        FILE *logfile;
        !           397:        register char *p, *logtime;
        !           398:        int i;
        !           399:        char logfname[BUFLEN];          /* the log file */
        !           400:        char rmtsys[BUFLEN];
        !           401:        char msg[LBUFLEN];
        !           402:        time_t t;
        !           403: 
        !           404:        (void) strcpy(rmtsys, header.path);
        !           405:        p = index(rmtsys, '!');
        !           406:        if (p == NULL)
        !           407:                p = index(rmtsys, ':');
        !           408:        if (p)
        !           409:                *p = 0;
        !           410:        else {
        !           411:                p = rindex(rmtsys, '@');
        !           412:                if (p)
        !           413:                        (void) strcpy(rmtsys, p+1);
        !           414:                else
        !           415:                        (void) strcpy(rmtsys, "local");
        !           416:        }
        !           417: 
        !           418:        (void) time(&t);
        !           419:        logtime = ctime(&t);
        !           420:        logtime[16] = 0;
        !           421:        logtime += 4;
        !           422: 
        !           423: 
        !           424:        (void) sprintf(msg, fmt, a1, a2, a3, a4, a5, a6, a7, a8, a9);
        !           425: 
        !           426:        if (which)
        !           427:                fprintf(stderr,"%s: %s\n", Progname, msg);
        !           428: 
        !           429:        for (i=0; i<=which;i++) {
        !           430:                (void) sprintf(logfname, "%s/%s", LIB, lfsuffix[i]);
        !           431: 
        !           432:                if (access(logfname, 0) == 0 && (logfile = fopen(logfname, "a")) != NULL) {
        !           433: #if defined(USG) || defined(BSD4_2) || defined(BSD4_1C)
        !           434:                        int flags;
        !           435:                        flags = fcntl(fileno(logfile), F_GETFL, 0);
        !           436:                        (void) fcntl(fileno(logfile), F_SETFL, flags|O_APPEND);
        !           437: #else /* v7 */
        !           438:                        (void) lseek(fileno(logfile), 0L, 2);
        !           439: #endif /* v7 */
        !           440:                        if (i)
        !           441:                                fprintf(logfile, "%s\t%s\t%s: %s\n", logtime,
        !           442:                                        header.ident[0] ? header.ident : username, Progname, msg);
        !           443:                        else
        !           444:                                fprintf(logfile, "%s\t%s\t%s\n", logtime,
        !           445:                                        rmtsys, msg);
        !           446:                        (void) fclose(logfile);
        !           447:                }
        !           448:        }
        !           449: }
        !           450: #ifdef VMS
        !           451: 
        !           452: /*
        !           453:  * vmslink allows simulation of file linking under VMS.
        !           454:  */
        !           455: vmslink(infile,outfile)
        !           456: char *infile, *outfile;
        !           457: {
        !           458:        FILE *fp;
        !           459: 
        !           460:        if (access(outfile,0) == 0) {
        !           461:                errno = EEXIST;
        !           462:                return -1;
        !           463:        }
        !           464: 
        !           465:        fp = fopen(outfile, "w");
        !           466:        if (fp == NULL) {
        !           467:                errno = EACCES;
        !           468:                return -1;
        !           469:        }
        !           470: 
        !           471:        (void) fprintf(fp, "%s", infile);
        !           472:        (void) fclose(fp);
        !           473: 
        !           474:        return 0;
        !           475: }
        !           476: 
        !           477: /*
        !           478:  * vmsdelete deletes all revisions of a file.  It attempts to
        !           479:  * appear as unlink(2) under conventional Unix in other respects.
        !           480:  */
        !           481: vmsdelete(file)
        !           482: char *file;
        !           483: {
        !           484:        int i;
        !           485: 
        !           486:        i = unlink(file);
        !           487:        if (i != 0)
        !           488:                return i;
        !           489: 
        !           490:        i = errno;
        !           491:        while (unlink(file) == 0)
        !           492:                ;
        !           493:        errno = i;
        !           494: 
        !           495:        return 0;
        !           496: }
        !           497: 
        !           498: /*
        !           499:  * Convert a Unix file to a VMS fixed record format file by
        !           500:  * executing the 'unixtovms' command.
        !           501:  */
        !           502: unixtovms(file)
        !           503: char *file;
        !           504: {
        !           505:        char buf[BUFLEN];
        !           506:        sprintf(buf, "exec /etc/unixtovms %s", file);
        !           507:        return system(buf);
        !           508: }
        !           509: 
        !           510: /*
        !           511:  * Convert a VMS fixed record format file to a Unix file by
        !           512:  * executing the 'vmstounix' command.
        !           513:  */
        !           514: vmstounix(file)
        !           515: char *file;
        !           516: {
        !           517:        char buf[BUFLEN];
        !           518:        sprintf(buf,"exec /etc/vmstounix %s", file);
        !           519:        return system(buf);
        !           520: }
        !           521: #endif /* VMS */
        !           522: 
        !           523: #if !defined(BSD4_2) && !defined(BSD4_1C)
        !           524: /*
        !           525:  * make a directory. Also make sure that the directory is owned
        !           526:  * by the right userid
        !           527:  */
        !           528: mkdir(path, perm)
        !           529: char *path;
        !           530: int perm;
        !           531: {
        !           532:        int pid, status;
        !           533: #ifdef USG
        !           534:        char parent[200];
        !           535:        char *p;
        !           536:        struct stat sbuf;
        !           537: 
        !           538:        /*
        !           539:         * Make parent directory writable, because we will
        !           540:         * be creating a directory owned by the real user,
        !           541:         * rather than by news.
        !           542:         */
        !           543:        (void) strcpy(parent, path);
        !           544:        if (p = rindex(parent, '/')) {
        !           545:                *p = '\0';
        !           546:                if (stat(parent, &sbuf) == 0)
        !           547:                        (void) chmod(parent, 0777);
        !           548:                else
        !           549:                        return -1;
        !           550:        } else
        !           551:                return -1;
        !           552: #endif
        !           553: 
        !           554:        if (pid=vfork()) {
        !           555:                status = fwait(pid);
        !           556: #if defined(USG) && !defined(CHEAP)
        !           557:                if (pid=vfork())
        !           558:                        (void) fwait(pid);
        !           559:                else {
        !           560:                        setgid(gid);
        !           561:                        setuid(uid);
        !           562:                        if (chown(path, duid, dgid) == 0)
        !           563:                                (void) chmod(path, perm&(~N_UMASK));
        !           564:                        _exit(0);
        !           565:                }
        !           566: #endif /* USG && !CHEAP */
        !           567:        } else {
        !           568:                (void) setgid(dgid);
        !           569:                if (setuid(duid) < 0)
        !           570:                        (void) umask(0);
        !           571:                else
        !           572:                        (void) umask(perm&N_UMASK);
        !           573:                (void) execlp("mkdir", "mkdir", path, (char *)NULL);
        !           574:                perror(path);
        !           575:                _exit(1);
        !           576:        }
        !           577: #ifdef USG
        !           578:        (void) chmod(parent, sbuf.st_mode); /* Restore mode of parent */
        !           579: #endif
        !           580:        return status;
        !           581: }
        !           582: #endif /* !BSD4_2 && ! BSD4_1C */
        !           583: #ifndef USG
        !           584: char *
        !           585: strpbrk(str, chars)
        !           586: register char *str, *chars;
        !           587: {
        !           588:        register char *cp;
        !           589: 
        !           590:        do {
        !           591:                cp = chars - 1;
        !           592:                while (*++cp) {
        !           593:                        if (*str == *cp)
        !           594:                                return str;
        !           595:                }
        !           596:        } while (*str++);
        !           597:        return NULL;
        !           598: }
        !           599: #endif /* !USG */
        !           600: 
        !           601: #ifdef FASCIST
        !           602: /*
        !           603:  *  This routine checks to see if the posting user is allowed to
        !           604:  *  post to the given newsgroup.  If the username is not in the file
        !           605:  *  $LIBDIR/authorized then the default in the symbol FASCIST is used.
        !           606:  *
        !           607:  *  Format of the call:
        !           608:  *     fascist(user, newgroups)
        !           609:  *
        !           610:  *  Returns:
        !           611:  *     FALSE, if authorized
        !           612:  *     TRUE, if not
        !           613:  *
        !           614:  *  Format of the file "authorized" is:
        !           615:  *    user:allowed groups  
        !           616:  *
        !           617:  *  Example:
        !           618:  *    root:net.all,mod.all
        !           619:  *    naughty_person:junk,net.politics
        !           620:  *    operator:!net.all,general,test,mod.unix
        !           621:  *
        !           622:  *  An open environment could have FASCIST set to "all"
        !           623:  *  and then individual entries could be made in the authorized file
        !           624:  *  to prevent certain individuals from posting to such a wide
        !           625:  *  area.
        !           626:  *
        !           627:  *  Note that a distribution of "all" does NOT mean to allow postings
        !           628:  *  only to local groups -- "all" includes "all.all".  
        !           629:  *  Use "all,!all.all" to get this behavior
        !           630:  *
        !           631:  *     Eugene Spafford         spaf@gatech     May 22, 1985
        !           632:  */
        !           633: 
        !           634: fascist(user, newsgroups)
        !           635: register char *user, *newsgroups;
        !           636: {
        !           637:        FILE *facfd;
        !           638:        char facuser[BUFLEN], facgroups[BUFLEN], factemp[BUFLEN];
        !           639:        register char  *facptr;
        !           640: 
        !           641:        /* First, open the necessary file...$LIBDIR/authorized and see if there
        !           642:         * is an entry for this user 
        !           643:         */
        !           644: 
        !           645:        (void) strncpy(facgroups, FASCIST, BUFLEN);
        !           646:        sprintf(factemp, "%s/%s", LIB, "authorized");
        !           647:        facfd = fopen(factemp, "r");
        !           648: 
        !           649:        if (facfd != NULL) { /* If no such file, we go with the global default */
        !           650:                while (fscanf(facfd, "%[^:]:%s\n", facuser, factemp) != EOF)
        !           651:                {
        !           652:                        if (feof(facfd))
        !           653:                                break;
        !           654:                        if (strncmp(facuser, user, BUFLEN) == 0) {
        !           655:                                (void) strcat(facgroups, ",");
        !           656:                                (void) strcat(facgroups, factemp);
        !           657:                                break;
        !           658:                        }
        !           659:                }
        !           660:                fclose (facfd);
        !           661:        }
        !           662: #ifdef DEBUG
        !           663:        fprintf(stderr, "facgroups = %s\n", facgroups);
        !           664:        fprintf(stderr, "newsgroups = %s\n", newsgroups);
        !           665: #endif /* DEBUG */
        !           666: 
        !           667:        /* We step through the newsgroups being posted to and check each against
        !           668:         * the restriction list.  *ALL* posted groups must match the restriction
        !           669:         * list or we don't allow the posting.
        !           670:         */
        !           671: 
        !           672:        while (*newsgroups != '\0') {
        !           673:                facptr = factemp;
        !           674:                while (*newsgroups != '\0' && *newsgroups != NGDELIM)
        !           675:                        *facptr++ = *newsgroups++;
        !           676:                *facptr = '\0';
        !           677:                if (*newsgroups == NGDELIM)
        !           678:                        newsgroups++;
        !           679: 
        !           680: #ifdef DEBUG
        !           681:                fprintf(stderr, "Checking newsgroup '%s'\n", factemp);
        !           682: #endif
        !           683: 
        !           684:                if (ngmatch(factemp, facgroups) == FALSE)
        !           685:                        return TRUE;
        !           686:        }
        !           687: 
        !           688:        /* must be okay -- return */
        !           689: #ifdef DEBUG
        !           690:        fprintf (stderr, "Newsgroups approved for this poster.\n");
        !           691: #endif /* DEBUG */
        !           692:        return FALSE;
        !           693: }
        !           694: #endif /* FASCIST */

unix.superglobalmegacorp.com

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