[stgt] [PATCH] add a helper function to run an external program
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Mon Jun 14 13:02:03 CEST 2010
I need to run an external program when some events happen (the node
with the global IP crashes, I want to run a script to take over the
global IP on a new host).
It can be used to send administrators an e-mails or do whatever you
like.
=
From: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
Subject: [PATCH] add a helper function to run an external program
The new helper function can be used to run an external program when a
specific event happens.
Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
usr/tgtd.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
usr/tgtd.h | 2 +
2 files changed, 65 insertions(+), 0 deletions(-)
diff --git a/usr/tgtd.c b/usr/tgtd.c
index 18ad7be..8fbefb1 100644
--- a/usr/tgtd.c
+++ b/usr/tgtd.c
@@ -252,6 +252,69 @@ void tgt_remove_sched_event(struct event_data *evt)
}
}
+struct ext_prog_info {
+ void (*callback)(void *data, int result);
+ void *data;
+};
+
+static void run_ext_callback(int fd, int events, void *data)
+{
+ int ret, result;
+ struct ext_prog_info *ex = data;
+
+ ret = read(fd, &result, sizeof(result));
+ if (ret != sizeof(result)) {
+ result = -EINVAL;
+ eprintf("failed to get the result.");
+ }
+
+ if (ex->callback)
+ ex->callback(ex->data, result);
+
+ tgt_event_del(fd);
+ close(fd);
+ free(data);
+}
+
+int run_ext_program(const char *cmd,
+ void (*callback)(void *data, int result), void *data)
+{
+ pid_t pid;
+ int fds[2], ret;
+ struct ext_prog_info *ex;
+
+ ex = zalloc(sizeof(*ex));
+ if (!ex)
+ return -ENOMEM;
+
+ ret = pipe(fds);
+ if (ret < 0) {
+ free(ex);
+ return ret;
+ }
+
+ eprintf("%d %d\n", fds[0], fds[1]);
+
+ ex->callback = callback;
+ ex->data = data;
+
+ tgt_event_add(fds[0], EPOLLIN, run_ext_callback, ex);
+
+ pid = fork();
+ if (pid < 0)
+ return pid;
+
+ if (!pid) {
+ ret = system(cmd);
+ write(fds[1], &ret, sizeof(ret));
+ return 0;
+ }
+
+ close(fds[1]);
+
+ return 0;
+}
+
static int tgt_exec_scheduled(void)
{
struct list_head *last_sched;
diff --git a/usr/tgtd.h b/usr/tgtd.h
index b8541c8..9c44994 100644
--- a/usr/tgtd.h
+++ b/usr/tgtd.h
@@ -347,4 +347,6 @@ int do_tgt_event_add(int efd, struct list_head *list, int fd, int events,
void do_tgt_event_del(int efd, struct list_head *list, int fd);
int do_tgt_event_modify(int efd, struct list_head *list, int fd, int events);
+int run_ext_program(const char *cmd,
+ void (*callback)(void *data, int result), void *data);
#endif
--
1.6.5
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list