#include <stdio.h>
#include <pwd.h>
/*
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <arpa/resolv.h>
*/
#include <strings.h>
	
static struct passwd passwd;
static char buf[256];
extern char **hes_resolve();
	
struct passwd *
hes_getpwnam(nam)
	char *nam;
{
	struct passwd *pwcommon();
	char **pp;
	
	pp = hes_resolve(nam, "passwd");
	return pwcommon(pp);
}

struct passwd *
hes_getpwuid(uid)
	int uid;
{
	struct passwd *pwcommon();
	char **pp, uidbuf[6];

	sprintf(uidbuf, "%u", uid);
	pp = hes_resolve(uidbuf, "uid");
	return pwcommon(pp);
}

static
struct passwd *
pwcommon(pp)
char **pp;
{
	register char *p;
	char *pwskip();

	if (pp == NULL)
		return(NULL);
	/* choose only the first response (only 1 expected) */
	strcpy(buf, pp[0]);
	while(*pp) free(*pp++); /* necessary to avoid leaks */
	p = buf;
	passwd.pw_name = p;
	p = pwskip(p);
	passwd.pw_passwd = p;
	p = pwskip(p);
	passwd.pw_uid = atoi(p);
	p = pwskip(p);
	passwd.pw_gid = atoi(p);
	passwd.pw_quota = 0;
	passwd.pw_comment = "";
	p = pwskip(p);
	passwd.pw_gecos = p;
	p = pwskip(p);
	passwd.pw_dir = p;
	p = pwskip(p);
	passwd.pw_shell = p;
	while (*p && *p != '\n')
		p++;
	*p = '\0';
	return(&passwd);
}

static char *
pwskip(p)
register char *p;
{
	while (*p && *p != ':' && *p != '\n')
		++p;
	if (*p)
		*p++ = 0;
	return(p);
}

