DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T t

⟦e90bebf77⟧ TextFile

    Length: 2570 (0xa0a)
    Types: TextFile
    Names: »tb_getlocal.c«

Derivation

└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
    └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« 
        └─⟦e5a54fb17⟧ 
            └─⟦this⟧ »pp-5.0/Lib/table/tb_getlocal.c« 

TextFile

/* tb_getlocal.c: convert address to user reference */

# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/table/RCS/tb_getlocal.c,v 5.0 90/09/20 16:15:32 pp Exp Locker: pp $";
# endif

/*
 * $Header: /cs/research/pp/hubris/pp-beta/Lib/table/RCS/tb_getlocal.c,v 5.0 90/09/20 16:15:32 pp Exp Locker: pp $
 *
 * $Log:	tb_getlocal.c,v $
 * Revision 5.0  90/09/20  16:15:32  pp
 * rcsforce : 5.0 public release
 * 
 */



#include        "util.h"
#include        "chan.h"
#include 	"loc_user.h"
#include 	<ctype.h>
#include	<pwd.h>

#define         MAX_USER_ARGS           5

extern char *mboxname;

/* ---------------------  Begin  Routines  -------------------------------- */

LocUser	*tb_getlocal (key, channel)
char            *key;
CHAN		*channel;
{
	LocUser	*loc;
	char	*cp;
	int	argc;
	char    *argv [MAX_USER_ARGS],
		buf [BUFSIZ];


	PP_DBG (("Lib/tb_getlocal (%s, %s)", key, channel -> ch_name));

	if (channel -> ch_table == NULL) {
		PP_LOG (LLOG_EXCEPTIONS,
 			("Channel %s (%s) doesn't have a table",
			channel -> ch_name, channel -> ch_show));
		return NULL;
	}

	if (tb_k2val (channel -> ch_table, key, buf) == NOTOK)
		return (NULL);

	if ((argc = sstr2arg (buf, MAX_USER_ARGS, argv, " ")) == NOTOK)
		return (NULL);

	loc = (LocUser *) smalloc (sizeof *loc);
	bzero ((char *)loc, sizeof *loc);

	if (argc > 1)
		loc -> directory = strdup (argv[1]);
	if (argc > 2)
		loc -> mailbox = strdup (argv[2]);

	if (isdigit (*argv[0]) && (cp = index (argv[0], '/'))) {
		if (loc -> directory == NULLCP) {
			PP_LOG (LLOG_EXCEPTIONS,
				("No directory specified for %s", key));
			free_loc_user (loc);
			return NULL;
		}
		*cp ++ = NULL;
		loc -> uid = atoi (argv[0]);
		loc -> gid = atoi (cp);
	}
	else {
		struct passwd *pwd;

		if ((pwd = getpwnam (argv[0])) == NULL) {
			PP_LOG (LLOG_EXCEPTIONS, 
				("No such local user %s", argv[0]));
			free_loc_user (loc);
			return NULL;
		}
		loc -> uid = pwd -> pw_uid;
		loc -> gid = pwd -> pw_gid;
		loc -> username = strdup (argv[0]);
		loc -> home = strdup (pwd -> pw_dir);
		loc -> shell = strdup (pwd -> pw_shell);
		if (loc -> directory == NULLCP)
			loc -> directory = strdup (pwd -> pw_dir);
	}
	if (loc -> mailbox == NULLCP)
		loc -> mailbox = strdup (mboxname);
	return (loc);
}

void	free_loc_user (loc)
LocUser	*loc;
{
	if (loc -> username)
		free (loc->username);
	if (loc -> directory)
		free (loc -> directory);
	if (loc -> mailbox)
		free (loc -> mailbox);
	if (loc -> shell)
		free (loc -> shell);
	if (loc -> home)
		free (loc -> home);
	free ((char *) loc);
}