bozo: Tidy header includes
[openafs.git] / src / bozo / ezbnodeops.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 #include <afsconfig.h>
11 #include <afs/param.h>
12
13 #include <afs/procmgmt.h>
14 #include <roken.h>
15
16 #include <lwp.h>
17 #include <rx/rx.h>
18 #ifdef AFS_NT40_ENV
19 #include <io.h>
20 #endif
21
22 #include <afs/afsutil.h>
23 #include "bnode.h"
24 #include "bosprototypes.h"
25
26
27 struct bnode *ez_create(char *, char *, char *, char *, char *, char *);
28 static int ez_hascore(struct bnode *bnode);
29 static int ez_restartp(struct bnode *bnode);
30 static int ez_delete(struct bnode *bnode);
31 static int ez_timeout(struct bnode *bnode);
32 static int ez_getstat(struct bnode *bnode, afs_int32 *status);
33 static int ez_setstat(struct bnode *bnode, afs_int32 status);
34 static int ez_procexit(struct bnode *bnode, struct bnode_proc *proc);
35 static int ez_getstring(struct bnode *bnode, char *abuffer, afs_int32 alen);
36 static int ez_getparm(struct bnode *bnode, afs_int32, char *, afs_int32);
37
38 #define SDTIME          60      /* time in seconds given to a process to evaporate */
39
40 struct bnode_ops ezbnode_ops = {
41     ez_create,
42     ez_timeout,
43     ez_getstat,
44     ez_setstat,
45     ez_delete,
46     ez_procexit,
47     ez_getstring,
48     ez_getparm,
49     ez_restartp,
50     ez_hascore,
51 };
52
53 static int
54 ez_hascore(struct bnode *abnode)
55 {
56     char tbuffer[256];
57
58     bnode_CoreName(abnode, NULL, tbuffer);
59     if (access(tbuffer, 0) == 0)
60         return 1;
61     else
62         return 0;
63 }
64
65 static int
66 ez_restartp(struct bnode *bn)
67 {
68     struct ezbnode *abnode = (struct ezbnode *)bn;
69     struct bnode_token *tt;
70     afs_int32 code;
71     struct stat tstat;
72
73     code = bnode_ParseLine(abnode->command, &tt);
74     if (code)
75         return 0;
76     if (!tt)
77         return 0;
78     code = stat(tt->key, &tstat);
79     if (code) {
80         bnode_FreeTokens(tt);
81         return 0;
82     }
83     if (tstat.st_ctime > abnode->lastStart)
84         code = 1;
85     else
86         code = 0;
87     bnode_FreeTokens(tt);
88     return code;
89 }
90
91 static int
92 ez_delete(struct bnode *bn)
93 {
94     struct ezbnode *abnode = (struct ezbnode *)bn;
95
96     free(abnode->command);
97     free(abnode);
98     return 0;
99 }
100
101 struct bnode *
102 ez_create(char *ainstance, char *acommand, char *unused1, char *unused2,
103           char *unused3, char *unused4)
104 {
105     struct ezbnode *te;
106     char *cmdpath;
107
108     if (ConstructLocalBinPath(acommand, &cmdpath)) {
109         bozo_Log("BNODE: command path invalid '%s'\n", acommand);
110         return NULL;
111     }
112
113     te = (struct ezbnode *)malloc(sizeof(struct ezbnode));
114     memset(te, 0, sizeof(struct ezbnode));
115     if (bnode_InitBnode((struct bnode *)te, &ezbnode_ops, ainstance) != 0) {
116         free(te);
117         return NULL;
118     }
119     te->command = cmdpath;
120     return (struct bnode *)te;
121 }
122
123 /* called to SIGKILL a process if it doesn't terminate normally */
124 static int
125 ez_timeout(struct bnode *bn)
126 {
127     struct ezbnode *abnode = (struct ezbnode *)bn;
128
129     if (!abnode->waitingForShutdown)
130         return 0;               /* spurious */
131     /* send kill and turn off timer */
132     bnode_StopProc(abnode->proc, SIGKILL);
133     abnode->killSent = 1;
134     bnode_SetTimeout((struct bnode *)abnode, 0);
135     return 0;
136 }
137
138 static int
139 ez_getstat(struct bnode *bn, afs_int32 * astatus)
140 {
141     struct ezbnode *abnode = (struct ezbnode *)bn;
142
143     afs_int32 temp;
144     if (abnode->waitingForShutdown)
145         temp = BSTAT_SHUTTINGDOWN;
146     else if (abnode->running)
147         temp = BSTAT_NORMAL;
148     else
149         temp = BSTAT_SHUTDOWN;
150     *astatus = temp;
151     return 0;
152 }
153
154 static int
155 ez_setstat(struct bnode *bn, afs_int32 astatus)
156 {
157     struct ezbnode *abnode = (struct ezbnode *)bn;
158
159     struct bnode_proc *tp;
160     afs_int32 code;
161
162     if (abnode->waitingForShutdown)
163         return BZBUSY;
164     if (astatus == BSTAT_NORMAL && !abnode->running) {
165         /* start up */
166         abnode->lastStart = FT_ApproxTime();
167         code = bnode_NewProc((struct bnode *)abnode, abnode->command, NULL, &tp);
168         if (code)
169             return code;
170         abnode->running = 1;
171         abnode->proc = tp;
172         return 0;
173     } else if (astatus == BSTAT_SHUTDOWN && abnode->running) {
174         /* start shutdown */
175         bnode_StopProc(abnode->proc, SIGTERM);
176         abnode->waitingForShutdown = 1;
177         bnode_SetTimeout((struct bnode *)abnode, SDTIME);
178         return 0;
179     }
180     return 0;
181 }
182
183 static int
184 ez_procexit(struct bnode *bn, struct bnode_proc *aproc)
185 {
186     struct ezbnode *abnode = (struct ezbnode *)bn;
187
188     /* process has exited */
189     afs_int32 code;
190
191     abnode->waitingForShutdown = 0;
192     abnode->running = 0;
193     abnode->killSent = 0;
194     abnode->proc = NULL;
195     bnode_SetTimeout((struct bnode *) abnode, 0);       /* clear timer */
196     if (abnode->b.goal)
197         code = ez_setstat((struct bnode *) abnode, BSTAT_NORMAL);
198     else
199         code = 0;
200     return code;
201 }
202
203 static int
204 ez_getstring(struct bnode *abnode, char *abuffer, afs_int32 alen)
205 {
206     return -1;                  /* don't have much to add */
207 }
208
209 static int
210 ez_getparm(struct bnode *bn, afs_int32 aindex, char *abuffer,
211            afs_int32 alen)
212 {
213     struct ezbnode *abnode = (struct ezbnode *) bn;
214     if (aindex > 0)
215         return BZDOM;
216     strcpy(abuffer, abnode->command);
217     return 0;
218 }