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)
18 c(sv)->min = atoi(opt+4);
21 if (strncmp(opt, "period=", 7) == 0)
26 while (isdigit(*cp)) cp++;
30 case 'm': num *= 60; break;
31 case 'h': num *= 3600 ; break;
32 case 'd': num *= 24*3600 ; break;
33 default: error("bad period specifier, %s", opt); break;
42 static void daemon_register(service_t sv)
45 c(sv)->last_start = 0;
48 static void daemon_unregister(service_t sv)
50 /* nothing to do... */
53 static int daemon_prefork(service_t sv)
58 static void daemon_check(service_t sv)
60 /* make sure min are running, and watch for next period */
62 env[0] = "METAD_REASON=min";
63 env[1] = "METAD_ARG=";
65 while (c(sv)->min > 0 && count_procs(sv) < c(sv)->min)
67 if (new_proc(sv, env)<=0)
70 if (c(sv)->period > 0 &&
71 c(sv)->last_start + c(sv)->period <= time(0))
73 env[0] = "METAD_REASON=period";
75 c(sv)->last_start = time(0); /* even if it didn't start, we tried */
77 if (c(sv)->period > 0)
78 waituntil(c(sv)->last_start + c(sv)->period);
81 static void daemon_init(service_t to)
83 /* create ->classinfo with defaults */
86 n = (daemon_t)malloc(sizeof(struct daemon_opts));
93 static void daemon_copy(service_t from, service_t to)
95 /* copy the 'state' classinfo - last_start */
97 c(to)->last_start = c(from)->last_start;
100 static void daemon_freestate(service_t sv)
106 static void daemon_newparent(service_t sv, proc_t p)
108 c(sv)->last_start = time(0);
111 static void daemon_newchild(service_t sv)
116 static void daemon_send(service_t sv)
118 /* send min, period, last_start */
119 send_byte(1); /* daemon */
120 send_int(c(sv)->min);
121 send_int(c(sv)->period);
122 send_int(c(sv)->last_start);
125 struct class daemon_class = {
127 .c_process_opt = daemon_opt,
128 .register_service = daemon_register,
129 .c_check_service= daemon_check,
130 .init_state = daemon_init,
131 .copy_state = daemon_copy,
132 .free_state = daemon_freestate,
133 .send_class = daemon_send,
134 .disable_service= daemon_unregister,
135 .new_parent = daemon_newparent,
136 .new_child = daemon_newchild,
137 .prefork = daemon_prefork,