public inbox for lvm2-cvs@sourceware.org help / color / mirror / Atom feed
From: mornfall@sourceware.org To: lvm-devel@redhat.com, lvm2-cvs@sourceware.org Subject: LVM2/daemons common/daemon-client.c common/dae ... Date: Thu, 23 Feb 2012 23:52:00 -0000 [thread overview] Message-ID: <20120223235213.28670.qmail@sourceware.org> (raw) CVSROOT: /cvs/lvm2 Module name: LVM2 Changes by: mornfall@sourceware.org 2012-02-23 23:52:12 Modified files: daemons/common : daemon-client.c daemon-client.h daemon-server.c daemon-server.h daemons/lvmetad: lvmetad-client.h lvmetad-core.c Log message: Couple of improvements in the daemon (common + lvmetad) code: - some client-side memory leak fixes - announce and check protocols and protocol versions Patches: http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/common/daemon-client.c.diff?cvsroot=lvm2&r1=1.12&r2=1.13 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/common/daemon-client.h.diff?cvsroot=lvm2&r1=1.9&r2=1.10 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/common/daemon-server.c.diff?cvsroot=lvm2&r1=1.16&r2=1.17 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/common/daemon-server.h.diff?cvsroot=lvm2&r1=1.12&r2=1.13 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/lvmetad/lvmetad-client.h.diff?cvsroot=lvm2&r1=1.8&r2=1.9 http://sourceware.org/cgi-bin/cvsweb.cgi/LVM2/daemons/lvmetad/lvmetad-core.c.diff?cvsroot=lvm2&r1=1.39&r2=1.40 --- LVM2/daemons/common/daemon-client.c 2012/02/15 09:14:54 1.12 +++ LVM2/daemons/common/daemon-client.c 2012/02/23 23:52:11 1.13 @@ -9,7 +9,7 @@ #include <errno.h> // ENOMEM daemon_handle daemon_open(daemon_info i) { - daemon_handle h = { .protocol = 0 }; + daemon_handle h = { .protocol_version = 0 }; struct sockaddr_un sockaddr; if ((h.socket_fd = socket(PF_UNIX, SOCK_STREAM /* | SOCK_NONBLOCK */, 0)) < 0) { @@ -24,10 +24,28 @@ perror("connect"); goto error; } + + daemon_reply r = daemon_send_simple(h, "hello", NULL); + if (r.error || strcmp(daemon_reply_str(r, "response", "unknown"), "OK")) + goto error; + + h.protocol = daemon_reply_str(r, "protocol", NULL); + if (h.protocol) + h.protocol = dm_strdup(h.protocol); /* keep around */ + h.protocol_version = daemon_reply_int(r, "version", 0); + + if (i.protocol && (!h.protocol || strcmp(h.protocol, i.protocol))) + goto error; + if (i.protocol_version && h.protocol_version != i.protocol_version) + goto error; + + daemon_reply_destroy(r); return h; error: if (h.socket_fd >= 0) close(h.socket_fd); + if (r.cft) + daemon_reply_destroy(r); h.socket_fd = -1; return h; } @@ -43,6 +61,7 @@ assert(rq.buffer); write_buffer(h.socket_fd, rq.buffer, strlen(rq.buffer)); + dm_free(rq.buffer); if (read_buffer(h.socket_fd, &reply.buffer)) { reply.cft = dm_config_from_string(reply.buffer); @@ -55,6 +74,7 @@ void daemon_reply_destroy(daemon_reply r) { if (r.cft) dm_config_destroy(r.cft); + dm_free(r.buffer); } daemon_reply daemon_send_simple(daemon_handle h, const char *id, ...) @@ -72,10 +92,10 @@ return err; repl = daemon_send(h, rq); - dm_free(rq.buffer); return repl; } void daemon_close(daemon_handle h) { + dm_free((char *)h.protocol); } --- LVM2/daemons/common/daemon-client.h 2012/01/15 15:16:50 1.9 +++ LVM2/daemons/common/daemon-client.h 2012/02/23 23:52:11 1.10 @@ -19,13 +19,21 @@ typedef struct { int socket_fd; /* the fd we use to talk to the daemon */ - int protocol; /* version of the protocol the daemon uses */ + const char *protocol; + int protocol_version; /* version of the protocol the daemon uses */ } daemon_handle; typedef struct { const char *path; /* the binary of the daemon */ const char *socket; /* path to the comms socket */ unsigned autostart:1; /* start the daemon if not running? */ + + /* + * If the following are not NULL/0, an attempt to talk to a daemon which + * uses a different protocol or version will fail. + */ + const char *protocol; + int protocol_version; } daemon_info; typedef struct { --- LVM2/daemons/common/daemon-server.c 2012/01/25 21:30:27 1.16 +++ LVM2/daemons/common/daemon-server.c 2012/02/23 23:52:11 1.17 @@ -239,6 +239,19 @@ return 0; } +static response builtin_handler(daemon_state s, client_handle h, request r) +{ + const char *rq = daemon_request_str(r, "request", "NONE"); + + if (!strcmp(rq, "hello")) { + return daemon_reply_simple("OK", "protocol = %s", s.protocol ?: "default", + "version = %d", s.protocol_version, NULL); + } + + response res = { .buffer = NULL, .error = EPROTO }; + return res; +} + static void *client_thread(void *baton) { struct thread_baton *b = baton; @@ -252,7 +265,11 @@ req.cft = dm_config_from_string(req.buffer); if (!req.cft) fprintf(stderr, "error parsing request:\n %s\n", req.buffer); - res = b->s.handler(b->s, b->client, req); + + res = builtin_handler(b->s, b->client, req); + + if (res.error == EPROTO) /* Not a builtin, delegate to the custom handler. */ + res = b->s.handler(b->s, b->client, req); if (!res.buffer) { dm_config_write_node(res.cft->root, buffer_line, &res); --- LVM2/daemons/common/daemon-server.h 2011/09/01 13:25:50 1.12 +++ LVM2/daemons/common/daemon-server.h 2012/02/23 23:52:11 1.13 @@ -78,6 +78,9 @@ const char *name; const char *pidfile; const char *socket_path; + const char *protocol; + int protocol_version; + int log_level; handle_request handler; int (*daemon_init)(struct daemon_state *st); --- LVM2/daemons/lvmetad/lvmetad-client.h 2012/02/23 17:59:32 1.8 +++ LVM2/daemons/lvmetad/lvmetad-client.h 2012/02/23 23:52:11 1.9 @@ -64,6 +64,8 @@ daemon_info lvmetad_info = { .path = "lvmetad", .socket = socket ?: DEFAULT_RUN_DIR "/lvmetad.socket", + .protocol = "lvmetad", + .protocol_version = 1, .autostart = 0 }; --- LVM2/daemons/lvmetad/lvmetad-core.c 2012/02/23 17:59:32 1.39 +++ LVM2/daemons/lvmetad/lvmetad-core.c 2012/02/23 23:52:11 1.40 @@ -984,6 +984,8 @@ s.socket_path = DEFAULT_RUN_DIR "/lvmetad.socket"; s.pidfile = DEFAULT_RUN_DIR "/lvmetad.pid"; s.log_level = 0; + s.protocol = "lvmetad"; + s.protocol_version = 1; // use getopt_long while ((opt = getopt(argc, argv, "?fhVdRs:")) != EOF) {
next reply other threads:[~2012-02-23 23:52 UTC|newest] Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top 2012-02-23 23:52 mornfall [this message] -- strict thread matches above, loose matches on Subject: below -- 2011-06-27 13:58 mornfall 2011-06-27 13:46 mornfall
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20120223235213.28670.qmail@sourceware.org \ --to=mornfall@sourceware.org \ --cc=lvm-devel@redhat.com \ --cc=lvm2-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).