xref: /openbsd-src/usr.sbin/cron/job.c (revision b2ea75c1b17e1a9a339660e7ed45cd24946b230e)
1 /*	$OpenBSD: job.c,v 1.3 2001/02/18 19:48:35 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: job.c,v 1.3 2001/02/18 19:48:35 millert Exp $";
25 #endif
26 
27 
28 #include "cron.h"
29 
30 
31 typedef	struct _job {
32 	struct _job	*next;
33 	entry		*e;
34 	user		*u;
35 } job;
36 
37 
38 static job	*jhead = NULL, *jtail = NULL;
39 
40 
41 void
42 job_add(e, u)
43 	entry *e;
44 	user *u;
45 {
46 	job *j;
47 
48 	/* if already on queue, keep going */
49 	for (j = jhead; j != NULL; j = j->next)
50 		if (j->e == e && j->u == u)
51 			return;
52 
53 	/* build a job queue element */
54 	if ((j = (job*)malloc(sizeof(job))) == NULL)
55 		return;
56 	j->next = (job*) NULL;
57 	j->e = e;
58 	j->u = u;
59 
60 	/* add it to the tail */
61 	if (jhead == NULL)
62 		jhead = j;
63 	else
64 		jtail->next = j;
65 	jtail = j;
66 }
67 
68 
69 int
70 job_runqueue()
71 {
72 	job	*j, *jn;
73 	int	run = 0;
74 
75 	for (j = jhead; j; j = jn) {
76 		do_command(j->e, j->u);
77 		jn = j->next;
78 		free(j);
79 		run++;
80 	}
81 	jhead = jtail = NULL;
82 	return (run);
83 }
84