- FILE *pout, *uout, *bout;
- char poutf[64], uoutf[64], poutft[64], uoutft[64], boutf[64], boutft[64];
- struct stat psb, usb, bsb;
- time_t ftime;
- struct user *u;
- char *mach;
- EXEC SQL BEGIN DECLARE SECTION;
- char login[9], shell[33], fullname[33], oa[17], op[13], hp[17];
- char nn[17], ptype[9];
- int uid, flag1, flag2, id, pid, status;
- EXEC SQL END DECLARE SECTION;
-
- sprintf(poutf, "%s/passwd.db", hesiod_dir);
- sprintf(uoutf, "%s/uid.db", hesiod_dir);
- sprintf(boutf, "%s/pobox.db", hesiod_dir);
-
- if (stat(poutf, &psb) == 0 && stat(uoutf, &usb) == 0 &&
- stat(boutf, &bsb) == 0) {
- ftime = min(min(psb.st_mtime, usb.st_mtime), bsb.st_mtime);
- if (ModDiff (&flag1, "users", ftime) ||
- ModDiff (&flag2, "machine", ftime))
- exit (MR_DATE);
- if (flag1 < 0 && flag2 < 0) {
- fprintf(stderr, "Files passwd.db, uid.db, and pobox.db do not need to be rebuilt.\n");
- return(0);
- }
- }
-
- sprintf(poutft, "%s~", poutf);
- pout = fopen(poutft, "w");
- if (!pout) {
- perror("cannot open passwd.db~ for write");
- exit(MR_OCONFIG);
- }
- sprintf(uoutft, "%s~", uoutf);
- uout = fopen(uoutft, "w");
- if (!uout) {
- perror("cannot open uid.db~ for write");
- exit(MR_OCONFIG);
- }
- sprintf(boutft, "%s~", boutf);
- bout = fopen(boutft, "w");
- if (!bout) {
- perror("cannot open pobox.db for write");
- exit(MR_OCONFIG);
- }
-
- fprintf(stderr, "Building passwd.db, uid.db, and pobox.db\n");
- get_mach();
-
- users = create_hash(12001);
- EXEC SQL DECLARE u_cursor CURSOR FOR
- SELECT login, unix_uid, shell, fullname, nickname, office_addr,
- office_phone, home_phone, users_id, pop_id, potype, status
- FROM users
- WHERE status = 1 or status = 5 or status = 6
- ORDER BY users_id;
- EXEC SQL OPEN u_cursor;
- while (1) {
- EXEC SQL FETCH u_cursor INTO :login, :uid, :shell, :fullname, :nn,
- :oa, :op, :hp, :id, :pid, :ptype, :status;
- if (sqlca.sqlcode != 0) break;
- strtrim(login);
- dequote(fullname);
- dequote(nn);
- dequote(oa);
- dequote(op);
- dequote(hp);
- dequote(shell);
- u = (struct user *) malloc(sizeof(struct user));
- strcpy(u->name, login);
- u->lists = NULL;
- hash_store(users, id, u);
- if (status == 1) {
- fprintf(pout, "%s.passwd\t%s %s \"%s:*:%d:101:%s,%s,%s,%s,%s:/mit/%s:%s\"\n",
- login, HCLASS, HTYPE, login, uid, fullname, nn, oa,
- op, hp, login, shell);
- fprintf(uout, "%d.uid\t%s CNAME %s.passwd\n", uid, HCLASS,
- login);
- }
- if (pid != 0 && (mach = hash_lookup(machines, pid))) {
- fprintf(bout, "%s.pobox\t%s %s \"POP %s %s\"\n",
- login, HCLASS, HTYPE, mach, login);
- }
+ int sawdot;
+
+ for (sawdot = 1; *name; name++)
+ {
+ if (*name == '.')
+ {
+ if (sawdot)
+ return 0;
+ else
+ sawdot = 1;
+ }
+ else
+ sawdot = 0;
+ }
+ return !sawdot;
+}
+
+
+int do_passwd(void)
+{
+ FILE *pout, *uout, *bout;
+ char poutf[MAXPATHLEN], uoutf[MAXPATHLEN], poutft[MAXPATHLEN];
+ char uoutft[MAXPATHLEN], boutf[MAXPATHLEN], boutft[MAXPATHLEN];
+ struct user *u;
+ char *mach;
+ EXEC SQL BEGIN DECLARE SECTION;
+ char login[USERS_LOGIN_SIZE], shell[USERS_SHELL_SIZE];
+ char fullname[USERS_FULLNAME_SIZE], oa[USERS_OFFICE_ADDR_SIZE];
+ char op[USERS_OFFICE_PHONE_SIZE], hp[USERS_HOME_PHONE_SIZE];
+ char nn[USERS_NICKNAME_SIZE];
+ int uid, id, pid, iid, mid, status;
+ EXEC SQL END DECLARE SECTION;
+
+ sprintf(poutf, "%s/passwd.db", hesiod_dir);
+ sprintf(uoutf, "%s/uid.db", hesiod_dir);
+ sprintf(boutf, "%s/pobox.db", hesiod_dir);
+
+ sprintf(poutft, "%s~", poutf);
+ pout = fopen(poutft, "w");
+ if (!pout)
+ {
+ perror("cannot open passwd.db~ for write");
+ exit(MR_OCONFIG);
+ }
+ sprintf(uoutft, "%s~", uoutf);
+ uout = fopen(uoutft, "w");
+ if (!uout)
+ {
+ perror("cannot open uid.db~ for write");
+ exit(MR_OCONFIG);
+ }
+ sprintf(boutft, "%s~", boutf);
+ bout = fopen(boutft, "w");
+ if (!bout)
+ {
+ perror("cannot open pobox.db for write");
+ exit(MR_OCONFIG);