#if !defined(lint) && !defined(LINT)
static const char rcsid[] =
"$FreeBSD: src/usr.sbin/cron/cron/user.c,v 1.8 1999/08/28 01:15:50 peter Exp $";
#endif
#include "cron.h"
static char *User_name;
void
free_user(u)
user *u;
{
entry *e, *ne;
free(u->name);
for (e = u->crontab; e != NULL; e = ne) {
ne = e->next;
free_entry(e);
}
free(u);
}
static void
log_error(msg)
char *msg;
{
log_it(User_name, getpid(), "PARSE", msg);
}
user *
load_user(crontab_fd, pw, name)
int crontab_fd;
struct passwd *pw;
char *name;
{
char envstr[MAX_ENVSTR];
FILE *file;
user *u;
entry *e;
int status;
char **envp, **tenvp;
if (!(file = fdopen(crontab_fd, "r"))) {
warn("fdopen on crontab_fd in load_user");
return NULL;
}
Debug(DPARS, ("load_user()\n"))
if ((u = (user *) malloc(sizeof(user))) == NULL) {
errno = ENOMEM;
return NULL;
}
if ((u->name = strdup(name)) == NULL) {
free(u);
errno = ENOMEM;
return NULL;
}
u->crontab = NULL;
if ((envp = env_init()) == NULL) {
free(u->name);
free(u);
return NULL;
}
while ((status = load_env(envstr, file)) >= OK) {
switch (status) {
case ERR:
free_user(u);
u = NULL;
goto done;
case FALSE:
User_name = u->name;
e = load_entry(file, log_error, pw, envp);
if (e) {
e->next = u->crontab;
u->crontab = e;
}
break;
case TRUE:
if ((tenvp = env_set(envp, envstr))) {
envp = tenvp;
} else {
free_user(u);
u = NULL;
goto done;
}
break;
}
}
done:
env_free(envp);
fclose(file);
Debug(DPARS, ("...load_user() done\n"))
return u;
}