xref: /dragonfly/usr.sbin/cron/cron/user.c (revision d4ef6694)
1 /* Copyright 1988,1990,1993,1994 by Paul Vixie
2  * All rights reserved
3  *
4  * Distribute freely, except: don't remove my name from the source or
5  * documentation (don't take credit for my work), mark your changes (don't
6  * get me blamed for your possible bugs), don't alter or remove this
7  * notice.  May be sold if buildable source is provided to buyer.  No
8  * warrantee of any kind, express or implied, is included with this
9  * software; use at your own risk, responsibility for damages (if any) to
10  * anyone resulting from the use of this software rests entirely with the
11  * user.
12  *
13  * Send bug reports, bug fixes, enhancements, requests, flames, etc., and
14  * I'll try to keep a version up to date.  I can be reached as follows:
15  * Paul Vixie          <paul@vix.com>          uunet!decwrl!vixie!paul
16  *
17  * $FreeBSD: src/usr.sbin/cron/cron/user.c,v 1.8 1999/08/28 01:15:50 peter Exp $
18  * $DragonFly: src/usr.sbin/cron/cron/user.c,v 1.3 2003/11/16 11:51:14 eirikn Exp $
19  */
20 
21 /* vix 26jan87 [log is in RCS file]
22  */
23 
24 
25 #include "cron.h"
26 
27 static char *User_name;
28 
29 void
30 free_user(user *u)
31 {
32 	entry	*e, *ne;
33 
34 	free(u->name);
35 	for (e = u->crontab;  e != NULL;  e = ne) {
36 		ne = e->next;
37 		free_entry(e);
38 	}
39 	free(u);
40 }
41 
42 static void
43 log_error(char *msg)
44 {
45 	log_it(User_name, getpid(), "PARSE", msg);
46 }
47 
48 user *
49 load_user(int crontab_fd, struct passwd *pw, char *name)
50 /* pw == NULL implies syscrontab */
51 {
52 	char	envstr[MAX_ENVSTR];
53 	FILE	*file;
54 	user	*u;
55 	entry	*e;
56 	int	status;
57 	char	**envp, **tenvp;
58 
59 	if (!(file = fdopen(crontab_fd, "r"))) {
60 		warn("fdopen on crontab_fd in load_user");
61 		return NULL;
62 	}
63 
64 	Debug(DPARS, ("load_user()\n"))
65 
66 	/* file is open.  build user entry, then read the crontab file.
67 	 */
68 	if ((u = (user *) malloc(sizeof(user))) == NULL) {
69 		errno = ENOMEM;
70 		return NULL;
71 	}
72 	if ((u->name = strdup(name)) == NULL) {
73 		free(u);
74 		errno = ENOMEM;
75 		return NULL;
76 	}
77 	u->crontab = NULL;
78 
79 	/*
80 	 * init environment.  this will be copied/augmented for each entry.
81 	 */
82 	if ((envp = env_init()) == NULL) {
83 		free(u->name);
84 		free(u);
85 		return NULL;
86 	}
87 
88 	/*
89 	 * load the crontab
90 	 */
91 	while ((status = load_env(envstr, file)) >= OK) {
92 		switch (status) {
93 		case ERR:
94 			free_user(u);
95 			u = NULL;
96 			goto done;
97 		case FALSE:
98 			User_name = u->name;    /* for log_error */
99 			e = load_entry(file, log_error, pw, envp);
100 			if (e) {
101 				e->next = u->crontab;
102 				u->crontab = e;
103 			}
104 			break;
105 		case TRUE:
106 			if ((tenvp = env_set(envp, envstr))) {
107 				envp = tenvp;
108 			} else {
109 				free_user(u);
110 				u = NULL;
111 				goto done;
112 			}
113 			break;
114 		}
115 	}
116 
117  done:
118 	env_free(envp);
119 	fclose(file);
120 	Debug(DPARS, ("...load_user() done\n"))
121 	return u;
122 }
123