xref: /freebsd/usr.sbin/cron/cron/user.c (revision e0c4386e)
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