summaryrefslogtreecommitdiffstats
path: root/instance.c
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2012-06-07 18:58:42 +0200
committerFelix Fietkau <nbd@openwrt.org>2012-06-07 18:58:42 +0200
commit84c2e44d4c1ae46418cc8f7891b31e9df4131d96 (patch)
treef04e35d4d0f6dca6960f119254b13cf3ce740693 /instance.c
parent86009b5439a898fa00cc27e675bb7834576be70a (diff)
downloadunitd-84c2e44d4c1ae46418cc8f7891b31e9df4131d96.tar
unitd-84c2e44d4c1ae46418cc8f7891b31e9df4131d96.zip
move instance code to a separate source file
Diffstat (limited to 'instance.c')
-rw-r--r--instance.c85
1 files changed, 85 insertions, 0 deletions
diff --git a/instance.c b/instance.c
new file mode 100644
index 0000000..e2c8b28
--- /dev/null
+++ b/instance.c
@@ -0,0 +1,85 @@
+#include "procd.h"
+#include "service.h"
+#include "instance.h"
+
+void
+instance_start(struct service_instance *in)
+{
+ in->restart = false;
+}
+
+static void
+instance_timeout(struct uloop_timeout *t)
+{
+ struct service_instance *in;
+
+ in = container_of(t, struct service_instance, timeout);
+ kill(in->proc.pid, SIGKILL);
+ uloop_process_delete(&in->proc);
+ in->proc.cb(&in->proc, -1);
+}
+
+static void
+instance_exit(struct uloop_process *p, int ret)
+{
+ struct service_instance *in;
+
+ in = container_of(p, struct service_instance, proc);
+ uloop_timeout_cancel(&in->timeout);
+ if (in->restart)
+ instance_start(in);
+}
+
+void
+instance_stop(struct service_instance *in, bool restart)
+{
+ if (!in->proc.pending)
+ return;
+
+ kill(in->proc.pid, SIGTERM);
+}
+
+static bool
+instance_config_changed(struct service_instance *in, struct service_instance *in_new)
+{
+ int len = blob_pad_len(in->config);
+
+ if (len != blob_pad_len(in_new->config))
+ return true;
+
+ if (memcmp(in->config, in_new->config, blob_pad_len(in->config)) != 0)
+ return true;
+
+ return false;
+}
+
+bool
+instance_update(struct service_instance *in, struct service_instance *in_new)
+{
+ bool changed = instance_config_changed(in, in_new);
+
+ in->config = in_new->config;
+ if (!changed)
+ return false;
+
+ instance_stop(in, true);
+ return true;
+}
+
+void
+instance_free(struct service_instance *in)
+{
+ uloop_process_delete(&in->proc);
+ uloop_timeout_cancel(&in->timeout);
+ free(in);
+}
+
+void
+instance_init(struct service_instance *in, struct blob_attr *config)
+{
+ in->config = config;
+ in->timeout.cb = instance_timeout;
+ in->proc.cb = instance_exit;
+}
+
+