user.c revision 2312
1/* Copyright 1988,1990,1993,1994 by Paul Vixie 2 * All rights reserved 3 * 4 * Distribute freely, except: don't remove my name from the source or 5 * documentation (don't take credit for my work), mark your changes (don't 6 * get me blamed for your possible bugs), don't alter or remove this 7 * notice. May be sold if buildable source is provided to buyer. No 8 * warrantee of any kind, express or implied, is included with this 9 * software; use at your own risk, responsibility for damages (if any) to 10 * anyone resulting from the use of this software rests entirely with the 11 * user. 12 * 13 * Send bug reports, bug fixes, enhancements, requests, flames, etc., and 14 * I'll try to keep a version up to date. I can be reached as follows: 15 * Paul Vixie <paul@vix.com> uunet!decwrl!vixie!paul 16 */ 17 18#if !defined(lint) && !defined(LINT) 19static char rcsid[] = "$Id: user.c,v 2.8 1994/01/15 20:43:43 vixie Exp $"; 20#endif 21 22/* vix 26jan87 [log is in RCS file] 23 */ 24 25 26#include "cron.h" 27 28 29void 30free_user(u) 31 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 44user * 45load_user(crontab_fd, pw, name) 46 int crontab_fd; 47 struct passwd *pw; /* NULL implies syscrontab */ 48 char *name; 49{ 50 char envstr[MAX_ENVSTR]; 51 FILE *file; 52 user *u; 53 entry *e; 54 int status; 55 char **envp; 56 57 if (!(file = fdopen(crontab_fd, "r"))) { 58 perror("fdopen on crontab_fd in load_user"); 59 return NULL; 60 } 61 62 Debug(DPARS, ("load_user()\n")) 63 64 /* file is open. build user entry, then read the crontab file. 65 */ 66 u = (user *) malloc(sizeof(user)); 67 u->name = strdup(name); 68 u->crontab = NULL; 69 70 /* 71 * init environment. this will be copied/augmented for each entry. 72 */ 73 envp = env_init(); 74 75 /* 76 * load the crontab 77 */ 78 while ((status = load_env(envstr, file)) >= OK) { 79 switch (status) { 80 case ERR: 81 free_user(u); 82 u = NULL; 83 goto done; 84 case FALSE: 85 e = load_entry(file, NULL, pw, envp); 86 if (e) { 87 e->next = u->crontab; 88 u->crontab = e; 89 } 90 break; 91 case TRUE: 92 envp = env_set(envp, envstr); 93 break; 94 } 95 } 96 97 done: 98 env_free(envp); 99 fclose(file); 100 Debug(DPARS, ("...load_user() done\n")) 101 return u; 102} 103