1/* $NetBSD: user.c,v 1.2 2010/05/06 18:53:17 christos Exp $ */ 2 3/* Copyright 1988,1990,1993,1994 by Paul Vixie 4 * All rights reserved 5 */ 6 7/* 8 * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") 9 * Copyright (c) 1997,2000 by Internet Software Consortium, Inc. 10 * 11 * Permission to use, copy, modify, and distribute this software for any 12 * purpose with or without fee is hereby granted, provided that the above 13 * copyright notice and this permission notice appear in all copies. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES 16 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 17 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR 18 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 19 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 20 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT 21 * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 22 */ 23#include <sys/cdefs.h> 24#if !defined(lint) && !defined(LINT) 25#if 0 26static char rcsid[] = "Id: user.c,v 1.5 2004/01/23 18:56:43 vixie Exp"; 27+#else 28+__RCSID("$NetBSD: user.c,v 1.2 2010/05/06 18:53:17 christos Exp $"); 29#endif 30#endif 31 32/* vix 26jan87 [log is in RCS file] 33 */ 34 35#include "cron.h" 36 37void 38free_user(user *u) { 39 entry *e, *ne; 40 41 free(u->name); 42 for (e = u->crontab; e != NULL; e = ne) { 43 ne = e->next; 44 free_entry(e); 45 } 46 free(u); 47} 48 49user * 50load_user(int crontab_fd, struct passwd *pw, const char *name) { 51 char envstr[MAX_ENVSTR]; 52 FILE *file; 53 user *u; 54 entry *e; 55 int status, save_errno; 56 char **envp, **tenvp; 57 58 if (!(file = fdopen(crontab_fd, "r"))) { 59 perror("fdopen on crontab_fd in load_user"); 60 return (NULL); 61 } 62 63 Debug(DPARS, ("load_user()\n")); 64 65 /* file is open. build user entry, then read the crontab file. 66 */ 67 if ((u = malloc(sizeof(*u))) == NULL) 68 return (NULL); 69 if ((u->name = strdup(name)) == NULL) { 70 save_errno = errno; 71 free(u); 72 errno = save_errno; 73 return (NULL); 74 } 75 u->crontab = NULL; 76 77 /* init environment. this will be copied/augmented for each entry. 78 */ 79 if ((envp = env_init()) == NULL) { 80 save_errno = errno; 81 free(u->name); 82 free(u); 83 errno = save_errno; 84 return (NULL); 85 } 86 87 /* load the crontab 88 */ 89 while ((status = load_env(envstr, file)) >= OK) { 90 switch (status) { 91 case ERR: 92 free_user(u); 93 u = NULL; 94 goto done; 95 case FALSE: 96 e = load_entry(file, NULL, pw, envp); 97 if (e) { 98 e->next = u->crontab; 99 u->crontab = e; 100 } 101 break; 102 case TRUE: 103 if ((tenvp = env_set(envp, envstr)) == NULL) { 104 save_errno = errno; 105 free_user(u); 106 u = NULL; 107 errno = save_errno; 108 goto done; 109 } 110 envp = tenvp; 111 break; 112 } 113 } 114 115 done: 116 env_free(envp); 117 (void)fclose(file); 118 Debug(DPARS, ("...load_user() done\n")); 119 return (u); 120} 121