4 typedef struct daemon_opts
11 #define c(sv) ((daemon_t)((sv)->classinfo))
13 static int daemon_opt(service_t sv, char *opt)
15 /* understand min= period= */
16 if (strncmp(opt, "min=", 4)==0) {
17 c(sv)->min = atoi(opt+4);
20 if (strncmp(opt, "period=", 7) == 0) {
24 while (isdigit(*cp)) cp++;
28 case 'm': num *= 60; break;
29 case 'h': num *= 3600 ; break;
30 case 'd': num *= 24*3600 ; break;
31 default: error("bad period specifier, %s", opt); break;
40 static void daemon_register(service_t sv)
43 c(sv)->last_start = 0;
46 static void daemon_unregister(service_t sv)
48 /* nothing to do... */
51 static int daemon_prefork(service_t sv)
56 static void daemon_check(service_t sv)
58 /* make sure min are running, and watch for next period */
60 env[0] = "METAD_REASON=min";
61 env[1] = "METAD_ARG=";
63 while (c(sv)->min > 0 && count_procs(sv) < c(sv)->min)
64 if (new_proc(sv, env)<=0)
67 if (c(sv)->period > 0 &&
68 c(sv)->last_start + c(sv)->period <= time(0)) {
69 env[0] = "METAD_REASON=period";
71 c(sv)->last_start = time(0); /* even if it didn't start, we tried */
73 if (c(sv)->period > 0)
74 waituntil(c(sv)->last_start + c(sv)->period);
77 static void daemon_init(service_t to)
79 /* create ->classinfo with defaults */
82 n = (daemon_t)malloc(sizeof(struct daemon_opts));
89 static void daemon_copy(service_t from, service_t to)
91 /* copy the 'state' classinfo - last_start */
93 c(to)->last_start = c(from)->last_start;
96 static void daemon_freestate(service_t sv)
102 static void daemon_newparent(service_t sv, proc_t p)
104 c(sv)->last_start = time(0);
107 static void daemon_newchild(service_t sv)
111 static void daemon_send(service_t sv)
113 /* send min, period, last_start */
114 send_byte(1); /* daemon */
115 send_int(c(sv)->min);
116 send_int(c(sv)->period);
117 send_int(c(sv)->last_start);
120 struct class daemon_class = {
122 .c_process_opt = daemon_opt,
123 .register_service = daemon_register,
124 .c_check_service= daemon_check,
125 .init_state = daemon_init,
126 .copy_state = daemon_copy,
127 .free_state = daemon_freestate,
128 .send_class = daemon_send,
129 .disable_service= daemon_unregister,
130 .new_parent = daemon_newparent,
131 .new_child = daemon_newchild,
132 .prefork = daemon_prefork,