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
free_user(user * u)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
log_error(const char * msg)44 log_error(const char *msg)
45 {
46 log_it(User_name, getpid(), "PARSE", msg);
47 }
48
49 /* NULL pw implies syscrontab */
50 user *
load_user(int crontab_fd,struct passwd * pw,const char * name)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