X-Git-Url: http://git.openwrt.org//?a=blobdiff_plain;f=service%2Finstance.c;h=88380499d56f34ccf07f063c9f63e9e3a6a19ebf;hb=4004b68fe57dd72197b8a00b0756cc7f978ad88a;hp=dccf4b4d231a437a89cbe36c4f070c6f9e95805c;hpb=b12bb150ed38a4409bef5127c77b060ee616b860;p=project%2Fprocd.git diff --git a/service/instance.c b/service/instance.c index dccf4b4..8838049 100644 --- a/service/instance.c +++ b/service/instance.c @@ -263,6 +263,7 @@ instance_writepid(struct service_instance *in) if (fprintf(_pidfile, "%d\n", in->proc.pid) < 0) { ERROR("failed to write pidfile: %s: %d (%s)", in->pidfile, errno, strerror(errno)); + fclose(_pidfile); return 2; } if (fclose(_pidfile)) { @@ -386,7 +387,7 @@ instance_start(struct service_instance *in) return; } - if (in->proc.pending) + if (in->proc.pending || !in->command) return; instance_free_stdio(in); @@ -513,7 +514,7 @@ instance_exit(struct uloop_process *p, int ret) uloop_timeout_cancel(&in->timeout); if (in->halt) { - /* no action */ + instance_removepid(in); } else if (in->restart) { instance_start(in); } else if (in->respawn) { @@ -526,7 +527,9 @@ instance_exit(struct uloop_process *p, int ret) in->srv->name, in->name, in->respawn_count, runtime); in->restart = in->respawn = 0; in->halt = 1; + service_event("instance.fail", in->srv->name, in->name); } else { + service_event("instance.respawn", in->srv->name, in->name); uloop_timeout_set(&in->timeout, in->respawn_timeout * 1000); } } @@ -541,7 +544,6 @@ instance_stop(struct service_instance *in) in->halt = true; in->restart = in->respawn = false; kill(in->proc.pid, SIGTERM); - instance_removepid(in); } static void @@ -567,9 +569,6 @@ instance_config_changed(struct service_instance *in, struct service_instance *in if (!blobmsg_list_equal(&in->env, &in_new->env)) return true; - if (!blobmsg_list_equal(&in->data, &in_new->data)) - return true; - if (!blobmsg_list_equal(&in->netdev, &in_new->netdev)) return true; @@ -752,31 +751,42 @@ instance_jail_parse(struct service_instance *in, struct blob_attr *attr) } static bool -instance_config_parse(struct service_instance *in) +instance_config_parse_command(struct service_instance *in, struct blob_attr **tb) { - struct blob_attr *tb[__INSTANCE_ATTR_MAX]; struct blob_attr *cur, *cur2; - int argc = 0; + bool ret = false; int rem; - blobmsg_parse(instance_attr, __INSTANCE_ATTR_MAX, tb, - blobmsg_data(in->config), blobmsg_data_len(in->config)); - cur = tb[INSTANCE_ATTR_COMMAND]; - if (!cur) - return false; + if (!cur) { + in->command = NULL; + return true; + } if (!blobmsg_check_attr_list(cur, BLOBMSG_TYPE_STRING)) return false; blobmsg_for_each_attr(cur2, cur, rem) { - argc++; + ret = true; break; } - if (!argc) - return false; in->command = cur; + return ret; +} + +static bool +instance_config_parse(struct service_instance *in) +{ + struct blob_attr *tb[__INSTANCE_ATTR_MAX]; + struct blob_attr *cur, *cur2; + int rem; + + blobmsg_parse(instance_attr, __INSTANCE_ATTR_MAX, tb, + blobmsg_data(in->config), blobmsg_data_len(in->config)); + + if (!instance_config_parse_command(in, tb)) + return false; if (tb[INSTANCE_ATTR_RESPAWN]) { int i = 0; @@ -907,25 +917,21 @@ instance_config_move(struct service_instance *in, struct service_instance *in_sr in_src->config = NULL; } -bool +void instance_update(struct service_instance *in, struct service_instance *in_new) { bool changed = instance_config_changed(in, in_new); bool running = in->proc.pending; - if (!changed && running) - return false; - if (!running) { - if (changed) - instance_config_move(in, in_new); + instance_config_move(in, in_new); instance_start(in); } else { - instance_restart(in); + if (changed) + instance_restart(in); instance_config_move(in, in_new); /* restart happens in the child callback handler */ } - return true; } void @@ -980,7 +986,8 @@ void instance_dump(struct blob_buf *b, struct service_instance *in, int verbose) blobmsg_add_u8(b, "running", in->proc.pending); if (in->proc.pending) blobmsg_add_u32(b, "pid", in->proc.pid); - blobmsg_add_blob(b, in->command); + if (in->command) + blobmsg_add_blob(b, in->command); if (!avl_is_empty(&in->errors.avl)) { struct blobmsg_list_node *var;