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