]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - usr.sbin/cron/cron/user.c
Merge bmake-20240430
[FreeBSD/FreeBSD.git] / usr.sbin / cron / cron / user.c
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 }