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: }