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