|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T b
Length: 5892 (0x1704) Types: TextFile Names: »build.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec8/mcp/src/build.c«
/***************************************************************************\ * * * build.c * * * * Routines to build the accounts file from the existing passwd and group * * files, i.e. the -I option to mcp. All information about who is in what * * class and what sig is destroyed by this process. If the class, sig, vig * * or range files do not exist, mcp will attempt to create them, otherwise * * these are untouched. * * * \***************************************************************************/ #include <stdio.h> #include <sys/file.h> #include <sys/types.h> #include <strings.h> #include <pwd.h> #include <grp.h> #include <lastlog.h> #include "sysdep.h" #include "macros.h" #include "mem.h" #include "lists.h" #ifdef SENDMAIL #include "alias.h" #endif #include "account.h" #include "groupmap.h" #include "sort.h" #include "save.h" #ifdef SENDMAIL #include <ctype.h> #endif extern struct list AccountList, GroupMapList, Groups, Users; extern int ModBits, root, acck(); Build() { #ifdef SENDMAIL struct alias *al; char line[BUFSIZ]; #endif struct account a, *ac, *ac2; struct passwd *pw; struct group *gr; struct groupmap gm; register int indx; char *cp; ShowVersion(); msg("Building accounting files..."); #ifdef SENDMAIL zerolist(&a.ac_aliases); #endif zerolist(&a.ac_groups); zerolist(&a.ac_classes); zerolist(&a.ac_sigs); (void) setpwent(); while (pw = getpwent()) { a.ac_uid = pw->pw_uid; a.ac_gid = pw->pw_gid; savestr((char **)&a.ac_name, pw->pw_name); savestr((char **)&a.ac_gecos, pw->pw_gecos); cp = index(pw->pw_gecos, ','); if (cp) *cp = '\0'; savestr((char **)&a.ac_realname, pw->pw_gecos); savestr((char **)&a.ac_passwd, pw->pw_passwd); savestr((char **)&a.ac_dir, pw->pw_dir); savestr((char **)&a.ac_shell, pw->pw_shell); savestr((char **)&a.ac_id, "exception"); genlistadd(&AccountList, (addr)&a, sizeof (struct account)); strlistadd(&Users, pw->pw_name); } sort_list(&AccountList, acctcmp); sort_list(&Users, pstrcmp); (void) endpwent(); (void) setgrent(); while (gr = getgrent()) { zerolist(&gm.gm_mem); gm.gm_gid = gr->gr_gid; savestr(&gm.gm_name, gr->gr_name); savestr(&gm.gm_passwd, gr->gr_passwd); for (indx=0; gr->gr_mem[indx]; indx++) { ac = getacnam(gr->gr_mem[indx]); if (ac) { strlistadd(&ac->ac_groups, gr->gr_name); sort_list(&ac->ac_groups, pstrcmp); } else continue; strlistadd(&gm.gm_mem, gr->gr_mem[indx]); } sort_list(&gm.gm_mem, pstrcmp); genlistadd(&GroupMapList, (addr)&gm, sizeof(struct groupmap)); strlistadd(&Groups, gr->gr_name); } (void) endgrent(); /* * If an accounts file already exists get the unchanged * information from it before overwriting it. */ if (!fileexists(ACFILE)) goto finish; if (acck() == 0) { err("I can't get the class and sig membership info"); err("nor the ID's or real names of current users"); err("nor the non-binding alias memberships"); err1("from the old %s because the file format is bad.", ACFILE); err(""); if (yesno("Overwrite it anyway? ") == 0) fatal("aborted"); } (void) setacent(); while (ac2 = getacent()) { ac = getacnam((char *)ac2->ac_name); if (!ac) { (void) printf("accounts line for nonexistent user \"%s\" removed\n", ac2->ac_name); continue; } FREEMEM((char *)ac->ac_realname); savestr((char **)&ac->ac_realname, (char *)ac2->ac_realname); FREEMEM((char *)ac->ac_id); savestr((char **)&ac->ac_id, (char *)ac2->ac_id); duplist(&ac->ac_classes, &ac2->ac_classes); duplist(&ac->ac_sigs, &ac2->ac_sigs); #ifdef SENDMAIL duplist(&ac->ac_aliases, &ac2->ac_aliases); #endif } finish: !fileexists(CSFILE) && createfile(CSFILE); !fileexists(RANGEFILE) && createfile(RANGEFILE); !fileexists(SIGFILE) && createfile(SIGFILE); !fileexists(VIGFILE) && createfile(VIGFILE); !fileexists(SHELLFILE) && createfile(SHELLFILE); !fileexists(ACFILE) && createfile(ACFILE); #ifdef SENDMAIL !fileexists(ALIASFILE) && createfile(ALIASFILE); #endif critical(); #ifdef SENDMAIL /* * Check to see if an alias bindings file needs to be created * to represent the current aliases file. Also if no alias bindings * file exists we must assume that all users that are currently in * aliases are not there because of bindings, hence updating * ac_aliases for each user where appropriate. */ if (!fileexists(ALBIND)) { FILE *bindf = fopen(ALBIND, "w"); FILE *alf = fopen(ALIASFILE, "r"); if (alf == NULL) { err1("can't open %s (read)", ALIASFILE); fatal("mcp: -B aborted"); } if (bindf == NULL) { (void) fclose(alf); err1("can't open %s (write)", ALBIND); fatal("mcp: -B aborted"); } while (fgets(line, BUFSIZ, alf) != NULL) { if (isspace(line[0]) || line[0] == '#') continue; cp = index(line, '#'); if (cp) *cp = '\0'; cp = index(line, ':'); if (cp) *cp = '\0'; if (line[0] == '\n') continue; cp = index(line, '\n'); if (cp) *cp = '\0'; (void) fprintf(bindf, "%s:::\n", line); } (void) fchmod(fileno(bindf), 0644); (void) fclose(bindf); (void) fclose(alf); setalent(); while (al = getalent()) { for (indx=0; indx < al->al_addresses.l_count; indx++) { cp = (char *) al->al_addresses.l_list[indx]; ac = getacnam(cp); if (ac && !instrlist(&ac->ac_aliases, cp)) { strlistadd(&ac->ac_aliases, al->al_name); sort_list(&ac->ac_aliases, pstrcmp); } } } endalent(); } #endif if (backup(PW) == 0 || backup(AC) == 0) fatal("mcp: -B aborted"); msg(""); save_pw(); save_ac(); non_critical(); goodbye(0); } static createfile(file) char *file; { int d; d = open(file, O_WRONLY|O_CREAT); if (d == -1) { perr(file); return; } (void) write(d, "Toto IV", 7); (void) ftruncate(d, (off_t)0); (void) fchmod(d, 0644); (void) fsync(d); (void) close(d); }