Annotation of 43BSD/ingres/source/support/usersetup.c, revision 1.1.1.1

1.1       root        1: # include      <stdio.h>
                      2: # include      <ingres.h>
                      3: # include      <aux.h>
                      4: # include      <opsys.h>
                      5: # include      <sccs.h>
                      6: 
                      7: SCCSID(@(#)usersetup.c 8.2     1/18/85)
                      8: 
                      9: /*
                     10: **  Initialize Users File From Passwd File
                     11: **
                     12: **     Everyone in /etc/passwd is entered into the users file.  All
                     13: **     users can access all databases.
                     14: **
                     15: **     User codes are assigned sequentially.  This should therefore
                     16: **     probably be run once only, when INGRES is first installed.
                     17: **     Otherwise, usercodes can change mysteriously.
                     18: **
                     19: **     The optional parameter replaces the root of the INGRES subtree
                     20: **     as found in /etc/passwd.  The INGRES user must be installed
                     21: **     (with that name) when usersetup is run.  If this parameter
                     22: **     is a minus ("-"), output goes to the standard output.
                     23: **
                     24: **     The initialization file is initialized to "<home>/.ingres",
                     25: **     where <home> is the home directory in the passwd file.
                     26: */
                     27: 
                     28: main(argc, argv)
                     29: int    argc;
                     30: char   **argv;
                     31: {
                     32:        register int    i;
                     33:        char            buf[MAXLINE + 1];
                     34:        char            *pathname;
                     35:        register char   *code;
                     36:        char            *field[UF_NFIELDS];
                     37:        register int    iop;
                     38:        extern char     *Proc_name;
                     39:        char            *stat = "000001";
                     40:        extern  int     (*ExitFn)();
                     41:        extern  int     sysexit();
                     42: 
                     43:        Proc_name = "USERSETUP";
                     44:        ExitFn = sysexit;
                     45:        pathname = NULL;
                     46:        if (argc > 1)
                     47:        {
                     48:                argc--;
                     49:                stat = *++argv;
                     50:        }
                     51: 
                     52:        code = "aa";
                     53:        if ((iop = (int) fopen("/etc/passwd", "r")) == NULL)
                     54:                syserr(0, "cannot open /etc/passwd for reading");
                     55: 
                     56:        /* scan for INGRES in /etc/passwd */
                     57:        while (fgets(buf, MAXLINE, iop))
                     58:        {
                     59:                i = decode(buf, field);
                     60:                if (!sequal(USERINGRES, field[0]))
                     61:                        continue;
                     62:                pathname = field[i - 1];
                     63: 
                     64:                break;
                     65:        }
                     66: 
                     67:        /* test for INGRES entry found */
                     68:        if (!pathname)
                     69:                syserr(0, "USERINGRES not installed as UNIX user");
                     70: 
                     71:        /* get override pathname */
                     72:        if (argc > 1)
                     73:                pathname = argv[1];
                     74: 
                     75:        /* rewind passwd file */
                     76:        if (fclose(iop))
                     77:                syserr("fclose");
                     78:        if ((iop = (int) fopen("/etc/passwd", "r")) == NULL)
                     79:                syserr("open /etc/passwd 2");
                     80: 
                     81:        /* open output file as needed */
                     82:        if (pathname[0] != '-')
                     83:        {
                     84:                concat(pathname, "/files/users", buf);
                     85:                if ((i = open(buf, O_RDONLY)) >= 0)
                     86:                        syserr(0, "%s already exists", buf);
                     87:                if ((i = creat(buf, 0644)) < 0)
                     88:                        syserr("Cannot create %s", buf);
                     89:                close(i);
                     90:                if (freopen(buf, "w", stdout) == NULL)
                     91:                        syserr("cannot open %s", buf);
                     92:        }
                     93: 
                     94:        while (fgets(buf, MAXLINE, iop))
                     95:        {
                     96:                i = decode(buf, field);
                     97:                /* print username & code */
                     98:                printf("%s:%s:%s:%s:%s:::%s/.ingres::\n",
                     99:                        field[0],       /* user name */
                    100:                        code,
                    101:                        field[2],       /* user id */
                    102:                        field[3],       /* user group */
                    103:                        sequal(field[0], USERINGRES) ? "177777" : stat,
                    104:                        field[i - 1]);  /* working directory */
                    105:                next(code);
                    106:        }
                    107:        fflush(stdout);
                    108: }
                    109: /*
                    110: **  DECODE
                    111: */
                    112: 
                    113: decode(buf, field)
                    114: char   *buf;
                    115: char   *field[];
                    116: {
                    117:        register char   *cp, c;
                    118:        register int    i;
                    119: 
                    120:        field[0] = buf;
                    121:        for (i = 0, cp = buf; (c = *cp) != '\n' && c != '\0'; cp++)
                    122:        {
                    123:                if (c == ':')
                    124:                {
                    125:                        *cp = '\0';
                    126:                        i++;
                    127:                        field[i] = cp + 1;
                    128:                }
                    129:        }
                    130: 
                    131:        return (i);
                    132: }
                    133: /*
                    134: **  NEXT -- return successor to code.
                    135: */
                    136: 
                    137: next(code)
                    138: char   code[2];
                    139: {
                    140:        register char   *c;
                    141:        register char   a, b;
                    142: 
                    143:        c = code;
                    144:        a = c[0];
                    145:        b = c[1];
                    146: 
                    147:        if (++b > 'z')
                    148:        {
                    149:                b = '0';
                    150:        }
                    151:        else if (b == '9' + 1)
                    152:        {
                    153:                b = 'a';
                    154:                if (a == 'Z')
                    155:                {
                    156:                        write(2, "Too many users\n", 15);
                    157:                        exit(-1);
                    158:                }
                    159:                if (++a > 'z')
                    160:                {
                    161:                        a = 'A';
                    162:                }
                    163:        }
                    164: 
                    165:        c[0] = a;
                    166:        c[1] = b;
                    167: }
                    168: 
                    169: /*
                    170: ** sysexit
                    171: **     A simple function that just exits, this is for the benefit
                    172: **     of syserr, so it does not core dump.
                    173: */
                    174: sysexit(value)
                    175: int    value;
                    176: {
                    177:        exit(value);
                    178: }

unix.superglobalmegacorp.com

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