|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.