1: #include "parms.h"
2: #include "structs.h"
3: #include <pwd.h>
4: #ifdef RCSIDENT
5: static char rcsid[] = "$Header: startup.c,v 1.7.0.4 96/3/21 20:56:44 notes Rel $";
6: #endif RCSIDENT
7:
8: static char *Bigversion = "Notesfiles: $Revision: 1.7.0.4 $";
9:
10: /*
11: * this file contains code and declarations that are common to
12: * all main lines. This routine should be called by all
13: * mainline routines immediately.
14: *
15: * We also take care of the problem of some systems not honoring
16: * the setuid bit when root runs a program.
17: *
18: * Ray Essick May 7, 1982
19: */
20:
21: static char SysName[32]; /* holds system name */
22: static char authsys[32]; /* author's system */
23:
24: #if defined(UNAME)
25: #include <sys/utsname.h> /* uname syscall */
26: #endif defined(UNAME)
27:
28: char *hised = DFLTED; /* his favorite editor */
29: char *hisshell = DFLTSH; /* his favorite shell */
30: char *;
31: char *hismailer;
32: int nrows = 24; /* rows on screen */
33: int ncols = 80; /* width of screen */
34: char *histty = (char *) NULL; /* tty as on command */
35: int intflag = 0; /* DEL hit recently */
36: int globuid = ANONUID; /* his true user id */
37: int Notesuid = NOTESUID; /* default to root? */
38: int Anonuid = ANONUID;
39: int Nindex = 12; /* # on index page */
40: int ignoresigs = 0; /* critical section */
41: char *Mstdir = MSTDIR; /* store nf's here */
42: char *System = SysName; /* point to it */
43: char *Authsystem = authsys; /* init pointer */
44: char *Invokedas = "Unknown"; /* argv[0] */
45: char Seqname[WDLEN]; /* sequencer name */
46: struct when_f Basetime; /* zero time */
47:
48:
49: struct passwd *getpwnam ();
50:
51: startup (argc, argv)
52: int argc;
53: char **argv;
54: {
55:
56: struct passwd *pw;
57: struct auth_f whoami;
58: char *p;
59:
60: /*
61: * Grab "notes" uid from /etc/passwd and also grab uid of
62: * user running this process.
63: * ditto for "anon".
64: */
65:
66: if ((pw = getpwnam (NOTES)) == NULL) /* find notes uid */
67: {
68: fprintf (stderr, "Can't find uid for %s, assuming %d\n",
69: NOTES, NOTESUID);
70: #ifdef DYNADIR
71: fprintf (stderr, "Assuming Notesfiles live in %s\n",
72: Mstdir);
73: #endif DYNADIR
74: }
75: else
76: {
77: Notesuid = pw -> pw_uid & UIDMASK;
78: #ifdef DYNADIR
79: /*
80: * Select Mstdir based on the home directory for the "notes"
81: * owner. Make it one directory "above" the note's home directory.
82: * (which in many places will be /usr/spool/notes/.utilities
83: */
84: if ((p = rindex (pw -> pw_dir, '/')) != NULL) /* get end */
85: {
86: *p = '\0'; /* terminate */
87: if (strlen (pw -> pw_dir) > 0) /* non-empty */
88: Mstdir = strsave (pw -> pw_dir); /* save it */
89: }
90: #endif DYNADIR
91: }
92:
93: if ((pw = getpwnam (ANON)) == NULL) /* (prohibited) anon uid */
94: {
95: fprintf (stderr, "Can't find uid for %s, assuming %d\n",
96: ANON, ANONUID);
97: }
98: else
99: {
100: Anonuid = pw -> pw_uid & UIDMASK;
101: }
102: endpwent ();
103:
104: /*
105: * now resolve who is running the program, make sure that
106: * we are setuid'ed away from root which breaks our locks
107: * at this time (need a better locking mechanism).
108: *
109: * We really want seteuid(), but V7 and a number of others
110: * don't offer this. 4.2 Bsd does, so we use it there.
111: */
112:
113: globuid = getuid () & UIDMASK; /* set this */
114: #ifdef RUNSUID
115: if (geteuid () == 0) /* root access? */
116: {
117: #ifdef BSD42
118: seteuid (Notesuid); /* we'll fix that */
119: #else
120: setuid (Notesuid); /* we'll fix that */
121: #endif BSD42
122: }
123: #endif RUNSUID
124:
125: getname (&whoami, 0); /* get my name */
126: strcpy (Seqname, &whoami.aname); /* load seq name */
127:
128: /*
129: * and now decide where we are
130: */
131:
132: #ifdef PORTBINARY /* to have portable binaries */
133: gethostname (SysName, sizeof (SysName)); /* load it */
134: #endif defined(PORTBINARY)
135:
136: #ifdef UNAME /* like PORTBINARY */
137: {
138: struct utsname name;
139: uname (&name); /* UNIX 4.0 syscall */
140: strcpy (SysName, name.nodename);
141: }
142: #endif defined(UNAME)
143:
144: #ifdef WHOAMI
145: {
146: char buf[BUFSIZ];
147: FILE * fd;
148:
149: if ((fd = fopen (WHOAMIFILE, "r")) == NULL) /* get file */
150: {
151: fprintf (stderr, "Cannot open %s\n", WHOAMIFILE);
152: exit (1);
153: }
154: for (;;)
155: {
156: if (fgets (buf, sizeof buf, fd) == NULL)
157: {
158: fprintf (stderr, "no sysname in %s\n", WHOAMIFILE);
159: fclose (fd);
160: exit (2);
161: }
162: if (sscanf (buf, "#define sysname \"%[^\"]\"", SysName) == 1)
163: {
164: fclose (fd);
165: break;
166: }
167: }
168: }
169: #endif WHOAMI
170:
171: /*
172: * Now that we have a copy of the System name loaded into
173: * the "SysName" array, let's make a copy to use for the
174: * user as his system. The "System" will get used for things
175: * like the generation of Unique ID's.
176: */
177: strcpy (Authsystem, System); /* copy it */
178:
179: #ifdef FULLDOMAIN
180: /*
181: * append the domain information (if it isn't already there)
182: * to the Author system name.
183: */
184: if (index (Authsystem, '.') == (char *) NULL)
185: {
186: strcat (Authsystem, ".");
187: strcat (Authsystem, FULLDOMAIN);
188: }
189:
190: #ifdef IDDOMAIN
191: /*
192: * append domain information if needed
193: * to the system name as it is used in the unique id.
194: */
195: if (index (System, '.') == (char *) NULL) /* if not there */
196: {
197: strcat (SysName, "."); /* separator */
198: strcat (SysName, FULLDOMAIN); /* append it */
199: }
200: #endif IDDOMAIN
201:
202: #endif FULLDOMAIN
203:
204: /*
205: * Decide what we were invoked as
206: * and set up a few other values that don't fit anywhere.
207: */
208:
209: Invokedas = argv[0];
210: Basetime.w_year = 1970; /* unix time 0 */
211: Basetime.w_month = 1;
212: Basetime.w_day = 1;
213: Basetime.w_hours = 0;
214: Basetime.w_mins = 0;
215: Basetime.w_gmttime = 0;
216:
217: }