From 8e72b3d6d6e41726d6323e429e877f8905615159 Mon Sep 17 00:00:00 2001 From: Petr Rockai Date: Mon, 18 Jul 2011 14:46:54 +0000 Subject: [PATCH] Various improvements to the daemon-common code, including automated response formatting from config trees provided by the daemon implementation. --- daemons/common/daemon-client.h | 1 + daemons/common/daemon-server.c | 30 ++++++++++++++++++++++++++++-- daemons/common/daemon-server.h | 7 ++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/daemons/common/daemon-client.h b/daemons/common/daemon-client.h index 124892d60..adb1c96f4 100644 --- a/daemons/common/daemon-client.h +++ b/daemons/common/daemon-client.h @@ -12,6 +12,7 @@ * Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include "libdevmapper.h" // for dm_list, needed by config.h #include "config.h" // should become part of libdevmapper later #ifndef _LVM_DAEMON_COMMON_CLIENT_H diff --git a/daemons/common/daemon-server.c b/daemons/common/daemon-server.c index 27496980d..c1668118a 100644 --- a/daemons/common/daemon-server.c +++ b/daemons/common/daemon-server.c @@ -218,6 +218,22 @@ struct thread_baton { client_handle client; }; +int buffer_rewrite(char **buf, const char *format, const char *string) { + char *old = *buf; + dm_asprintf(buf, format, *buf, string); + dm_free(old); + return 0; +} + +int buffer_line(const char *line, void *baton) { + response *r = baton; + if (r->buffer) + buffer_rewrite(&r->buffer, "%s\n%s", line); + else + dm_asprintf(&r->buffer, "%s\n", line); + return 0; +} + void *client_thread(void *baton) { struct thread_baton *b = baton; @@ -227,12 +243,16 @@ void *client_thread(void *baton) goto fail; req.cft = create_config_tree_from_string(req.buffer); + if (!req.cft) + fprintf(stderr, "error parsing request:\n %s\n", req.buffer); response res = b->s.handler(b->s, b->client, req); - destroy_config_tree(req.cft); + if (req.cft) + destroy_config_tree(req.cft); dm_free(req.buffer); if (!res.buffer) { - /* TODO fill in the buffer from res.cft */ + write_config_node(res.cft->root, buffer_line, &res); + buffer_rewrite(&res.buffer, "%s\n\n", NULL); } write_buffer(b->client.socket_fd, res.buffer, strlen(res.buffer)); @@ -318,6 +338,9 @@ void daemon_start(daemon_state s) if (!s.foreground) kill(getppid(), SIGTERM); + if (s.daemon_init) + s.daemon_init(&s); + while (!_shutdown_requested && !failed) { int status; fd_set in; @@ -333,6 +356,9 @@ void daemon_start(daemon_state s) if (s.socket_fd >= 0) unlink(s.socket_path); + if (s.daemon_fini) + s.daemon_fini(&s); + syslog(LOG_NOTICE, "%s shutting down", s.name); closelog(); remove_lockfile(s.pidfile); diff --git a/daemons/common/daemon-server.h b/daemons/common/daemon-server.h index 92f354b02..a789fe31e 100644 --- a/daemons/common/daemon-server.h +++ b/daemons/common/daemon-server.h @@ -45,10 +45,14 @@ struct daemon_state; response daemon_reply_simple(char *id, ...); static inline int daemon_request_int(request r, const char *path, int def) { + if (!r.cft) + return def; return find_config_int(r.cft->root, path, def); } static inline const char *daemon_request_str(request r, const char *path, const char *def) { + if (!r.cft) + return def; return find_config_str(r.cft->root, path, def); } @@ -77,7 +81,8 @@ typedef struct daemon_state { const char *socket_path; int log_level; handle_request handler; - int (*setup_post)(struct daemon_state *st); + int (*daemon_init)(struct daemon_state *st); + int (*daemon_fini)(struct daemon_state *st); /* Global runtime info maintained by the framework. */ int socket_fd; -- 2.43.5