|
|
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 t
Length: 2683 (0xa7b)
Types: TextFile
Names: »tb_getprog.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Chans/shell/tb_getprog.c«
/* tb_getprog.c: get prog/shell channel entry */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Chans/shell/RCS/tb_getprog.c,v 5.0 90/09/20 15:53:42 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Chans/shell/RCS/tb_getprog.c,v 5.0 90/09/20 15:53:42 pp Exp Locker: pp $
*
* $Log: tb_getprog.c,v $
* Revision 5.0 90/09/20 15:53:42 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include "table.h"
#include "prog.h"
extern char *compress();
#define DEFAULT_TIMEOUT 5*60 /* 5 mins */
ProgInfo *tb_getprog (key, tbl)
char *key;
Table *tbl;
{
char buf[BUFSIZ],
*timeout_value,
*ix;
struct passwd *pwd;
char *cp;
ProgInfo *prog;
PP_DBG(("tb_getprog (%s)", key));
if (tbl == NULLTBL) {
PP_LOG(LLOG_FATAL, ("tb_getprog (no table)"));
return NULLPROG;
}
if (tb_k2val (tbl, key, buf) == NOTOK)
return (NULLPROG);
/* syntax uid,timeout,cmd line */
if ((ix = index(buf,',')) == NULLCP) {
PP_LOG(LLOG_EXCEPTIONS,
("incorrect table syntax for entry '%s' (missing ,)",
key));
return NULLPROG;
}
*ix++ = '\0';
prog = (ProgInfo *) smalloc (sizeof *prog);
bzero ((char *)prog, sizeof *prog);
/* uid is either a name or a uid/gid pair */
if (isdigit (*buf) && (cp = index (buf, '/'))) {
prog -> username = NULLCP;
*cp ++ = NULL;
prog -> uid = atoi (buf);
prog -> gid = atoi (cp);
prog -> home = strdup ("/tmp");
}
else {
prog->username = strdup(buf);
if ((pwd = getpwnam(prog->username)) == NULL) {
PP_OPER(NULLCP,
("tb_getprog no user '%s' with key '%s'",
prog->username, key));
prog_free (prog);
return NULLPROG;
}
prog -> uid = pwd -> pw_uid;
prog -> gid = pwd -> pw_gid;
prog -> home = strdup (pwd -> pw_dir);
if (pwd -> pw_shell)
prog -> shell = strdup (pwd -> pw_shell);
}
if (prog -> shell == NULLCP)
prog -> shell = strdup ("/bin/sh");
timeout_value = ix;
if ((ix = index(timeout_value, ',')) == NULLCP) {
PP_LOG(LLOG_EXCEPTIONS,
("incorrect table syntax for '%s' entry (missing ,:)",
key));
prog_free (prog);
return NULLPROG;
}
*ix++ = '\0';
(void) compress(timeout_value, timeout_value);
if (timeout_value[0] == '\0')
prog -> timeout_in_secs = DEFAULT_TIMEOUT;
else
prog -> timeout_in_secs = atoi(timeout_value);
prog -> cmd_line = strdup(ix);
return prog;
}
void prog_free (prog)
ProgInfo *prog;
{
if (prog == NULLPROG)
return;
if (prog -> cmd_line)
free (prog -> cmd_line);
if (prog -> username)
free (prog -> username);
if (prog -> home)
free (prog -> home);
if (prog -> shell)
free (prog -> shell);
free ((char *)prog);
}