1 /* $OpenBSD: user.c,v 1.7 2004/06/17 22:11:55 millert 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 24 #if !defined(lint) && !defined(LINT) 25 static const char rcsid[] = "$OpenBSD: user.c,v 1.7 2004/06/17 22:11:55 millert Exp $"; 26 #endif 27 28 /* vix 26jan87 [log is in RCS file] 29 */ 30 31 #include "cron.h" 32 33 void 34 free_user(user *u) { 35 entry *e, *ne; 36 37 free(u->name); 38 for (e = u->crontab; e != NULL; e = ne) { 39 ne = e->next; 40 free_entry(e); 41 } 42 free(u); 43 } 44 45 user * 46 load_user(int crontab_fd, struct passwd *pw, const char *name) { 47 char envstr[MAX_ENVSTR]; 48 FILE *file; 49 user *u; 50 entry *e; 51 int status, save_errno; 52 char **envp, **tenvp; 53 54 if (!(file = fdopen(crontab_fd, "r"))) { 55 perror("fdopen on crontab_fd in load_user"); 56 return (NULL); 57 } 58 59 Debug(DPARS, ("load_user()\n")) 60 61 /* file is open. build user entry, then read the crontab file. 62 */ 63 if ((u = (user *) malloc(sizeof(user))) == NULL) 64 return (NULL); 65 if ((u->name = strdup(name)) == NULL) { 66 save_errno = errno; 67 free(u); 68 errno = save_errno; 69 return (NULL); 70 } 71 u->crontab = NULL; 72 73 /* init environment. this will be copied/augmented for each entry. 74 */ 75 if ((envp = env_init()) == NULL) { 76 save_errno = errno; 77 free(u->name); 78 free(u); 79 errno = save_errno; 80 return (NULL); 81 } 82 83 /* load the crontab 84 */ 85 while ((status = load_env(envstr, file)) >= OK) { 86 switch (status) { 87 case ERR: 88 free_user(u); 89 u = NULL; 90 goto done; 91 case FALSE: 92 e = load_entry(file, NULL, pw, envp); 93 if (e) { 94 e->next = u->crontab; 95 u->crontab = e; 96 } 97 break; 98 case TRUE: 99 if ((tenvp = env_set(envp, envstr)) == NULL) { 100 save_errno = errno; 101 free_user(u); 102 u = NULL; 103 errno = save_errno; 104 goto done; 105 } 106 envp = tenvp; 107 break; 108 } 109 } 110 111 done: 112 env_free(envp); 113 fclose(file); 114 Debug(DPARS, ("...load_user() done\n")) 115 return (u); 116 } 117