|
|
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