1 /* $OpenBSD: user.c,v 1.6 2003/02/20 20:38:08 millert Exp $ */ 2 3 /* Copyright 1988,1990,1993,1994 by Paul Vixie 4 * All rights reserved 5 */ 6 7 /* 8 * Copyright (c) 1997,2000 by Internet Software Consortium, Inc. 9 * 10 * Permission to use, copy, modify, and distribute this software for any 11 * purpose with or without fee is hereby granted, provided that the above 12 * copyright notice and this permission notice appear in all copies. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS 15 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES 16 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE 17 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 18 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 19 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS 20 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS 21 * SOFTWARE. 22 */ 23 24 #if !defined(lint) && !defined(LINT) 25 static const char rcsid[] = "$OpenBSD: user.c,v 1.6 2003/02/20 20:38:08 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