Annotation of 43BSD/contrib/news/src/pathinit.c, revision 1.1.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:  * This function initializes all the strings used for the various
                     16:  * filenames.  They cannot be compiled into the program, since that
                     17:  * would be non-portable.  With this convention, the netnews sub-system
                     18:  * can be owned by any non-privileged user.  It is also possible
                     19:  * to work when the administration randomly moves users from one
                     20:  * filesystem to another.  The convention is that a particular user
                     21:  * (HOME, see Makefile) is searched for in /etc/passwd and all files
                     22:  * are presumed relative to there.  This method also allows one copy
                     23:  * of the object code to be used on ANY machine.  (this code runs
                     24:  * un-modified on 50+ machines at IH!!)
                     25:  *
                     26:  * The disadvantage to using this method is that all netnews programs
                     27:  * (inews, readnews, rnews, checknews) must first search /etc/passwd
                     28:  * before they can start up.  This can cause significant overhead if
                     29:  * you have a big password file.
                     30:  *
                     31:  * Some games are played with ifdefs to get four .o files out of this
                     32:  * one source file.  INEW is defined for inews, READ for readnews,
                     33:  * CHKN for checknews, and EXP for expire.
                     34:  */
                     35: 
                     36: #ifdef SCCSID
                     37: static char    *SccsId = "@(#)pathinit.c       1.17    1/17/86";
                     38: #endif /* SCCSID */
                     39: 
                     40: #if defined(INEW) || defined(EXP)
                     41: #include       "iparams.h"
                     42: #endif /* INEW || EXP */
                     43: 
                     44: #ifdef READ
                     45: #include       "rparams.h"
                     46: #endif /* READ */
                     47: 
                     48: #if defined(CHKN)
                     49: #include "params.h"
                     50: #endif /* CHKN */
                     51: 
                     52: 
                     53: char *FULLSYSNAME, *SPOOL, *LIB, *BIN, *ACTIVE, *SUBFILE, *ARTFILE,
                     54:        *username, *userhome;
                     55: 
                     56: #ifdef INEW
                     57: char *LOCKFILE, *SEQFILE, *ARTICLE, *INFILE, *TELLME;
                     58: #endif /* INEW */
                     59: 
                     60: #if defined(INEW) || defined(READ)
                     61: char *ALIASES;
                     62: #endif /* INEW || READ */
                     63: 
                     64: #ifdef EXP
                     65: char *OLDNEWS;
                     66: #endif /* EXP */
                     67: 
                     68: #ifdef READ
                     69: char *MAILPARSER;
                     70: #endif /* READ */
                     71: 
                     72: #ifdef HIDDENNET
                     73: char *LOCALSYSNAME;
                     74: #endif /* HIDDENNET */
                     75: 
                     76: 
                     77: struct passwd *getpwnam();
                     78: char *rindex();
                     79: 
                     80: #define Sprintf(where,fmt,arg) (void) sprintf(bfr,fmt,arg); where = AllocCpy(bfr)
                     81: 
                     82: char *
                     83: AllocCpy(cp)
                     84: register char *cp;
                     85: {
                     86:        register char *mp;
                     87:        char *malloc();
                     88: 
                     89:        mp = malloc((unsigned)strlen(cp) + 1);
                     90: 
                     91:        if (mp == NULL)
                     92:                xerror("malloc failed on %s",cp);
                     93: 
                     94:        (void) strcpy(mp, cp);
                     95:        return mp;
                     96: }
                     97: 
                     98: pathinit()
                     99: {
                    100: #if defined(INEW) && defined(NOTIFY)
                    101:        FILE    *nfd;           /* notify file descriptor               */
                    102:        char *p;
                    103: #endif /* INEW && NOTIFY */
                    104: #ifndef ROOTID
                    105:        struct passwd   *pw;    /* struct for pw lookup                 */
                    106: #endif /* !ROOTID */
                    107: #ifdef EXP
                    108:        char *p;
                    109: #endif /* EXP */
                    110: #ifndef CHKN
                    111:        struct utsname ubuf;
                    112: 
                    113:        uname(&ubuf);
                    114: #ifdef HIDDENNET
                    115:        FULLSYSNAME = AllocCpy(HIDDENNET);
                    116:        LOCALSYSNAME = AllocCpy(ubuf.nodename);
                    117: #else /* !HIDDENNET */
                    118:        FULLSYSNAME = AllocCpy(ubuf.nodename);
                    119: #endif /* !HIDDENNET */
                    120: #endif /* !CHKN */
                    121: 
                    122: #ifdef HOME
                    123:        /* Relative to the home directory of user HOME */
                    124:        (void) sprintf(bfr, "%s/%s", logdir(HOME), SPOOLDIR);
                    125:        SPOOL = AllocCpy(bfr);
                    126:        (void) sprintf(bfr, "%s/%s", logdir(HOME), LIBDIR);
                    127:        LIB = AllocCpy(bfr);
                    128: #else /* !HOME */
                    129:        /* Fixed paths defined in Makefile */
                    130:        SPOOL = AllocCpy(SPOOLDIR);
                    131:        LIB = AllocCpy(LIBDIR);
                    132: #endif /* !HOME */
                    133: 
                    134: #ifdef IHCC
                    135:        (void) sprintf(bfr, "%s/%s", logdir(HOME), BINDIR);
                    136:        BIN = AllocCpy(bfr);
                    137: #else /* !IHCC */
                    138:        Sprintf(BIN, "%s", BINDIR);
                    139: #endif /* !IHCC */
                    140: 
                    141:        Sprintf(ACTIVE, "%s/active", LIB);
                    142: 
                    143: #ifdef EXP
                    144:        (void) strcpy(bfr, SPOOL);
                    145:        p = rindex(bfr, '/');
                    146:        if (p) {
                    147:                strcpy(++p, "oldnews");
                    148:                OLDNEWS = AllocCpy(bfr);
                    149:        } else
                    150:                OLDNEWS = AllocCpy("oldnews");
                    151: #endif /* EXP */
                    152: 
                    153: #ifndef CHKN
                    154:        Sprintf(SUBFILE, "%s/sys", LIB);
                    155:        Sprintf(ARTFILE, "%s/history", LIB);
                    156: # endif /* !CHKN */
                    157: 
                    158: # ifdef READ
                    159: #ifdef SENDMAIL
                    160:        Sprintf(MAILPARSER, "%s -oi -oem", SENDMAIL);
                    161: #else /* !SENDMAIL */
                    162:        Sprintf(MAILPARSER, "%s/recmail", LIB);
                    163: #endif /* !SENDMAIL */
                    164: # endif /* READ */
                    165: 
                    166: # if defined(READ) || defined(INEW)
                    167:        Sprintf(ALIASES, "%s/aliases", LIB);
                    168: # endif /* READ || INEW */
                    169: # ifdef INEW
                    170:        Sprintf(LOCKFILE, "%s/LOCK", LIB);
                    171:        Sprintf(SEQFILE, "%s/seq", LIB);
                    172:        Sprintf(ARTICLE, "%s/.arXXXXXX", SPOOL);
                    173:        Sprintf(INFILE, "%s/.inXXXXXX", SPOOL);
                    174: /*
                    175:  * The person notified by the netnews sub-system.  Again, no name is
                    176:  * compiled in, but instead the information is taken from a file.
                    177:  * If the file does not exist, a "default" person will get the mail.
                    178:  * If the file exists, but is empty, nobody will get the mail.  This
                    179:  * may seem backwards, but is a better fail-safe.
                    180:  */
                    181: # ifdef NOTIFY
                    182:        (void) sprintf(bfr, "%s/notify", LIB);
                    183:        nfd = fopen(bfr, "r");
                    184:        if (nfd != NULL) {
                    185:                bfr[0] = '\0';
                    186:                (void) fgets(bfr, BUFLEN, nfd);
                    187:                if ((p = index(bfr, '\n')) != NULL)     /* strip newline */
                    188:                        *p = '\0';
                    189:                TELLME = AllocCpy(bfr);
                    190:                (void) fclose(nfd);
                    191:        } else
                    192:                TELLME = AllocCpy(NOTIFY);
                    193: # endif /* NOTIFY */
                    194: 
                    195: /*
                    196:  * Since the netnews owner's id number is different on different
                    197:  * systems, we'll extract it from the /etc/passwd file.  If no entry,
                    198:  * default to root.  This id number seems to only be used to control who
                    199:  * can input certain control messages or cancel any message.  Note that
                    200:  * entry is the name from the "notify" file as found above if possible.
                    201:  * Defining ROOTID in defs.h hardwires in a number and avoids
                    202:  * another search of /etc/passwd.
                    203:  */
                    204: # ifndef ROOTID
                    205:        if ((pw = getpwnam(TELLME)) != NULL)
                    206:                ROOTID =  pw->pw_uid;
                    207:        else if ((pw = getpwnam(HOME)) != NULL)
                    208:                ROOTID =  pw->pw_uid;
                    209:        else
                    210:                ROOTID = 0;             /* nobody left, let only root */
                    211: # endif /* !ROOTID */
                    212: #endif /* INEW */
                    213: }

unix.superglobalmegacorp.com

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