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) {


             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: link
Be 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).