|
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 d
Length: 14405 (0x3845) Types: TextFile Names: »describe.c«
└─⟦a0efdde77⟧ Bits:30001252 EUUGD11 Tape, 1987 Spring Conference Helsinki └─⟦this⟧ »EUUGD11/euug-87hel/sec8/mcp/src/describe.c«
#include <stdio.h> #include <strings.h> #include <sys/types.h> #include <sys/file.h> #include <sys/stat.h> #include <lastlog.h> #include "sysdep.h" #include "macros.h" #include "mem.h" #include "lists.h" #include "job.h" #include "account.h" #ifdef SENDMAIL #include "alias.h" #endif #include "class.h" #include "groupmap.h" #include "range.h" #include "sig.h" #include "save.h" #include "sort.h" #ifdef BSD4_3 time_t time(); #endif #ifdef HELPDIR extern struct list AllCommands, Terms; #endif #ifdef SENDMAIL extern struct list AliasList; #endif extern struct list AccountList, Jobs, RangeList; extern int ModBits; char *when(), *sprintf(); #ifdef SENDMAIL desalias(c, v) int c; addr *v; { struct alias *al; static char *allv[2] = { ".*", 0 }; if (c > 2) { err1("%s: too many arguments", (char *)v[0]); return; } if (c < 2) { err1("usage: %s <alias>", (char *)v[0]); return; } al = getalnam((char *)v[1]); if (!al) { err1("%s: no such alias", (char *)v[1]); return; } (void) printf("Name: %s\n", al->al_name); if (al->al_groups.l_count) { (void) printf("Bound to group%-2s: ", S(al->al_groups.l_count)); listlist(&al->al_groups); } if (al->al_classes.l_count) { (void) printf("Bound to class%-2s: ", ES(al->al_classes.l_count)); listlist(&al->al_classes); } if (al->al_sigs.l_count) { (void) printf("Bound to sig%-4s: ", S(al->al_sigs.l_count)); listlist(&al->al_sigs); } if (al->al_addresses.l_count) { puts("\t- Addressees -"); (void) showlist(&al->al_addresses, (addr *)allv); (void) printf("%d addressee%s\n", al->al_addresses.l_count, S(al->al_addresses.l_count)); } else puts("No addressees."); return; } #endif deschanges(c, v) int c; addr *v; { struct job *jb; char errmsg[LONG_BUF]; int first, indx; first = (c > 1 ? Jobs.l_count - atoi((char *)v[1]) : 0); for (indx=first; indx < Jobs.l_count; indx++) { jb = (struct job *) Jobs.l_list[indx]; (void) printf("%3d ", indx+1); switch (jb->jb_todo) { case JB_LASTLOG: (void) printf("update lastlog entry for uid %d\n", jb->jb_uid); break; case JB_MKDIR: (void) printf("mkdir %s\n", jb->jb_name); break; case JB_MV: (void) printf("rename %s to %s\n", jb->jb_oldname, jb->jb_name); break; case JB_RMMAIL: (void) printf("remove mail for user \"%s\"\n", jb->jb_name); break; case JB_OMNICHOWN: (void) printf("omnichown uid %d's files to uid %d\n", jb->jb_olduid, jb->jb_uid); break; case JB_RMDIR: (void) printf("remove directory %s\n", jb->jb_name); break; default: (void) sprintf(errmsg, "internal error: unknown todo (%d)\n", jb->jb_todo); err(errmsg); break; } } if (ModBits) { fputs("Files modified:", stdout); (ModBits&AC) && fputs(" account", stdout); #ifdef SENDMAIL (ModBits&AL) && fputs(" alias", stdout); #endif (ModBits&CS) && fputs(" class", stdout); (ModBits&GR) && fputs(" group", stdout); (ModBits&PW) && fputs(" passwd", stdout); (ModBits&RG) && fputs(" range", stdout); (ModBits&SG) && fputs(" sig", stdout); (ModBits&VG) && fputs(" vig", stdout); puts(""); } } desclass(c, v) int c; addr *v; { struct class *cs; struct account *ac; int indx, members = 0; if ( c > 2 ) { err1("%s: too many arguments", (char *)v[0]); return; } if ( c != 2 ) { err1("usage: %s <class>", (char *)v[0]); return; } cs = getcsnam((char *)v[1]); if (!cs) { err1("%s: no such class", (char *)v[1]); return; } (void) printf("Class: %s\n", cs->cs_name); if (cs->cs_exptime) (void) printf("Ends: %s\n", when(cs->cs_exptime)); #ifdef SENDMAIL if (cs->cs_aliases.l_count) { (void) printf("Bound to alias%s: ", ES(cs->cs_aliases.l_count)); listlist(&cs->cs_aliases); } #endif puts((char *)cs->cs_desc); for (indx=0; indx < AccountList.l_count; indx++) { ac = (struct account *) AccountList.l_list[indx]; if (!instrlist(&ac->ac_classes, cs->cs_name)) continue; (void) printf("%-10s%-40s%3d", ac->ac_name, ac->ac_realname, ac->ac_uid); if (ac->ac_ll.ll_time) puts(" *"); else puts(""); members++; } if (members) (void) printf("\n%d member%s.\n", members, S(members)); else puts("No current members."); return; } descryos(c, v) int c; char **v; { struct account *ac; int indx, cryos = 0; if ( c > 1 ) { err1("%s: too many arguments", (char *)v[0]); return; } for (indx=0; indx < AccountList.l_count; indx++) { ac = (struct account *) AccountList.l_list[indx]; if (!eq(ac->ac_shell, FREEZE_SH)) continue; (void) printf("%-10s%-40s%3d", ac->ac_name, ac->ac_realname, ac->ac_uid); if (ac->ac_ll.ll_time) puts(" *"); else puts(""); cryos++; } if (cryos) (void) printf("\n%d cryo%s.\n", cryos, S(cryos)); else puts("No cryos."); return; } #ifdef HELPDIR char *getenv(); descommand(c, v) int c; addr *v; { char *pager = getenv("PAGER"); char *pname, helpfile[MEDIUM_BUF]; char *av[4]; struct stat statbuf; if ( c > 2 ) { err1("%s: too many arguments", (char *)v[0]); return; } if ( c < 2 ) { err1("usage: %s <mcp command>", (char *)v[0]); return; } if (!instrlist(&AllCommands, (char *)v[1])) { err2("%s: %s is not an mcp command", (char *)v[0], (char *)v[1]); return; } if (chdir(HELPDIR) == -1) { perr(HELPDIR); return; } (void) strcpy(helpfile, (char *)v[1]); (void) strcat(helpfile, ".k"); if (stat(helpfile, &statbuf) == -1) { err1("No help available for \"%s\"", (char *)v[1]); return; } if (statbuf.st_size == 0) { err1("Help file for \"%s\" is empty, (oh, well)", (char *)v[1]); return; } if (!pager) pager = DEF_PAGER; pname = rindex(pager, '/') + 1; pname = (pname ? pname : pager); av[0] = "shell-escape"; /* not really necessary */ av[1] = pager; av[2] = helpfile; av[3] = (char *)0; (void) shellescape(3, (addr *)av); return; } #endif desdeadbeats(c, v) int c; char **v; { struct account *ac; struct groupmap *gm; int indx, deadbeats = 0; char errmsg[LONG_BUF]; if ( c > 1 ) { err1("%s: too many arguments", (char *)v[0]); return; } for (indx=0; indx < AccountList.l_count; indx++) { ac = (struct account *) AccountList.l_list[indx]; if (ac->ac_classes.l_count) continue; if (ac->ac_sigs.l_count) continue; /* * Cryos are not deadbeats. */ if (eq(ac->ac_shell, FREEZE_SH)) continue; gm = getgmgid(ac->ac_gid); if (!gm) { (void) sprintf(errmsg, "no group for gid %d!", ac->ac_gid); err(errmsg); return; } if (vigexists(gm->gm_name)) continue; (void) printf("%-10s%-40s%3d", ac->ac_name, ac->ac_realname, ac->ac_uid); if (ac->ac_ll.ll_time) puts(" *"); else puts(""); deadbeats++; } if (deadbeats) (void) printf("\n%d deadbeat%s.\n", deadbeats, S(deadbeats)); else puts("No deadbeats."); return; } desgroup(c, v) int c; addr *v; { struct groupmap *gm; struct range *rg; struct account *ac; static struct list members; static char *allv[2] = { ".*", 0 }; int indx, vig = 0; if ( c > 2 ) { err1("%s: too many arguments", (char *)v[0]); return; } if (c != 2) { err1("usage: %s <group>", (char *)v[0]); return; } gm = getgmnam((char *)v[1]); if (!gm) { err1("%s: no such group", (char *)v[1]); return; } rg = getrgnam((char *)v[1]); if (vigexists((char *)v[1])) vig++; zerolist(&members); tmplistadd(&members); for (indx=0; indx < AccountList.l_count; indx++) { ac = (struct account *) AccountList.l_list[indx]; if (ac->ac_gid == gm->gm_gid) strlistadd(&members, (char *)ac->ac_name); } (void) printf("Group: %s (%u)%s\n", gm->gm_name, gm->gm_gid, vig?" VIG":""); if (rg) { (void) printf("uid range: %d-%d ", rg->rg_from, rg->rg_to); puts(rg->rg_mode == RG_SHARED ? "shared" : "exclusive"); } #ifdef SENDMAIL if (gm->gm_aliases.l_count) { (void) printf("Bound to alias%s: ", ES(gm->gm_aliases.l_count)); listlist(&gm->gm_aliases); } #endif if (members.l_count) { puts("\t- Members -"); sort_list(&members, pstrcmp); (void) showlist(&members, (addr *)allv); } if (gm->gm_mem.l_count) { puts("\t- Groupies -"); (void) showlist(&gm->gm_mem, (addr *)allv); } if (!members.l_count && !gm->gm_mem.l_count) puts("No current members or groupies."); else { if (members.l_count) (void) printf("%d member%s", members.l_count, S(members.l_count)); else (void) printf("No members"); if (gm->gm_mem.l_count) (void) printf(", %d groupie%s\n", gm->gm_mem.l_count, S(gm->gm_mem.l_count)); else puts(", no groupies."); } freelist(&members); return; } desinactives(c, v) int c; addr *v; { struct account *ac; struct groupmap *gm; int indx, inactives = 0, days; time_t now; long toolong; char errmsg[LONG_BUF]; if ( c > 2 ) { err1("%s: too many arguments", (char *)v[0]); return; } if ( c < 2 ) { err1("usage: %s <days>", (char *)v[0]); return; } if (!validint((char *)v[1])) { err2("%s: %s doesn't make sense as a number", (char *)v[0], (char *)v[1]); return; } now = time((time_t *)0); days = atoi((char *)v[1]); toolong = days * 86400; for (indx=0; indx < AccountList.l_count; indx++) { ac = (struct account *) AccountList.l_list[indx]; if ((long)(now - ac->ac_ll.ll_time) < toolong) continue; /* * Cryos are not inactive. */ if (eq(ac->ac_shell, FREEZE_SH)) continue; /* * Vig members are not inactive. */ gm = getgmgid(ac->ac_gid); if (!gm) { (void) sprintf(errmsg, "no group for gid %d!", ac->ac_gid); err(errmsg); return; } if (vigexists(gm->gm_name)) continue; (void) printf("%-10s%-40s%3d", ac->ac_name, ac->ac_realname, ac->ac_uid); if (ac->ac_ll.ll_time) puts(" *"); else puts(""); inactives++; } if (inactives) (void) printf("\n%d user%s inactive for at least %d day%s.\n", inactives, S(inactives), days, S(days)); else (void) printf("No users inactive for %d day%s.\n", days, S(days)); return; } desrange(c, v) int c; addr *v; { struct range *rg; if ( c > 2 ) { err1("%s: too many arguments", (char *)v[0]); return; } if (c != 2) { err1("usage: %s <range name>", (char *)v[0]); return; } rg = getrgnam((char *)v[1]); if (!rg) { err1("%s: no such range", (char *)v[1]); return; } (void) printf("%-16s %d to %d %s\n", rg->rg_name, rg->rg_from, rg->rg_to, (rg->rg_mode == RG_SHARED ? "shared" : "exclusive")); return; } dessig(c, v) int c; addr *v; { struct sig *sg; struct account *ac; int indx, members = 0; if ( c > 2 ) { err1("%s: too many arguments", (char *)v[0]); return; } if ( c != 2 ) { err1("usage: %s <sig>", (char *)v[0]); return; } sg = getsgnam((char *)v[1]); if (!sg) { err1("%s: no such sig", (char *)v[1]); return; } (void) printf("Sig: %s\n", sg->sg_name); if (sg->sg_exptime) (void) printf("Expires: %s\n", when(sg->sg_exptime)); #ifdef SENDMAIL if (sg->sg_aliases.l_count) { (void) printf("Bound to alias%s:", ES(sg->sg_aliases.l_count)); listlist(&sg->sg_aliases); } #endif puts((char *)sg->sg_desc); for (indx=0; indx < AccountList.l_count; indx++) { ac = (struct account *) AccountList.l_list[indx]; if (!instrlist(&ac->ac_sigs, sg->sg_name)) continue; (void) printf("%-10s%-40s%3d", ac->ac_name, ac->ac_realname, ac->ac_uid); if (ac->ac_ll.ll_time) puts(" *"); else puts(""); members++; } if (members) (void) printf("\n%d member%s.\n", members, S(members)); else puts("No current members."); return; } desuser(c, v) int c; addr *v; { #ifdef SENDMAIL static struct list mal; struct alias *al; register int j; #endif struct account *ac; struct groupmap *gm; char *shell, errmsg[LONG_BUF]; if ( c > 2 ) { err1("%s: too many arguments", (char *)v[0]); return; } if ( c != 2 ) { err1("usage: %s <user>", (char *)v[0]); return; } ac = getacnam((char *)v[1]); if (!ac) { err1("%s: no such user", (char *)v[1]); return; } gm = getgmgid(ac->ac_gid); if (!gm) { (void) sprintf(errmsg, "no group name for gid %d!", ac->ac_gid); err(errmsg); return; } if (strlen((char *)ac->ac_shell) == 0) shell = "/bin/sh"; else shell = (char *)ac->ac_shell; #ifdef SENDMAIL /* * Get the names of the aliases this user is in for later use */ zerolist(&mal); tmplistadd(&mal); for (j=0; j < AliasList.l_count; j++) { al = (struct alias *) AliasList.l_list[j]; if (instrlist(&al->al_addresses, (char *)ac->ac_name)) strlistadd(&mal, (char *)al->al_name); } #endif (void) printf("Login: %s (%d)\n", ac->ac_name, ac->ac_uid); (void) printf("Name: %s (%s)\n", ac->ac_realname, ac->ac_gecos); (void) printf("Id: %s\n", ac->ac_id); (void) printf("Groups: %s ", gm->gm_name); listlist(&ac->ac_groups); fputs("Classes: ", stdout); listlist(&ac->ac_classes); fputs("Sigs: ", stdout); listlist(&ac->ac_sigs); #ifdef SENDMAIL fputs("Aliases: ", stdout); listlist(&mal); #endif (void) printf("Home: %s\n", ac->ac_dir); (void) printf("Shell: %s\n", shell); if (ac->ac_ll.ll_time) { (void) printf("Last login %s on %s", when(ac->ac_ll.ll_time), ac->ac_ll.ll_line); if (ac->ac_ll.ll_host[0] != '\0') (void) printf(" from %s", ac->ac_ll.ll_host); puts(""); } else puts("Never logged in."); return; } #ifdef HELPDIR whatis(c, v) int c; addr *v; { char *pager = getenv("PAGER"); char *pname, helpfile[MEDIUM_BUF]; char *av[4]; struct stat statbuf; if ( c > 2 ) { err1("%s: too many arguments", (char *)v[0]); return; } if ( c != 2 ) { err1("usage: %s <mcp term>", (char *)v[0]); return; } if (!instrlist(&Terms, (char *)v[1])) { err2("%s: %s is not an mcp term", (char *)v[0], (char *)v[1]); return; } if (chdir(HELPDIR) == -1) { perr(HELPDIR); return; } (void) strcpy(helpfile, (char *)v[1]); (void) strcat(helpfile, ".k"); if (stat(helpfile, &statbuf) == -1) { err1("No definition file for \"%s\"", (char *)v[1]); return; } if (statbuf.st_size == 0) { err1("Definition file for \"%s\" is empty, (alas and alack!)", (char *)v[1]); return; } if (!pager) pager = DEF_PAGER; pname = rindex(pager, '/') + 1; pname = (pname ? pname : pager); av[0] = "shell-escape"; /* not really necessary */ av[1] = pager; av[2] = helpfile; av[3] = (char *)0; (void) shellescape(3, (addr *)av); return; } #endif