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