|
|
1.1 ! root 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.3 85/03/18 20:56:44 notes Rel $"; ! 6: #endif RCSIDENT ! 7: ! 8: static char *Bigversion = "Notesfiles: $Revision: 1.7.0.3 $"; ! 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 *hispager; ! 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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.