12 static const struct blobmsg_policy instance_attr[__INSTANCE_ATTR_MAX] = {
13 [INSTANCE_ATTR_COMMAND] = { "command", BLOBMSG_TYPE_ARRAY },
14 [INSTANCE_ATTR_ENV] = { "env", BLOBMSG_TYPE_TABLE },
15 [INSTANCE_ATTR_DATA] = { "data", BLOBMSG_TYPE_TABLE },
19 instance_start(struct service_instance *in)
25 instance_timeout(struct uloop_timeout *t)
27 struct service_instance *in;
29 in = container_of(t, struct service_instance, timeout);
30 kill(in->proc.pid, SIGKILL);
31 uloop_process_delete(&in->proc);
32 in->proc.cb(&in->proc, -1);
36 instance_exit(struct uloop_process *p, int ret)
38 struct service_instance *in;
40 in = container_of(p, struct service_instance, proc);
41 uloop_timeout_cancel(&in->timeout);
47 instance_stop(struct service_instance *in, bool restart)
49 if (!in->proc.pending)
52 kill(in->proc.pid, SIGTERM);
56 instance_config_changed(struct service_instance *in, struct service_instance *in_new)
61 if (!blob_attr_equal(in->command, in_new->command))
64 if (!blobmsg_list_equal(&in->env, &in_new->env))
67 if (!blobmsg_list_equal(&in->data, &in_new->data))
74 instance_config_parse(struct service_instance *in)
76 struct blob_attr *tb[__INSTANCE_ATTR_MAX];
77 struct blob_attr *cur;
79 blobmsg_parse(instance_attr, __INSTANCE_ATTR_MAX, tb,
80 blobmsg_data(in->config), blobmsg_data_len(in->config));
81 if (!tb[INSTANCE_ATTR_COMMAND])
84 if ((cur = tb[INSTANCE_ATTR_ENV]))
85 blobmsg_list_fill(&in->env, blobmsg_data(cur), blobmsg_data_len(cur));
87 if ((cur = tb[INSTANCE_ATTR_DATA]))
88 blobmsg_list_fill(&in->data, blobmsg_data(cur), blobmsg_data_len(cur));
94 instance_config_cleanup(struct service_instance *in)
96 blobmsg_list_free(&in->env);
97 blobmsg_list_free(&in->data);
101 instance_config_move(struct service_instance *in, struct service_instance *in_src)
103 instance_config_cleanup(in);
104 blobmsg_list_move(&in->env, &in_src->env);
105 blobmsg_list_move(&in->data, &in_src->data);
106 in->command = in_src->command;
110 instance_update(struct service_instance *in, struct service_instance *in_new)
112 bool changed = instance_config_changed(in, in_new);
114 in->config = in_new->config;
118 instance_stop(in, true);
119 instance_config_move(in, in_new);
124 instance_free(struct service_instance *in)
126 uloop_process_delete(&in->proc);
127 uloop_timeout_cancel(&in->timeout);
128 instance_config_cleanup(in);
133 instance_init(struct service_instance *in, struct blob_attr *config)
136 in->timeout.cb = instance_timeout;
137 in->proc.cb = instance_exit;
139 blobmsg_list_simple_init(&in->env);
140 blobmsg_list_simple_init(&in->data);
141 in->valid = instance_config_parse(in);