X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/b9d8f082520079c127d772b8fb60d4e8e418da1d..3adf4b2f0bdeeb5773607d707b7816983f93168e:/gen/passwd.dc diff --git a/gen/passwd.dc b/gen/passwd.dc index 4964a554..3c4bbad8 100644 --- a/gen/passwd.dc +++ b/gen/passwd.dc @@ -2,16 +2,22 @@ * * This generates a master /etc/passwd containing all active (status != 0) * accounts. + * + * (c) Copyright 1988, 1990 by the Massachusetts Institute of Technology. + * For copying and distribution information, please see the file + * . */ +#include #include -#include +#include #include #include #include +EXEC SQL INCLUDE sqlca; extern int errno; -char *ingres_date_and_time(); +char *whoami = "passwd.gen"; main(argc, argv) @@ -19,66 +25,87 @@ int argc; char **argv; { FILE *out = stdout; - char *outf, outft[64]; + char *outf = NULL, outft[64]; struct stat sb; -## char login[9], shell[33], fullname[33], oa[17], op[13], hp[17], *filetime; -## int uid, error, flag; + int flag; + EXEC SQL BEGIN DECLARE SECTION; + char login[9], shell[33], fullname[33], oa[17], op[13], hp[17]; + char nickname[17]; + int uid; + EXEC SQL END DECLARE SECTION; -## ingres sms +#ifsql INGRES + EXEC SQL CONNECT moira; + EXEC SQL SET LOCKMODE SESSION WHERE LEVEL=TABLE, READLOCK=SHARED; +#endsql +#ifsql INFORMIX + EXEC SQL DATABASE moira; +#endsql if (argc == 2) { if (stat(argv[1], &sb) == 0) { - filetime = ingres_date_and_time(sb.st_mtime); -## retrieve (flag = int4(interval("min", tblstats.modtime - filetime))) -## where tblstats.table = "users" + if (ModDiff (&flag, "users", sb.st_mtime)) + exit(MR_DATE); if (flag < 0) { fprintf(stderr, "File %s does not need to be rebuilt.\n", argv[1]); - exit(SMS_NO_CHANGE); + exit(MR_NO_CHANGE); } } outf = argv[1]; sprintf(outft, "%s~", outf); if ((out = fopen(outft, "w")) == NULL) { fprintf(stderr, "unable to open %s for output\n", outf); - exit(SMS_OCONFIG); + exit(MR_OCONFIG); } } else if (argc != 1) { fprintf(stderr, "usage: %s [outfile]\n", argv[0]); - exit(SMS_ARGS); + exit(MR_ARGS); } else { outf = NULL; } -## set lockmode on users where readlock = nolock + EXEC SQL WHENEVER SQLERROR GOTO sqlerr; -## range of u is users -## retrieve (login = u.#login, uid = u.#uid, shell = u.#shell, -## fullname = u.#fullname, oa = u.office_addr, -## op = u.office_phone, hp = u.home_phone) -## where u.status = 1 { - strtrim(login); - strtrim(fullname); - strtrim(oa); - strtrim(op); - strtrim(hp); - strtrim(shell); - fprintf(out, "%s:*:%d:101:%s,%s,%s,%s:/mit/%s:%s\n", - login, uid, fullname, oa, op, hp, login, shell); -## } -## inquire_equel(error = "errorno") - if (error) { - fprintf(out, "Ingres error %d\n", error); - exit(SMS_INGRES_ERR); + EXEC SQL DECLARE x CURSOR FOR SELECT + login, uid, shell, fullname, office_addr, nickname, + office_phone, home_phone + FROM users WHERE status = 1; + EXEC SQL OPEN x; + while (1) { + EXEC SQL FETCH x INTO :login, :uid, :shell, :fullname, :oa, :nickname, + :op, :hp; + if (sqlca.sqlcode != 0) break; + strtrim(login); + strtrim(fullname); + strtrim(nickname); + strtrim(oa); + strtrim(op); + strtrim(hp); + strtrim(shell); + fprintf(out, "%s:*:%d:101:%s,%s,%s,%s,%s:/mit/%s:%s\n", + login, uid, fullname, nickname, oa, op, hp, login, shell); } -## exit + EXEC SQL CLOSE x; +#ifsql INGRES + EXEC SQL DISCONNECT; +#endsql +#ifsql INFORMIX + EXEC SQL CLOSE DATABASE; +#endsql if (fclose(out)) { perror("close failed"); - exit(SMS_CCONFIG); + exit(MR_CCONFIG); } if (outf) fix_file(outf); - exit(SMS_SUCCESS); + exit(MR_SUCCESS); + + sqlerr: + com_err(whoami, MR_INGRES_ERR, " code %d\n", sqlca.sqlcode); + critical_alert("DCM", "Passwd build encountered INGRES ERROR %d", + sqlca.sqlcode); + exit(MR_INGRES_ERR); }