Annotation of 43BSD/contrib/notes/src/startup.c, revision 1.1

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

unix.superglobalmegacorp.com

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