203 lines
3.8 KiB
C
203 lines
3.8 KiB
C
# include <stdio.h>
|
|
# include "../conf/gen.h"
|
|
# include "../h/dbs.h"
|
|
# include "../h/aux.h"
|
|
# include "../h/bs.h"
|
|
|
|
/*
|
|
** Initialize Users File From Passwd File
|
|
**
|
|
** Everyone in AA_PASSWD is entered into the AA_USERS. All
|
|
** users can access all databases.
|
|
**
|
|
** User codes are assigned sequentially. This should therefore
|
|
** probably be run once only, when DBS is first installed.
|
|
** Otherwise, usercodes can change mysteriously.
|
|
**
|
|
** The optional parameter replaces the root of the DBS subtree
|
|
** as found in AA_PASSWD. The DBS user must be installed
|
|
** (with that name) when usersetup is run. If this parameter
|
|
** is a minus ("-"), output goes to the standard output.
|
|
**
|
|
** The initialization file is initialized to "<home>/.ql",
|
|
** where <home> is the home directory in the AA_PASSWD.
|
|
*/
|
|
|
|
char *AApath;
|
|
char AA_USERS[] = "/sys/etc/users";
|
|
# ifdef ESER_PSU
|
|
char AA_PASSWD[] = "/SYS/PASSWD";
|
|
# else
|
|
char AA_PASSWD[] = "/etc/passwd";
|
|
# endif
|
|
|
|
main(argc, argv)
|
|
int argc;
|
|
char **argv;
|
|
{
|
|
register int i;
|
|
char buf[MAXLINE + 1];
|
|
char *pathname;
|
|
register char *code;
|
|
char *field[UF_NFIELDS];
|
|
# ifdef SETBUF
|
|
char iobuf[BUFSIZ];
|
|
# endif
|
|
register FILE *iop;
|
|
extern char *AAproc_name;
|
|
|
|
AAproc_name = "USERSETUP";
|
|
pathname = (char *) 0;
|
|
|
|
code = "aa";
|
|
if ((iop = fopen(AA_PASSWD, "r")) == (FILE *) 0)
|
|
AAsyserr(0, "/ETC/PASSWD nicht lesbar");
|
|
# ifdef SETBUF
|
|
setbuf(iop, iobuf);
|
|
# endif
|
|
|
|
/* scan for DBS in AA_PASSWD */
|
|
while (fgetline(buf, MAXLINE, iop))
|
|
{
|
|
i = decode(buf, field);
|
|
if (!AAsequal(USERDBS, field[PF_NAME]))
|
|
continue;
|
|
|
|
/* check for enough fields for valid entry */
|
|
if (i < PF_HOME)
|
|
AAsyserr(0, "Zu wenig Felder in dem Eintrag \"%s\"", buf);
|
|
|
|
pathname = field[PF_HOME];
|
|
|
|
break;
|
|
}
|
|
|
|
/* test for DBS entry found */
|
|
if (!pathname)
|
|
AAsyserr(0, "%s ist kein eingetragener BS-Nutzer", USERDBS);
|
|
|
|
/* get override pathname */
|
|
if (argc > 1)
|
|
pathname = argv[1];
|
|
AApath = pathname;
|
|
|
|
/* rewind AA_PASSWD */
|
|
if (fclose(iop))
|
|
AAsyserr(22137);
|
|
if ((iop = fopen(AA_PASSWD, "r")) == (FILE *) 0)
|
|
AAsyserr(22138);
|
|
# ifdef SETBUF
|
|
setbuf(iop, iobuf);
|
|
# endif
|
|
|
|
/* open output file as needed */
|
|
if (pathname[0] != '-')
|
|
{
|
|
AAconcat(pathname, AA_USERS, buf);
|
|
if ((i = open(buf, 0)) >= 0)
|
|
AAsyserr(0, "Das Nutzerverzeichnis '%s' existiert bereits", buf);
|
|
if ((i = creat(buf, 0644)) < 0)
|
|
AAsyserr(22140, buf);
|
|
close(i);
|
|
if (freopen(buf, "w", stdout) == (FILE *) 0)
|
|
AAsyserr(22141, buf);
|
|
}
|
|
|
|
while (fgetline(buf, MAXLINE, iop))
|
|
{
|
|
i = decode(buf, field);
|
|
/* check for enough fields for valid entry */
|
|
if (i < PF_HOME)
|
|
{
|
|
fprintf(stderr, "Zu wenig Felder in dem Eintrag \"%s\"\n", buf);
|
|
continue;
|
|
}
|
|
/* print username & code */
|
|
printf("%s:%s:%s:%s:%s:::%s/.ql::\n",
|
|
field[PF_NAME], /* user name */
|
|
code,
|
|
field[PF_UID], /* user id */
|
|
field[PF_GID], /* user group */
|
|
AAsequal(field[PF_NAME], USERDBS)? "177777": "000000",
|
|
field[PF_HOME]); /* working directory */
|
|
next(code);
|
|
}
|
|
flush();
|
|
sync();
|
|
}
|
|
|
|
|
|
decode(buf, field)
|
|
char *buf;
|
|
char *field[];
|
|
{
|
|
register char *cp;
|
|
register int c;
|
|
register int i;
|
|
|
|
field[PF_NAME] = buf;
|
|
for (i = 0, cp = buf; (c = *cp) != '\0'; cp++)
|
|
{
|
|
if (c == ':')
|
|
{
|
|
*cp = '\0';
|
|
field[++i] = cp + 1;
|
|
}
|
|
}
|
|
|
|
return (i);
|
|
}
|
|
|
|
|
|
|
|
|
|
next(code)
|
|
char code[2];
|
|
{
|
|
register char *c;
|
|
register int a;
|
|
register int b;
|
|
|
|
c = code;
|
|
a = c[0];
|
|
b = c[1];
|
|
|
|
if (++b == 'z' + 1)
|
|
b = '0';
|
|
# ifdef EBCDIC
|
|
else if (b == 'i' + 1)
|
|
b = 'j';
|
|
else if (b == 'r' + 1)
|
|
b = 's';
|
|
# endif
|
|
else if (b == '9' + 1)
|
|
{
|
|
b = 'a';
|
|
if (a++ == 'Z')
|
|
{
|
|
write(2, "Zu viele Nutzer\n", 16);
|
|
exit(-1);
|
|
}
|
|
if (a == 'z' + 1)
|
|
a = 'A';
|
|
# ifdef EBCDIC
|
|
else if (a == 'i' + 1)
|
|
a = 'j';
|
|
else if (a == 'r' + 1)
|
|
a = 's';
|
|
else if (a == 'I' + 1)
|
|
a = 'J';
|
|
else if (a == 'R' + 1)
|
|
a = 'S';
|
|
# endif
|
|
}
|
|
|
|
c[0] = a;
|
|
c[1] = b;
|
|
}
|
|
|
|
|
|
AAunlall()
|
|
{
|
|
}
|