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