All of lore.kernel.org
 help / color / mirror / Atom feed
* device-mapper ./WHATS_NEW dmeventd/.exported_s ...
@ 2007-01-15 18:21 agk
  0 siblings, 0 replies; 3+ messages in thread
From: agk @ 2007-01-15 18:21 UTC (permalink / raw)
  To: dm-cvs, dm-devel

CVSROOT:	/cvs/dm
Module name:	device-mapper
Changes by:	agk@sourceware.org	2007-01-15 18:21:02

Modified files:
	.              : WHATS_NEW 
	dmeventd       : .exported_symbols dmeventd.c 
	                 libdevmapper-event.c libdevmapper-event.h 
	lib            : .exported_symbols libdevmapper.h libdm-string.c 

Log message:
	More libdevmapper-event interface changes and fixes.
	Rename dm_saprintf() to dm_asprintf().

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.146&r2=1.147
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/.exported_symbols.diff?cvsroot=dm&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.28&r2=1.29
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.c.diff?cvsroot=dm&r1=1.12&r2=1.13
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.h.diff?cvsroot=dm&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/.exported_symbols.diff?cvsroot=dm&r1=1.26&r2=1.27
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdevmapper.h.diff?cvsroot=dm&r1=1.62&r2=1.63
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-string.c.diff?cvsroot=dm&r1=1.5&r2=1.6

--- device-mapper/WHATS_NEW	2007/01/15 14:39:11	1.146
+++ device-mapper/WHATS_NEW	2007/01/15 18:21:01	1.147
@@ -1,5 +1,7 @@
 Version 1.02.15 -
 ===================================
+  More libdevmapper-event interface changes and fixes.
+  Rename dm_saprintf() to dm_asprintf().
   Report error if NULL pointer is supplied to dm_strdup_aux().
   Reinstate dm_event_get_registered_device.
 
--- device-mapper/dmeventd/.exported_symbols	2007/01/12 20:22:11	1.6
+++ device-mapper/dmeventd/.exported_symbols	2007/01/15 18:21:01	1.7
@@ -1,17 +1,17 @@
 dm_event_handler_create
 dm_event_handler_destroy
 dm_event_handler_set_dso
-dm_event_handler_set_name
+dm_event_handler_set_devname
 dm_event_handler_set_uuid
 dm_event_handler_set_major
 dm_event_handler_set_minor
-dm_event_handler_set_events
+dm_event_handler_set_event_mask
 dm_event_handler_get_dso
-dm_event_handler_get_name
+dm_event_handler_get_devname
 dm_event_handler_get_uuid
 dm_event_handler_get_major
 dm_event_handler_get_minor
-dm_event_handler_get_events
-dm_event_register
-dm_event_unregister
+dm_event_handler_get_event_mask
+dm_event_register_handler
+dm_event_unregister_handler
 dm_event_get_registered_device
--- device-mapper/dmeventd/dmeventd.c	2007/01/11 21:54:52	1.28
+++ device-mapper/dmeventd/dmeventd.c	2007/01/15 18:21:01	1.29
@@ -96,7 +96,7 @@
 	 * DM_DEVICE_STATUS). It should not destroy it.
 	 * The caller must dispose of the task.
 	 */
-	void (*process_event)(struct dm_task *dmt, enum dm_event_type event);
+	void (*process_event)(struct dm_task *dmt, enum dm_event_mask event);
 
 	/*
 	 * Device registration.
@@ -127,7 +127,7 @@
 	char *device_uuid;	/* Mapped device path. */
 	union {
 		char *str;	/* Events string as fetched from message. */
-		enum dm_event_type field;	/* Events bitfield. */
+		enum dm_event_mask field;	/* Events bitfield. */
 	} events;
 	union {
 		char *str;
@@ -157,8 +157,8 @@
 	uint32_t event_nr;	/* event number */
 	int processing;		/* Set when event is being processed */
 	int status;		/* running/shutdown/done */
-	enum dm_event_type events;	/* bitfield for event filter. */
-	enum dm_event_type current_events;	/* bitfield for occured events. */
+	enum dm_event_mask events;	/* bitfield for event filter. */
+	enum dm_event_mask current_events;	/* bitfield for occured events. */
 	struct dm_task *current_task;
 	time_t next_time;
 	uint32_t timeout;
@@ -291,7 +291,7 @@
 	    fetch_string(&message_data->events.str, &p) &&
 	    fetch_string(&message_data->timeout.str, &p)) {
 		if (message_data->events.str) {
-			enum dm_event_type i = atoi(message_data->events.str);
+			enum dm_event_mask i = atoi(message_data->events.str);
 
 			/*
 			 * Free string representaion of events.
@@ -775,7 +775,7 @@
 		syslog(LOG_ERR, "dmeventd %s dlopen failed: %s", data->dso_name,
 		       dlerr);
 		data->msg->size =
-		    dm_saprintf(&(data->msg->data), "%s dlopen failed: %s",
+		    dm_asprintf(&(data->msg->data), "%s dlopen failed: %s",
 				data->dso_name, dlerr);
 		return NULL;
 	}
@@ -954,7 +954,7 @@
 	if (msg->data)
 		dm_free(msg->data);
 
-	msg->size = dm_saprintf(&(msg->data), fmt, dso, dev, events);
+	msg->size = dm_asprintf(&(msg->data), fmt, dso, dev, events);
 
 	unlock_mutex();
 
@@ -1049,7 +1049,7 @@
 	lock_mutex();
 	if ((thread = lookup_thread_status(message_data))) {
 		msg->size =
-		    dm_saprintf(&(msg->data), "%" PRIu32, thread->timeout);
+		    dm_asprintf(&(msg->data), "%" PRIu32, thread->timeout);
 	} else {
 		msg->data = NULL;
 		msg->size = 0;
--- device-mapper/dmeventd/libdevmapper-event.c	2007/01/12 20:22:11	1.12
+++ device-mapper/dmeventd/libdevmapper-event.c	2007/01/15 18:21:01	1.13
@@ -32,108 +32,114 @@
 
 struct dm_event_handler {
 	const char *dso;
-	const char *device;
+
+	const char *devname;
+
 	const char *uuid;
 	int major;
 	int minor;
-	enum dm_event_type events;
+
+	enum dm_event_mask mask;
 };
 
-static void dm_event_handler_clear_device(struct dm_event_handler *h)
+static void dm_event_handler_clear_devname(struct dm_event_handler *dmevh)
 {
-	h->device = h->uuid = NULL;
-	h->major = h->minor = 0;
+	dmevh->devname = dmevh->uuid = NULL;
+	dmevh->major = dmevh->minor = 0;
 }
 
 struct dm_event_handler *dm_event_handler_create(void)
 {
-	struct dm_event_handler *ret = 0;
+	struct dm_event_handler *dmevh = NULL;
 
-	if (!(ret = dm_malloc(sizeof(*ret))))
+	if (!(dmevh = dm_malloc(sizeof(*dmevh))))
 		return NULL;
 
-	ret->dso = ret->device = ret->uuid = NULL;
-	ret->major = ret->minor = 0;
-	ret->events = 0;
+	dmevh->dso = dmevh->devname = dmevh->uuid = NULL;
+	dmevh->major = dmevh->minor = 0;
+	dmevh->mask = 0;
 
-	return ret;
+	return dmevh;
 }
 
-void dm_event_handler_destroy(struct dm_event_handler *h)
+void dm_event_handler_destroy(struct dm_event_handler *dmevh)
 {
-	dm_free(h);
+	dm_free(dmevh);
 }
 
-void dm_event_handler_set_dso(struct dm_event_handler *h, const char *path)
+void dm_event_handler_set_dso(struct dm_event_handler *dmevh, const char *path)
 {
-	h->dso = path;
+	dmevh->dso = path;
 }
 
-void dm_event_handler_set_name(struct dm_event_handler *h, const char *name)
+void dm_event_handler_set_devname(struct dm_event_handler *dmevh, const char *devname)
 {
-	dm_event_handler_clear_device(h);
-	h->device = name;
+	dm_event_handler_clear_devname(dmevh);
+
+	dmevh->devname = devname;
 }
 
-void dm_event_handler_set_uuid(struct dm_event_handler *h, const char *uuid)
+void dm_event_handler_set_uuid(struct dm_event_handler *dmevh, const char *uuid)
 {
-	dm_event_handler_clear_device(h);
-	h->uuid = uuid;
+	dm_event_handler_clear_devname(dmevh);
+
+	dmevh->uuid = uuid;
 }
 
-void dm_event_handler_set_major(struct dm_event_handler *h, int major)
+void dm_event_handler_set_major(struct dm_event_handler *dmevh, int major)
 {
-	int minor = h->minor;
+	int minor = dmevh->minor;
 
-	dm_event_handler_clear_device(h);
-	h->major = major;
-	h->minor = minor;
+	dm_event_handler_clear_devname(dmevh);
+
+	dmevh->major = major;
+	dmevh->minor = minor;
 }
 
-void dm_event_handler_set_minor(struct dm_event_handler *h, int minor)
+void dm_event_handler_set_minor(struct dm_event_handler *dmevh, int minor)
 {
-	int major = h->major;
+	int major = dmevh->major;
 
-	dm_event_handler_clear_device(h);
+	dm_event_handler_clear_devname(dmevh);
 
-	h->major = major;
-	h->minor = minor;
+	dmevh->major = major;
+	dmevh->minor = minor;
 }
 
-void dm_event_handler_set_events(struct dm_event_handler *h,
-				 enum dm_event_type event)
+void dm_event_handler_set_event_mask(struct dm_event_handler *dmevh,
+				     enum dm_event_mask evmask)
 {
-	h->events = event;
+	dmevh->mask = evmask;
 }
 
-const char *dm_event_handler_get_dso(const struct dm_event_handler *h)
+const char *dm_event_handler_get_dso(const struct dm_event_handler *dmevh)
 {
-	return h->dso;
+	return dmevh->dso;
 }
 
-const char *dm_event_handler_get_name(const struct dm_event_handler *h)
+const char *dm_event_handler_get_devname(const struct dm_event_handler *dmevh)
 {
-	return h->device;
+	return dmevh->devname;
 }
 
-const char *dm_event_handler_get_uuid(const struct dm_event_handler *h)
+const char *dm_event_handler_get_uuid(const struct dm_event_handler *dmevh)
 {
-	return h->uuid;
+	return dmevh->uuid;
 }
 
-int dm_event_handler_get_major(const struct dm_event_handler *h)
+int dm_event_handler_get_major(const struct dm_event_handler *dmevh)
 {
-	return h->major;
+	return dmevh->major;
 }
 
-int dm_event_handler_get_minor(const struct dm_event_handler *h)
+int dm_event_handler_get_minor(const struct dm_event_handler *dmevh)
 {
-	return h->minor;
+	return dmevh->minor;
 }
 
-enum dm_event_type dm_event_handler_get_events(const struct dm_event_handler *h)
+enum dm_event_mask dm_event_handler_get_event_mask(const struct dm_event_handler *dmevh)
 {
-	return h->events;
+	return dmevh->mask;
 }
 
 /*
@@ -145,8 +151,8 @@
  *
  * Returns: 0 on failure, 1 on success
  */
-static int daemon_read(struct dm_event_fifos *fifos,
-		       struct dm_event_daemon_message *msg)
+static int _daemon_read(struct dm_event_fifos *fifos,
+			struct dm_event_daemon_message *msg)
 {
 	unsigned bytes = 0;
 	int ret, i;
@@ -205,8 +211,8 @@
 }
 
 /* Write message to daemon. */
-static int daemon_write(struct dm_event_fifos *fifos,
-			struct dm_event_daemon_message *msg)
+static int _daemon_write(struct dm_event_fifos *fifos,
+			 struct dm_event_daemon_message *msg)
 {
 	unsigned bytes = 0;
 	int ret = 0;
@@ -248,13 +254,13 @@
 	return bytes == size;
 }
 
-static int daemon_talk(struct dm_event_fifos *fifos,
-		       struct dm_event_daemon_message *msg, int cmd,
-		       const char *dso_name, const char *device,
-		       enum dm_event_type events, uint32_t timeout)
+static int _daemon_talk(struct dm_event_fifos *fifos,
+			struct dm_event_daemon_message *msg, int cmd,
+			const char *dso_name, const char *devname,
+			enum dm_event_mask evmask, uint32_t timeout)
 {
 	const char *dso = dso_name ? dso_name : "";
-	const char *dev = device ? device : "";
+	const char *dev = devname ? devname : "";
 	const char *fmt = "%s %s %u %" PRIu32;
 	memset(msg, 0, sizeof(*msg));
 
@@ -263,18 +269,21 @@
 	 * into ASCII message string.
 	 */
 	msg->cmd = cmd;
-	msg->size = dm_saprintf(&(msg->data), fmt, dso, dev, events, timeout);
+	if ((msg->size = dm_asprintf(&(msg->data), fmt, dso, dev, evmask,
+				     timeout)) < 0) {
+		log_error("_daemon_talk: message allocation failed");
+	}
 
 	/*
 	 * Write command and message to and
 	 * read status return code from daemon.
 	 */
-	if (!daemon_write(fifos, msg)) {
+	if (!_daemon_write(fifos, msg)) {
 		stack;
 		return -EIO;
 	}
 
-	if (!daemon_read(fifos, msg)) {
+	if (!_daemon_read(fifos, msg)) {
 		stack;
 		return -EIO;
 	}
@@ -294,7 +303,7 @@
  *
  * Returns: 1 on success, 0 otherwise
  */
-static int start_daemon(struct dm_event_fifos *fifos)
+static int _start_daemon(struct dm_event_fifos *fifos)
 {
 	int pid, ret = 0;
 	int status;
@@ -349,7 +358,7 @@
 }
 
 /* Initialize client. */
-static int init_client(struct dm_event_fifos *fifos)
+static int _init_client(struct dm_event_fifos *fifos)
 {
 	/* FIXME? Is fifo the most suitable method? Why not share
 	   comms/daemon code with something else e.g. multipath? */
@@ -359,7 +368,7 @@
 	fifos->client_path = DM_EVENT_FIFO_CLIENT;
 	fifos->server_path = DM_EVENT_FIFO_SERVER;
 
-	if (!start_daemon(fifos)) {
+	if (!_start_daemon(fifos)) {
 		stack;
 		return 0;
 	}
@@ -391,7 +400,7 @@
 	return 1;
 }
 
-static void dtr_client(struct dm_event_fifos *fifos)
+static void _dtr_client(struct dm_event_fifos *fifos)
 {
 	if (flock(fifos->server, LOCK_UN))
 		log_error("flock unlock %s", fifos->server_path);
@@ -400,76 +409,91 @@
 	close(fifos->server);
 }
 
-/* Get uuid of a device, if it exists (otherwise NULL). */
-static struct dm_task *get_device_info(const struct dm_event_handler *h)
+/* Get uuid of a device */
+static struct dm_task *_get_device_info(const struct dm_event_handler *dmevh)
 {
-	struct dm_task *dmt = dm_task_create(DM_DEVICE_INFO);
-	struct dm_task *ret;
+	struct dm_task *dmt;
+	struct dm_info info;
 
-	if (!dmt)
+	if (!(dmt = dm_task_create(DM_DEVICE_INFO))) {
+		log_error("_get_device_info: dm_task creation for info failed");
 		return NULL;
+	}
 
-	if (h->uuid)
-		dm_task_set_uuid(dmt, h->uuid);
-	else if (h->device)
-		dm_task_set_name(dmt, h->device);
-	else if (h->major && h->minor) {
-		dm_task_set_major(dmt, h->major);
-		dm_task_set_minor(dmt, h->minor);
+	if (dmevh->uuid)
+		dm_task_set_uuid(dmt, dmevh->uuid);
+	else if (dmevh->devname)
+		dm_task_set_name(dmt, dmevh->devname);
+	else if (dmevh->major && dmevh->minor) {
+		dm_task_set_major(dmt, dmevh->major);
+		dm_task_set_minor(dmt, dmevh->minor);
+
+	/* FIXME Add name or uuid or devno to messages */
+	if (!dm_task_run(dmt)) {
+		log_error("_get_device_info: dm_task_run() failed");
+		goto failed;
 	}
 
-	if (!dm_task_run(dmt))
-		ret = NULL;
-	else
-		ret = dmt;
+	if (!dm_task_get_info(dmt, &info))
+		log_error("_get_device_info: failed to get info for device");
+		goto failed;
+	}
 
-	return ret;
+	if (!info.exists) {
+		log_error("_get_device_info: device not found");
+		goto failed;
+	}
+
+	return dmt;
+
+failed:
+	dm_task_destroy(dmt);
+	return NULL;
 }
 
 /* Handle the event (de)registration call and return negative error codes. */
-static int do_event(int cmd, struct dm_event_daemon_message *msg,
-		    const char *dso_name, const char *device,
-		    enum dm_event_type events, uint32_t timeout)
+static int _do_event(int cmd, struct dm_event_daemon_message *msg,
+		    const char *dso_name, const char *devname,
+		    enum dm_event_mask evmask, uint32_t timeout)
 {
 	int ret;
 	struct dm_event_fifos fifos;
 
-	if (!init_client(&fifos)) {
+	if (!_init_client(&fifos)) {
 		stack;
 		return -ESRCH;
 	}
 
-	ret = daemon_talk(&fifos, msg, cmd, dso_name, device, events, timeout);
+	ret = _daemon_talk(&fifos, msg, cmd, dso_name, devname, evmask, timeout);
 
 	/* what is the opposite of init? */
-	dtr_client(&fifos);
+	_dtr_client(&fifos);
 
 	return ret;
 }
 
 /* External library interface. */
-int dm_event_register(const struct dm_event_handler *h)
+int dm_event_register_handler(const struct dm_event_handler *dmevh)
 {
-	int ret, err;
+	int ret = 1, err;
 	const char *uuid;
 	struct dm_task *dmt;
 	struct dm_event_daemon_message msg;
 
-	if (!(dmt = get_device_info(h))) {
-		log_error("%s: device not found", h->device);
+	if (!(dmt = _get_device_info(dmevh))) {
+		stack;
 		return 0;
 	}
 
 	uuid = dm_task_get_uuid(dmt);
 
-	if ((err = do_event(DM_EVENT_CMD_REGISTER_FOR_EVENT, &msg,
-			    h->dso, uuid, h->events, 0)) < 0) {
+	if ((err = _do_event(DM_EVENT_CMD_REGISTER_FOR_EVENT, &msg,
+			     dmevh->dso, uuid, dmevh->mask, 0)) < 0) {
 		log_error("%s: event registration failed: %s",
 			  dm_task_get_name(dmt),
 			  msg.data ? msg.data : strerror(-err));
 		ret = 0;
-	} else
-		ret = 1;
+	}
 
 	if (msg.data)
 		dm_free(msg.data);
@@ -479,28 +503,27 @@
 	return ret;
 }
 
-int dm_event_unregister(const struct dm_event_handler *h)
+int dm_event_unregister_handler(const struct dm_event_handler *dmevh)
 {
-	int ret, err;
+	int ret = 1, err;
 	const char *uuid;
 	struct dm_task *dmt;
 	struct dm_event_daemon_message msg;
 
-	if (!(dmt = get_device_info(h))) {
-		log_error("%s: device not found", dm_task_get_name(dmt));
+	if (!(dmt = _get_device_info(dmevh))) {
+		stack;
 		return 0;
 	}
 
 	uuid = dm_task_get_uuid(dmt);
 
-	if ((err = do_event(DM_EVENT_CMD_UNREGISTER_FOR_EVENT, &msg,
-			    h->dso, uuid, h->events, 0)) < 0) {
+	if ((err = _do_event(DM_EVENT_CMD_UNREGISTER_FOR_EVENT, &msg,
+			    dmevh->dso, uuid, dmevh->mask, 0)) < 0) {
 		log_error("%s: event deregistration failed: %s",
 			  dm_task_get_name(dmt),
 			  msg.data ? msg.data : strerror(-err));
 		ret = 0;
-	} else
-		ret = 1;
+	}
 
 	if (msg.data)
 		dm_free(msg.data);
@@ -511,9 +534,8 @@
 }
 
 /* Fetch a string off src and duplicate it into *dest. */
-/* FIXME: move to seperate module to share with the daemon. */
-static const char delimiter = ' ';
-static char *fetch_string(char **src)
+/* FIXME: move to separate module to share with the daemon. */
+static char *_fetch_string(char **src, const char delimiter)
 {
 	char *p, *ret;
 
@@ -530,13 +552,14 @@
 }
 
 /* Parse a device message from the daemon. */
-static int parse_message(struct dm_event_daemon_message *msg, char **dso_name,
-			 char **device, enum dm_event_type *events)
+static int _parse_message(struct dm_event_daemon_message *msg, char **dso_name,
+			 char **devname, enum dm_event_mask *evmask)
 {
 	char *p = msg->data;
 
-	if ((*dso_name = fetch_string(&p)) && (*device = fetch_string(&p))) {
-		*events = atoi(p);
+	if ((*dso_name = _fetch_string(&p, ' ')) &&
+	    (*devname = _fetch_string(&p, ' '))) {
+		*evmask = atoi(p);
 
 		return 0;
 	}
@@ -548,7 +571,7 @@
  * dm_event_get_registered_device
  * @dso_name
  * @device_path
- * @events
+ * @mask
  * @next
  *
  * FIXME: This function sucks.
@@ -556,17 +579,17 @@
  * Returns: 1 if device found, 0 otherwise (even on error)
  */
 int dm_event_get_registered_device(char **dso_name, char **device_path,
-				   enum dm_event_type *events, int next)
+				   enum dm_event_mask *mask, int next)
 {
 	int ret;
 	char *dso_name_arg = NULL, *device_path_arg = NULL;
 	struct dm_event_daemon_message msg;
 
-	if (!(ret = do_event(next ? DM_EVENT_CMD_GET_NEXT_REGISTERED_DEVICE :
+	if (!(ret = _do_event(next ? DM_EVENT_CMD_GET_NEXT_REGISTERED_DEVICE :
 			     DM_EVENT_CMD_GET_REGISTERED_DEVICE,
-			     &msg, *dso_name, *device_path, *events, 0))) {
-		ret = !parse_message(&msg, &dso_name_arg, &device_path_arg,
-				     events);
+			     &msg, *dso_name, *device_path, *mask, 0))) {
+		ret = !_parse_message(&msg, &dso_name_arg, &device_path_arg,
+				     mask);
 	} else			/* FIXME: Make sure this is ENOENT */
 		ret = 0;
 
@@ -598,7 +621,7 @@
 
 	if (!device_exists(device_path))
 		return -ENODEV;
-	return do_event(DM_EVENT_CMD_SET_TIMEOUT, &msg,
+	return _do_event(DM_EVENT_CMD_SET_TIMEOUT, &msg,
 			NULL, device_path, 0, timeout);
 }
 
@@ -609,7 +632,7 @@
 
 	if (!device_exists(device_path))
 		return -ENODEV;
-	if (!(ret = do_event(DM_EVENT_CMD_GET_TIMEOUT, &msg, NULL, device_path,
+	if (!(ret = _do_event(DM_EVENT_CMD_GET_TIMEOUT, &msg, NULL, device_path,
 			     0, 0)))
 		*timeout = atoi(msg.data);
 	if (msg.data)
--- device-mapper/dmeventd/libdevmapper-event.h	2007/01/12 20:22:11	1.6
+++ device-mapper/dmeventd/libdevmapper-event.h	2007/01/15 18:21:01	1.7
@@ -23,8 +23,11 @@
 
 #include <stdint.h>
 
-/* Event type definitions. */
-enum dm_event_type {
+/*
+ * Event library interface.
+ */
+
+enum dm_event_mask {
 	DM_EVENT_SETTINGS_MASK  = 0x0000FF,
 	DM_EVENT_SINGLE		= 0x000001, /* Report multiple errors just once. */
 	DM_EVENT_MULTI		= 0x000002, /* Report all of them. */
@@ -33,7 +36,7 @@
 	DM_EVENT_SECTOR_ERROR	= 0x000100, /* Failure on a particular sector. */
 	DM_EVENT_DEVICE_ERROR	= 0x000200, /* Device failure. */
 	DM_EVENT_PATH_ERROR	= 0x000400, /* Failure on an io path. */
-	DM_EVENT_ADAPTOR_ERROR	= 0x000800, /* Failure off a host adaptor. */
+	DM_EVENT_ADAPTOR_ERROR	= 0x000800, /* Failure of a host adaptor. */
 
 	DM_EVENT_STATUS_MASK    = 0xFF0000,
 	DM_EVENT_SYNC_STATUS	= 0x010000, /* Mirror synchronization completed/failed. */
@@ -44,54 +47,55 @@
 
 #define DM_EVENT_ALL_ERRORS DM_EVENT_ERROR_MASK
 
-/* Prototypes for event lib interface. */
-
 struct dm_event_handler;
 
-/* Create and destroy dm_event_handler struct, which is passed to
-   register/unregister functions below */
 struct dm_event_handler *dm_event_handler_create(void);
-void dm_event_handler_destroy(struct dm_event_handler *h);
+void dm_event_handler_destroy(struct dm_event_handler *dmevh);
 
-/* Set parameters of a handler:
-   - dso - shared library path to handle the events
-   (only one of the following three needs to be set)
-   - name - device name or path
-   - uuid - device uuid
-   - major and minor - device major/minor numbers
-   - events - a bitfield defining which events to handle (see
-              enum dm_event_type above)
-*/
-void dm_event_handler_set_dso(struct dm_event_handler *h, const char *path);
-void dm_event_handler_set_name(struct dm_event_handler *h, const char *name);
-void dm_event_handler_set_uuid(struct dm_event_handler *h, const char *uuid);
-void dm_event_handler_set_major(struct dm_event_handler *h, int major);
-void dm_event_handler_set_minor(struct dm_event_handler *h, int minor);
-void dm_event_handler_set_events(struct dm_event_handler *h,
-				 enum dm_event_type event);
-
-/* Get parameters of a handler, same as above */
-const char *dm_event_handler_get_dso(const struct dm_event_handler *h);
-const char *dm_event_handler_get_name(const struct dm_event_handler *h);
-const char *dm_event_handler_get_uuid(const struct dm_event_handler *h);
-int dm_event_handler_get_major(const struct dm_event_handler *h);
-int dm_event_handler_get_minor(const struct dm_event_handler *h);
-enum dm_event_type dm_event_handler_get_events(const struct dm_event_handler *h);
+/*
+ * Path of shared library to handle events.
+ */
+void dm_event_handler_set_dso(struct dm_event_handler *dmevh, const char *path);
+
+/*
+ * Identify the device to monitor by exactly one of
+ * devname, uuid or device number.
+ */
+void dm_event_handler_set_devname(struct dm_event_handler *dmevh, const char *devname);
+
+void dm_event_handler_set_uuid(struct dm_event_handler *dmevh, const char *uuid);
+
+void dm_event_handler_set_major(struct dm_event_handler *dmevh, int major);
+void dm_event_handler_set_minor(struct dm_event_handler *dmevh, int minor);
+
+/*
+ * Specify mask for events to monitor.
+ */
+void dm_event_handler_set_event_mask(struct dm_event_handler *dmevh,
+				     enum dm_event_mask evmask);
+
+const char *dm_event_handler_get_dso(const struct dm_event_handler *dmevh);
+const char *dm_event_handler_get_devname(const struct dm_event_handler *dmevh);
+const char *dm_event_handler_get_uuid(const struct dm_event_handler *dmevh);
+int dm_event_handler_get_major(const struct dm_event_handler *dmevh);
+int dm_event_handler_get_minor(const struct dm_event_handler *dmevh);
+enum dm_event_mask dm_event_handler_get_event_mask(const struct dm_event_handler *dmevh);
 
-/* FIXME */
+/* FIXME Review interface */
 int dm_event_get_registered_device(char **dso_name, char **device_path,
-				   enum dm_event_type *events, int next);
+				   enum dm_event_mask *evmask, int next);
 
-/* Call out to dmeventd to register or unregister a handler. If
-   dmeventd is not running, it is spawned first. */
-int dm_event_register(const struct dm_event_handler *h);
-int dm_event_unregister(const struct dm_event_handler *h);
+/*
+ * Initiate monitoring using dmeventd.
+ */
+int dm_event_register_handler(const struct dm_event_handler *dmevh);
+int dm_event_unregister_handler(const struct dm_event_handler *dmevh);
 
 /* Prototypes for DSO interface, see dmeventd.c, struct dso_data for
    detailed descriptions. */
-void process_event(struct dm_task *dmt, enum dm_event_type event);
-int register_device(const char *device, const char *uuid, int major, int minor);
-int unregister_device(const char *device, const char *uuid, int major,
+void process_event(struct dm_task *dmt, enum dm_event_mask evmask);
+int register_device(const char *devname, const char *uuid, int major, int minor);
+int unregister_device(const char *devname, const char *uuid, int major,
 		      int minor);
 
 #endif
--- device-mapper/lib/.exported_symbols	2007/01/11 21:54:53	1.26
+++ device-mapper/lib/.exported_symbols	2007/01/15 18:21:01	1.27
@@ -115,4 +115,4 @@
 dm_split_words
 dm_snprintf
 dm_basename
-dm_saprintf
+dm_asprintf
--- device-mapper/lib/libdevmapper.h	2007/01/11 21:54:53	1.62
+++ device-mapper/lib/libdevmapper.h	2007/01/15 18:21:01	1.63
@@ -626,7 +626,8 @@
 /*
  * Returns size of a buffer which is allocated with dm_malloc.
  * Pointer to the buffer is stored in *buf.
+ * Returns -1 on failure leaving buf undefined.
  */
-int dm_saprintf(char **buf, const char *format, ...);
+int dm_asprintf(char **buf, const char *format, ...);
 
 #endif				/* LIB_DEVICE_MAPPER_H */
--- device-mapper/lib/libdm-string.c	2007/01/11 21:54:53	1.5
+++ device-mapper/lib/libdm-string.c	2007/01/15 18:21:01	1.6
@@ -129,7 +129,7 @@
 	return p ? p + 1 : (char *) path;
 }
 
-int dm_saprintf(char **result, const char *format, ...)
+int dm_asprintf(char **result, const char *format, ...)
 {
 	int n, ok = 0, size = 32;
 	va_list ap;

^ permalink raw reply	[flat|nested] 3+ messages in thread

* device-mapper ./WHATS_NEW dmeventd/.exported_s ...
@ 2007-01-16 18:03 agk
  0 siblings, 0 replies; 3+ messages in thread
From: agk @ 2007-01-16 18:03 UTC (permalink / raw)
  To: dm-cvs, dm-devel

CVSROOT:	/cvs/dm
Module name:	device-mapper
Changes by:	agk@sourceware.org	2007-01-16 18:03:40

Modified files:
	.              : WHATS_NEW 
	dmeventd       : .exported_symbols dmeventd.c 
	                 libdevmapper-event.c libdevmapper-event.h 
	lib            : .exported_symbols Makefile.in libdevmapper.h 

Log message:
	Add basic reporting functions to libdevmapper.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.148&r2=1.149
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/.exported_symbols.diff?cvsroot=dm&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.34&r2=1.35
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.c.diff?cvsroot=dm&r1=1.15&r2=1.16
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.h.diff?cvsroot=dm&r1=1.7&r2=1.8
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/.exported_symbols.diff?cvsroot=dm&r1=1.27&r2=1.28
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/Makefile.in.diff?cvsroot=dm&r1=1.30&r2=1.31
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdevmapper.h.diff?cvsroot=dm&r1=1.63&r2=1.64

--- device-mapper/WHATS_NEW	2007/01/15 22:05:50	1.148
+++ device-mapper/WHATS_NEW	2007/01/16 18:03:39	1.149
@@ -1,5 +1,6 @@
 Version 1.02.15 -
 ===================================
+  Add basic reporting functions to libdevmapper.
   Fix a malloc error path in dmsetup message.
   More libdevmapper-event interface changes and fixes.
   Rename dm_saprintf() to dm_asprintf().
--- device-mapper/dmeventd/.exported_symbols	2007/01/15 18:21:01	1.7
+++ device-mapper/dmeventd/.exported_symbols	2007/01/16 18:03:40	1.8
@@ -1,7 +1,7 @@
 dm_event_handler_create
 dm_event_handler_destroy
 dm_event_handler_set_dso
-dm_event_handler_set_devname
+dm_event_handler_set_dev_name
 dm_event_handler_set_uuid
 dm_event_handler_set_major
 dm_event_handler_set_minor
--- device-mapper/dmeventd/dmeventd.c	2007/01/15 22:37:40	1.34
+++ device-mapper/dmeventd/dmeventd.c	2007/01/16 18:03:40	1.35
@@ -31,8 +31,10 @@
 #include <errno.h>
 #include <pthread.h>
 #include <sys/file.h>
+#include <sys/stat.h>
 #include <sys/wait.h>
-
+#include <sys/time.h>
+#include <sys/resource.h>
 #include <unistd.h>
 #include <arpa/inet.h>		/* for htonl, ntohl */
 
--- device-mapper/dmeventd/libdevmapper-event.c	2007/01/15 19:47:49	1.15
+++ device-mapper/dmeventd/libdevmapper-event.c	2007/01/16 18:03:40	1.16
@@ -33,7 +33,7 @@
 struct dm_event_handler {
 	const char *dso;
 
-	const char *devname;
+	const char *dev_name;
 
 	const char *uuid;
 	int major;
@@ -42,9 +42,9 @@
 	enum dm_event_mask mask;
 };
 
-static void dm_event_handler_clear_devname(struct dm_event_handler *dmevh)
+static void dm_event_handler_clear_dev_name(struct dm_event_handler *dmevh)
 {
-	dmevh->devname = dmevh->uuid = NULL;
+	dmevh->dev_name = dmevh->uuid = NULL;
 	dmevh->major = dmevh->minor = 0;
 }
 
@@ -55,7 +55,7 @@
 	if (!(dmevh = dm_malloc(sizeof(*dmevh))))
 		return NULL;
 
-	dmevh->dso = dmevh->devname = dmevh->uuid = NULL;
+	dmevh->dso = dmevh->dev_name = dmevh->uuid = NULL;
 	dmevh->major = dmevh->minor = 0;
 	dmevh->mask = 0;
 
@@ -72,16 +72,16 @@
 	dmevh->dso = path;
 }
 
-void dm_event_handler_set_devname(struct dm_event_handler *dmevh, const char *devname)
+void dm_event_handler_set_dev_name(struct dm_event_handler *dmevh, const char *dev_name)
 {
-	dm_event_handler_clear_devname(dmevh);
+	dm_event_handler_clear_dev_name(dmevh);
 
-	dmevh->devname = devname;
+	dmevh->dev_name = dev_name;
 }
 
 void dm_event_handler_set_uuid(struct dm_event_handler *dmevh, const char *uuid)
 {
-	dm_event_handler_clear_devname(dmevh);
+	dm_event_handler_clear_dev_name(dmevh);
 
 	dmevh->uuid = uuid;
 }
@@ -90,7 +90,7 @@
 {
 	int minor = dmevh->minor;
 
-	dm_event_handler_clear_devname(dmevh);
+	dm_event_handler_clear_dev_name(dmevh);
 
 	dmevh->major = major;
 	dmevh->minor = minor;
@@ -100,7 +100,7 @@
 {
 	int major = dmevh->major;
 
-	dm_event_handler_clear_devname(dmevh);
+	dm_event_handler_clear_dev_name(dmevh);
 
 	dmevh->major = major;
 	dmevh->minor = minor;
@@ -117,9 +117,9 @@
 	return dmevh->dso;
 }
 
-const char *dm_event_handler_get_devname(const struct dm_event_handler *dmevh)
+const char *dm_event_handler_get_dev_name(const struct dm_event_handler *dmevh)
 {
-	return dmevh->devname;
+	return dmevh->dev_name;
 }
 
 const char *dm_event_handler_get_uuid(const struct dm_event_handler *dmevh)
@@ -256,11 +256,11 @@
 
 static int _daemon_talk(struct dm_event_fifos *fifos,
 			struct dm_event_daemon_message *msg, int cmd,
-			const char *dso_name, const char *devname,
+			const char *dso_name, const char *dev_name,
 			enum dm_event_mask evmask, uint32_t timeout)
 {
 	const char *dso = dso_name ? dso_name : "";
-	const char *dev = devname ? devname : "";
+	const char *dev = dev_name ? dev_name : "";
 	const char *fmt = "%s %s %u %" PRIu32;
 	memset(msg, 0, sizeof(*msg));
 
@@ -421,8 +421,8 @@
 
 	if (dmevh->uuid)
 		dm_task_set_uuid(dmt, dmevh->uuid);
-	else if (dmevh->devname)
-		dm_task_set_name(dmt, dmevh->devname);
+	else if (dmevh->dev_name)
+		dm_task_set_name(dmt, dmevh->dev_name);
 	else if (dmevh->major && dmevh->minor) {
 		dm_task_set_major(dmt, dmevh->major);
 		dm_task_set_minor(dmt, dmevh->minor);
@@ -453,7 +453,7 @@
 
 /* Handle the event (de)registration call and return negative error codes. */
 static int _do_event(int cmd, struct dm_event_daemon_message *msg,
-		    const char *dso_name, const char *devname,
+		    const char *dso_name, const char *dev_name,
 		    enum dm_event_mask evmask, uint32_t timeout)
 {
 	int ret;
@@ -464,7 +464,7 @@
 		return -ESRCH;
 	}
 
-	ret = _daemon_talk(&fifos, msg, cmd, dso_name, devname, evmask, timeout);
+	ret = _daemon_talk(&fifos, msg, cmd, dso_name, dev_name, evmask, timeout);
 
 	/* what is the opposite of init? */
 	_dtr_client(&fifos);
@@ -553,12 +553,12 @@
 
 /* Parse a device message from the daemon. */
 static int _parse_message(struct dm_event_daemon_message *msg, char **dso_name,
-			 char **devname, enum dm_event_mask *evmask)
+			 char **dev_name, enum dm_event_mask *evmask)
 {
 	char *p = msg->data;
 
 	if ((*dso_name = _fetch_string(&p, ' ')) &&
-	    (*devname = _fetch_string(&p, ' '))) {
+	    (*dev_name = _fetch_string(&p, ' '))) {
 		*evmask = atoi(p);
 
 		return 0;
--- device-mapper/dmeventd/libdevmapper-event.h	2007/01/15 18:21:01	1.7
+++ device-mapper/dmeventd/libdevmapper-event.h	2007/01/16 18:03:40	1.8
@@ -59,9 +59,9 @@
 
 /*
  * Identify the device to monitor by exactly one of
- * devname, uuid or device number.
+ * dev_name, uuid or device number.
  */
-void dm_event_handler_set_devname(struct dm_event_handler *dmevh, const char *devname);
+void dm_event_handler_set_dev_name(struct dm_event_handler *dmevh, const char *dev_name);
 
 void dm_event_handler_set_uuid(struct dm_event_handler *dmevh, const char *uuid);
 
@@ -75,7 +75,7 @@
 				     enum dm_event_mask evmask);
 
 const char *dm_event_handler_get_dso(const struct dm_event_handler *dmevh);
-const char *dm_event_handler_get_devname(const struct dm_event_handler *dmevh);
+const char *dm_event_handler_get_dev_name(const struct dm_event_handler *dmevh);
 const char *dm_event_handler_get_uuid(const struct dm_event_handler *dmevh);
 int dm_event_handler_get_major(const struct dm_event_handler *dmevh);
 int dm_event_handler_get_minor(const struct dm_event_handler *dmevh);
@@ -94,8 +94,8 @@
 /* Prototypes for DSO interface, see dmeventd.c, struct dso_data for
    detailed descriptions. */
 void process_event(struct dm_task *dmt, enum dm_event_mask evmask);
-int register_device(const char *devname, const char *uuid, int major, int minor);
-int unregister_device(const char *devname, const char *uuid, int major,
+int register_device(const char *dev_name, const char *uuid, int major, int minor);
+int unregister_device(const char *dev_name, const char *uuid, int major,
 		      int minor);
 
 #endif
--- device-mapper/lib/.exported_symbols	2007/01/15 18:21:01	1.27
+++ device-mapper/lib/.exported_symbols	2007/01/16 18:03:40	1.28
@@ -116,3 +116,14 @@
 dm_snprintf
 dm_basename
 dm_asprintf
+dm_report_init
+dm_report_object
+dm_report_output
+dm_report_free
+dm_report_get_private
+dm_report_field_string
+dm_report_field_int
+dm_report_field_int32
+dm_report_field_uint32
+dm_report_field_uint64
+dm_report_field_set_value
--- device-mapper/lib/Makefile.in	2007/01/11 16:23:22	1.30
+++ device-mapper/lib/Makefile.in	2007/01/16 18:03:40	1.31
@@ -24,6 +24,7 @@
 	libdm-file.c \
 	libdm-deptree.c \
 	libdm-string.c \
+	libdm-report.c \
 	mm/dbg_malloc.c \
 	mm/pool.c \
 	$(interface)/libdm-iface.c
--- device-mapper/lib/libdevmapper.h	2007/01/15 18:21:01	1.63
+++ device-mapper/lib/libdevmapper.h	2007/01/16 18:03:40	1.64
@@ -124,10 +124,10 @@
 };
 
 struct dm_versions {
-        uint32_t next;		/* Offset to next struct from start of this struct */
-        uint32_t version[3];
+	uint32_t next;		/* Offset to next struct from start of this struct */
+	uint32_t version[3];
 
-        char name[0];
+	char name[0];
 };
 
 int dm_get_library_version(char *version, size_t size);
@@ -236,12 +236,12 @@
  * Add a new node to the tree if it doesn't already exist.
  */
 struct dm_tree_node *dm_tree_add_new_dev(struct dm_tree *tree,
-                                            const char *name,
-                                            const char *uuid,
-                                            uint32_t major, uint32_t minor,
-                                            int read_only,
-                                            int clear_inactive,
-                                            void *context);
+					 const char *name,
+					 const char *uuid,
+					 uint32_t major, uint32_t minor,
+					 int read_only,
+					 int clear_inactive,
+					 void *context);
 
 /*
  * Search for a node in the tree.
@@ -289,16 +289,16 @@
  * Ignores devices that don't have a uuid starting with uuid_prefix.
  */
 int dm_tree_preload_children(struct dm_tree_node *dnode,
-                                 const char *uuid_prefix,
-                                 size_t uuid_prefix_len);
+			     const char *uuid_prefix,
+			     size_t uuid_prefix_len);
 
 /*
  * Resume a device plus all dependencies.
  * Ignores devices that don't have a uuid starting with uuid_prefix.
  */
 int dm_tree_activate_children(struct dm_tree_node *dnode,
-                                 const char *uuid_prefix,
-                                 size_t uuid_prefix_len);
+			      const char *uuid_prefix,
+			      size_t uuid_prefix_len);
 
 /*
  * Suspend a device plus all dependencies.
@@ -630,4 +630,81 @@
  */
 int dm_asprintf(char **buf, const char *format, ...);
 
+/*********************
+ * reporting functions
+ *********************/
+
+struct dm_report_object_type {
+	uint32_t id;			/* Powers of 2 */
+	const char *desc;
+	const char *prefix;		/* field id string prefix (optional) */
+	void *(*data_fn)(void *object);	/* callback from report_object() */
+};
+
+struct dm_report_field;
+
+/*
+ * dm_report_field_type flags
+ */
+#define DM_REPORT_FIELD_MASK		0x0000000F
+#define DM_REPORT_FIELD_ALIGN_LEFT	0x00000001
+#define DM_REPORT_FIELD_ALIGN_RIGHT	0x00000002
+#define DM_REPORT_FIELD_STRING		0x00000004
+#define DM_REPORT_FIELD_NUMBER		0x00000008
+
+struct dm_report;
+struct dm_report_field_type {
+	uint32_t type;		/* object type id */
+	const char id[32];	/* string used to specify the field */
+	unsigned int offset;	/* byte offset in the object */
+	const char heading[32];	/* string printed in header */
+	int width;		/* default width */
+	uint32_t flags;		/* DM_REPORT_FIELD_* */
+	int (*report_fn)(struct dm_report *rh, struct dm_pool *mem,
+			 struct dm_report_field *field, const void *data,
+			 void *private);
+};
+
+/*
+ * dm_report_init output_flags
+ */
+#define DM_REPORT_OUTPUT_MASK		0x00000007
+#define DM_REPORT_OUTPUT_ALIGNED	0x00000001
+#define DM_REPORT_OUTPUT_BUFFERED	0x00000002
+#define DM_REPORT_OUTPUT_HEADINGS	0x00000004
+
+struct dm_report *dm_report_init(uint32_t *report_types,
+				 const struct dm_report_object_type *types,
+				 const struct dm_report_field_type *fields,
+				 const char *output_fields,
+				 const char *output_separator,
+				 uint32_t output_flags,
+				 const char *sort_keys,
+				 void *private);
+int dm_report_object(struct dm_report *rh, void *object);
+int dm_report_output(struct dm_report *rh);
+void dm_report_free(struct dm_report *rh);
+
+/* report functions for common types */
+int dm_report_field_string(struct dm_report *rh, struct dm_pool *mem,
+			   struct dm_report_field *field, const void *data);
+int dm_report_field_int32(struct dm_report *rh, struct dm_pool *mem,
+			  struct dm_report_field *field, const void *data);
+int dm_report_field_uint32(struct dm_report *rh, struct dm_pool *mem,
+			   struct dm_report_field *field, const void *data);
+int dm_report_field_int(struct dm_report *rh, struct dm_pool *mem,
+			struct dm_report_field *field, const void *data);
+int dm_report_field_uint64(struct dm_report *rh, struct dm_pool *mem,
+			struct dm_report_field *field, const void *data);
+
+/*
+ * Helper function for custom reporting functions
+ */
+
+/*
+ * sortvalue may be NULL if it's the same as value
+ */
+void dm_report_field_set_value(struct dm_report_field *field,
+			       const void *value, const void *sortvalue);
+
 #endif				/* LIB_DEVICE_MAPPER_H */

^ permalink raw reply	[flat|nested] 3+ messages in thread

* device-mapper ./WHATS_NEW dmeventd/.exported_s ...
@ 2007-01-22 15:03 agk
  0 siblings, 0 replies; 3+ messages in thread
From: agk @ 2007-01-22 15:03 UTC (permalink / raw)
  To: dm-cvs, dm-devel

CVSROOT:	/cvs/dm
Module name:	device-mapper
Changes by:	agk@sourceware.org	2007-01-22 15:03:57

Modified files:
	.              : WHATS_NEW 
	dmeventd       : .exported_symbols dmeventd.c 
	                 libdevmapper-event.c libdevmapper-event.h 
	dmsetup        : dmsetup.c 
	lib            : libdevmapper.h libdm-common.c libdm-deptree.c 
	                 libdm-report.c libdm-string.c 
	lib/datastruct : hash.c 
	lib/mm         : dbg_malloc.c 

Log message:
	Add dm_event_handler_[gs]et_timeout functions.
	Streamline dm_report_field_* interface.

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.155&r2=1.156
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/.exported_symbols.diff?cvsroot=dm&r1=1.8&r2=1.9
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.42&r2=1.43
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.c.diff?cvsroot=dm&r1=1.19&r2=1.20
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.h.diff?cvsroot=dm&r1=1.11&r2=1.12
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmsetup/dmsetup.c.diff?cvsroot=dm&r1=1.77&r2=1.78
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdevmapper.h.diff?cvsroot=dm&r1=1.65&r2=1.66
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-common.c.diff?cvsroot=dm&r1=1.42&r2=1.43
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-deptree.c.diff?cvsroot=dm&r1=1.30&r2=1.31
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-report.c.diff?cvsroot=dm&r1=1.5&r2=1.6
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-string.c.diff?cvsroot=dm&r1=1.6&r2=1.7
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/datastruct/hash.c.diff?cvsroot=dm&r1=1.4&r2=1.5
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/mm/dbg_malloc.c.diff?cvsroot=dm&r1=1.9&r2=1.10

--- device-mapper/WHATS_NEW	2007/01/19 17:22:17	1.155
+++ device-mapper/WHATS_NEW	2007/01/22 15:03:56	1.156
@@ -1,5 +1,7 @@
 Version 1.02.16 -
 ===================================
+  Add dm_event_handler_[gs]et_timeout functions.
+  Streamline dm_report_field_* interface.
   Add cmdline debug & version options to dmeventd.
   Add DM_LIB_VERSION definition to configure.h.
   Suppress 'Unrecognised field' error if report field is 'help'.
--- device-mapper/dmeventd/.exported_symbols	2007/01/16 18:03:40	1.8
+++ device-mapper/dmeventd/.exported_symbols	2007/01/22 15:03:57	1.9
@@ -15,3 +15,5 @@
 dm_event_register_handler
 dm_event_unregister_handler
 dm_event_get_registered_device
+dm_event_handler_set_timeout
+dm_event_handler_get_timeout
--- device-mapper/dmeventd/dmeventd.c	2007/01/19 18:08:36	1.42
+++ device-mapper/dmeventd/dmeventd.c	2007/01/22 15:03:57	1.43
@@ -41,6 +41,8 @@
 #ifdef linux
 #  include <malloc.h>
 
+#  define OOM_ADJ_FILE "/proc/self/oom_adj"
+
 /* From linux/oom.h */
 #  define OOM_DISABLE (-17)
 #  define OOM_ADJUST_MIN (-16)
@@ -64,7 +66,6 @@
 #define	UNLINK_THREAD(x)	UNLINK(x)
 
 #define DAEMON_NAME "dmeventd"
-#define OOM_ADJ_FILE "/proc/self/oom_adj"
 
 /*
   Global mutex for thread list access. Has to be held when:
@@ -192,7 +193,7 @@
         va_start(ap,fmt);
 
         time(&P);
-        fprintf(stderr, "dmeventd[%x]: %.15s ", (int)pthread_self(), ctime(&P)+4 );
+        fprintf(stderr, "dmeventd[%p]: %.15s ", (void *) pthread_self(), ctime(&P)+4 );
         vfprintf(stderr, fmt, ap);
 	fprintf(stderr, "\n");
 
@@ -449,14 +450,14 @@
 	dm_lib_exit();
 }
 
-static void _exit_timeout(void *unused)
+static void _exit_timeout(void *unused __attribute((unused)))
 {
 	_timeout_running = 0;
 	pthread_mutex_unlock(&_timeout_mutex);
 }
 
 /* Wake up monitor threads every so often. */
-static void *_timeout_thread(void *unused)
+static void *_timeout_thread(void *unused __attribute((unused)))
 {
 	struct timespec timeout;
 	time_t curr_time;
@@ -468,16 +469,16 @@
 	while (!list_empty(&_timeout_registry)) {
 		struct thread_status *thread;
 
-		timeout.tv_sec = (time_t) -1;
+		timeout.tv_sec = 0;
 		curr_time = time(NULL);
 
 		list_iterate_items_gen(thread, &_timeout_registry, timeout_list) {
-			if (thread->next_time < curr_time) {
+			if (thread->next_time <= curr_time) {
 				thread->next_time = curr_time + thread->timeout;
 				pthread_kill(thread->thread, SIGALRM);
 			}
 
-			if (thread->next_time < timeout.tv_sec)
+			if (thread->next_time < timeout.tv_sec || !timeout.tv_sec)
 				timeout.tv_sec = thread->next_time;
 		}
 
@@ -682,6 +683,23 @@
 	_unlock_mutex();
 }
 
+static struct dm_task *_get_device_status(struct thread_status *ts)
+{
+	struct dm_task *dmt = dm_task_create(DM_DEVICE_STATUS);
+
+	if (!dmt)
+		return NULL;
+
+	dm_task_set_uuid(dmt, ts->device.uuid);
+
+	if (!dm_task_run(dmt)) {
+		dm_task_destroy(dmt);
+		return NULL;
+	}
+
+	return dmt;
+}
+
 /* Device monitoring thread. */
 static void *_monitor_thread(void *arg)
 {
@@ -708,6 +726,18 @@
 		if (wait_error == DM_WAIT_FATAL)
 			break;
 
+		/* Timeout occurred, task is not filled properly.
+		 * We get device status here for processing it in DSO.
+		 */
+		if (wait_error == DM_WAIT_INTR &&
+		    thread->current_events & DM_EVENT_TIMEOUT) {
+			dm_task_destroy(task);
+			task = _get_device_status(thread);
+			/* FIXME: syslog fail here ? */
+			if (!(thread->current_task = task))
+				continue;
+		}
+
 		/*
 		 * We know that wait succeeded and stored a
 		 * pointer to dm_task with device status into task.
@@ -798,8 +828,7 @@
 }
 
 /* Lookup DSO symbols we need. */
-static int _lookup_symbol(void *dl, struct dso_data *data,
-			 void **symbol, const char *name)
+static int _lookup_symbol(void *dl, void **symbol, const char *name)
 {
 	if ((*symbol = dlsym(dl, name)))
 		return 1;
@@ -809,11 +838,11 @@
 
 static int lookup_symbols(void *dl, struct dso_data *data)
 {
-	return _lookup_symbol(dl, data, (void *) &data->process_event,
+	return _lookup_symbol(dl, (void *) &data->process_event,
 			     "process_event") &&
-	    _lookup_symbol(dl, data, (void *) &data->register_device,
+	    _lookup_symbol(dl, (void *) &data->register_device,
 			  "register_device") &&
-	    _lookup_symbol(dl, data, (void *) &data->unregister_device,
+	    _lookup_symbol(dl, (void *) &data->unregister_device,
 			  "unregister_device");
 }
 
@@ -909,7 +938,7 @@
 	   usually means we are so starved on resources that we are
 	   almost as good as dead already... */
 	if (thread_new->events & DM_EVENT_TIMEOUT) {
-		ret = -_register_for_timeout(thread);
+		ret = -_register_for_timeout(thread_new);
 		if (ret) {
 		    _unlock_mutex();
 		    goto out;
@@ -1426,7 +1455,7 @@
 	_unlock_mutex();
 }
 
-static void _sig_alarm(int signum)
+static void _sig_alarm(int signum __attribute((unused)))
 {
 	pthread_testcancel();
 }
@@ -1458,7 +1487,7 @@
  * Set the global variable which the process should
  * be watching to determine when to exit.
  */
-static void _exit_handler(int sig)
+static void _exit_handler(int sig __attribute((unused)))
 {
 	/*
 	 * We exit when '_exit_now' is set.
@@ -1492,6 +1521,7 @@
 	return 0;
 }
 
+#ifdef linux
 /*
  * Protection against OOM killer if kernel supports it
  */
@@ -1519,6 +1549,7 @@
 
 	return 1;
 }
+#endif
 
 static void _daemonize(void)
 {
@@ -1643,8 +1674,10 @@
 	signal(SIGHUP, &_exit_handler);
 	signal(SIGQUIT, &_exit_handler);
 
+#ifdef linux
 	if (!_set_oom_adj(OOM_DISABLE) && !_set_oom_adj(OOM_ADJUST_MIN))
 		syslog(LOG_ERR, "Failed to set oom_adj to protect against OOM killer");
+#endif
 
 	_init_thread_signals();
 
--- device-mapper/dmeventd/libdevmapper-event.c	2007/01/17 14:45:10	1.19
+++ device-mapper/dmeventd/libdevmapper-event.c	2007/01/22 15:03:57	1.20
@@ -38,6 +38,7 @@
 	char *uuid;
 	int major;
 	int minor;
+	uint32_t timeout;
 
 	enum dm_event_mask mask;
 };
@@ -62,6 +63,7 @@
 	dmevh->dso = dmevh->dev_name = dmevh->uuid = NULL;
 	dmevh->major = dmevh->minor = 0;
 	dmevh->mask = 0;
+	dmevh->timeout = 0;
 
 	return dmevh;
 }
@@ -140,6 +142,11 @@
 	dmevh->mask = evmask;
 }
 
+void dm_event_handler_set_timeout(struct dm_event_handler *dmevh, int timeout)
+{
+	dmevh->timeout = timeout;
+}
+
 const char *dm_event_handler_get_dso(const struct dm_event_handler *dmevh)
 {
 	return dmevh->dso;
@@ -165,6 +172,11 @@
 	return dmevh->minor;
 }
 
+int dm_event_handler_get_timeout(const struct dm_event_handler *dmevh)
+{
+	return dmevh->timeout;
+}
+
 enum dm_event_mask dm_event_handler_get_event_mask(const struct dm_event_handler *dmevh)
 {
 	return dmevh->mask;
@@ -484,8 +496,8 @@
 
 /* Handle the event (de)registration call and return negative error codes. */
 static int _do_event(int cmd, struct dm_event_daemon_message *msg,
-		    const char *dso_name, const char *dev_name,
-		    enum dm_event_mask evmask, uint32_t timeout)
+		     const char *dso_name, const char *dev_name,
+		     enum dm_event_mask evmask, uint32_t timeout)
 {
 	int ret;
 	struct dm_event_fifos fifos;
@@ -519,7 +531,7 @@
 	uuid = dm_task_get_uuid(dmt);
 
 	if ((err = _do_event(DM_EVENT_CMD_REGISTER_FOR_EVENT, &msg,
-			     dmevh->dso, uuid, dmevh->mask, 0)) < 0) {
+			     dmevh->dso, uuid, dmevh->mask, dmevh->timeout)) < 0) {
 		log_error("%s: event registration failed: %s",
 			  dm_task_get_name(dmt),
 			  msg.data ? msg.data : strerror(-err));
@@ -549,7 +561,7 @@
 	uuid = dm_task_get_uuid(dmt);
 
 	if ((err = _do_event(DM_EVENT_CMD_UNREGISTER_FOR_EVENT, &msg,
-			    dmevh->dso, uuid, dmevh->mask, 0)) < 0) {
+			    dmevh->dso, uuid, dmevh->mask, dmevh->timeout)) < 0) {
 		log_error("%s: event deregistration failed: %s",
 			  dm_task_get_name(dmt),
 			  msg.data ? msg.data : strerror(-err));
@@ -690,8 +702,9 @@
 
 	if (!device_exists(device_path))
 		return -ENODEV;
+
 	return _do_event(DM_EVENT_CMD_SET_TIMEOUT, &msg,
-			NULL, device_path, 0, timeout);
+			 NULL, device_path, 0, timeout);
 }
 
 int dm_event_get_timeout(const char *device_path, uint32_t *timeout)
--- device-mapper/dmeventd/libdevmapper-event.h	2007/01/19 20:42:09	1.11
+++ device-mapper/dmeventd/libdevmapper-event.h	2007/01/22 15:03:57	1.12
@@ -71,6 +71,7 @@
 
 void dm_event_handler_set_major(struct dm_event_handler *dmevh, int major);
 void dm_event_handler_set_minor(struct dm_event_handler *dmevh, int minor);
+void dm_event_handler_set_timeout(struct dm_event_handler *dmevh, int timeout);
 
 /*
  * Specify mask for events to monitor.
@@ -83,6 +84,7 @@
 const char *dm_event_handler_get_uuid(const struct dm_event_handler *dmevh);
 int dm_event_handler_get_major(const struct dm_event_handler *dmevh);
 int dm_event_handler_get_minor(const struct dm_event_handler *dmevh);
+int dm_event_handler_get_timeout(const struct dm_event_handler *dmevh);
 enum dm_event_mask dm_event_handler_get_event_mask(const struct dm_event_handler *dmevh);
 
 /* FIXME Review interface (what about this next thing?) */
--- device-mapper/dmsetup/dmsetup.c	2007/01/18 17:47:57	1.77
+++ device-mapper/dmsetup/dmsetup.c	2007/01/22 15:03:57	1.78
@@ -1705,7 +1705,8 @@
 /*
  *  create a table for a mapped device using the loop target.
  */
-static int _loop_table(char *table, size_t tlen, char *file, char *dev, off_t off)
+static int _loop_table(char *table, size_t tlen, char *file,
+		       char *dev __attribute((unused)), off_t off)
 {
 	struct stat fbuf;
 	off_t size, sectors;
--- device-mapper/lib/libdevmapper.h	2007/01/18 17:47:58	1.65
+++ device-mapper/lib/libdevmapper.h	2007/01/22 15:03:57	1.66
@@ -687,26 +687,27 @@
 int dm_report_output(struct dm_report *rh);
 void dm_report_free(struct dm_report *rh);
 
-/* report functions for common types */
-int dm_report_field_string(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data);
-int dm_report_field_int32(struct dm_report *rh, struct dm_pool *mem,
-			  struct dm_report_field *field, const void *data);
-int dm_report_field_uint32(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data);
-int dm_report_field_int(struct dm_report *rh, struct dm_pool *mem,
-			struct dm_report_field *field, const void *data);
-int dm_report_field_uint64(struct dm_report *rh, struct dm_pool *mem,
-			struct dm_report_field *field, const void *data);
-
 /*
- * Helper function for custom reporting functions
+ * Report functions are provided for simple data types.
+ * They take care of allocating copies of the data.
  */
+int dm_report_field_string(struct dm_report *rh, struct dm_report_field *field,
+			   const char **data);
+int dm_report_field_int32(struct dm_report *rh, struct dm_report_field *field,
+			  const int32_t *data);
+int dm_report_field_uint32(struct dm_report *rh, struct dm_report_field *field,
+			   const uint32_t *data);
+int dm_report_field_int(struct dm_report *rh, struct dm_report_field *field,
+			const int *data);
+int dm_report_field_uint64(struct dm_report *rh, struct dm_report_field *field,
+			   const uint64_t *data);
 
 /*
- * sortvalue may be NULL if it's the same as value
+ * For custom fields, allocate the data in 'mem' and use
+ * dm_report_field_set_value().
+ * 'sortvalue' may be NULL if it matches 'value'
  */
-void dm_report_field_set_value(struct dm_report_field *field,
-			       const void *value, const void *sortvalue);
+void dm_report_field_set_value(struct dm_report_field *field, const void *value,
+			       const void *sortvalue);
 
 #endif				/* LIB_DEVICE_MAPPER_H */
--- device-mapper/lib/libdm-common.c	2006/05/10 16:23:41	1.42
+++ device-mapper/lib/libdm-common.c	2007/01/22 15:03:57	1.43
@@ -38,8 +38,8 @@
  * Library users can provide their own logging
  * function.
  */
-static void _default_log(int level, const char *file, int line,
-			 const char *f, ...)
+static void _default_log(int level, const char *file __attribute((unused)),
+			 int line __attribute((unused)), const char *f, ...)
 {
 	va_list ap;
 
--- device-mapper/lib/libdm-deptree.c	2007/01/09 19:44:07	1.30
+++ device-mapper/lib/libdm-deptree.c	2007/01/22 15:03:57	1.31
@@ -1212,7 +1212,9 @@
 	return 1;
 }
 
-static int _emit_areas_line(struct dm_task *dmt, struct load_segment *seg, char *params, size_t paramsize, int *pos)
+static int _emit_areas_line(struct dm_task *dmt __attribute((unused)),
+			    struct load_segment *seg, char *params,
+			    size_t paramsize, int *pos)
 {
 	struct seg_area *area;
 	char devbuf[10];
--- device-mapper/lib/libdm-report.c	2007/01/18 22:15:04	1.5
+++ device-mapper/lib/libdm-report.c	2007/01/22 15:03:57	1.6
@@ -99,12 +99,12 @@
  * Data-munging functions to prepare each data type for display and sorting
  */
 
-int dm_report_field_string(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data)
+int dm_report_field_string(struct dm_report *rh,
+			   struct dm_report_field *field, const char **data)
 {
 	char *repstr;
 
-	if (!(repstr = dm_pool_strdup(rh->mem, *(const char **) data))) {
+	if (!(repstr = dm_pool_strdup(rh->mem, *data))) {
 		log_error("dm_report_field_string: dm_pool_strdup failed");
 		return 0;
 	}
@@ -115,10 +115,10 @@
 	return 1;
 }
 
-int dm_report_field_int(struct dm_report *rh, struct dm_pool *mem,
-			struct dm_report_field *field, const void *data)
+int dm_report_field_int(struct dm_report *rh,
+			struct dm_report_field *field, const int *data)
 {
-	const int value = *(const int *) data;
+	const int value = *data;
 	uint64_t *sortval;
 	char *repstr;
 
@@ -144,10 +144,10 @@
 	return 1;
 }
 
-int dm_report_field_uint32(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data)
+int dm_report_field_uint32(struct dm_report *rh,
+			   struct dm_report_field *field, const uint32_t *data)
 {
-	const uint32_t value = *(const uint32_t *) data;
+	const uint32_t value = *data;
 	uint64_t *sortval;
 	char *repstr;
 
@@ -173,10 +173,10 @@
 	return 1;
 }
 
-int dm_report_field_int32(struct dm_report *rh, struct dm_pool *mem,
-			  struct dm_report_field *field, const void *data)
+int dm_report_field_int32(struct dm_report *rh,
+			  struct dm_report_field *field, const int32_t *data)
 {
-	const int32_t value = *(const int32_t *) data;
+	const int32_t value = *data;
 	uint64_t *sortval;
 	char *repstr;
 
@@ -202,10 +202,10 @@
 	return 1;
 }
 
-int dm_report_field_uint64(struct dm_report *rh, struct dm_pool *mem,
-			   struct dm_report_field *field, const void *data)
+int dm_report_field_uint64(struct dm_report *rh,
+			   struct dm_report_field *field, const uint64_t *data)
 {
-	const int value = *(const uint64_t *) data;
+	const int value = *data;
 	uint64_t *sortval;
 	char *repstr;
 
--- device-mapper/lib/libdm-string.c	2007/01/15 18:21:01	1.6
+++ device-mapper/lib/libdm-string.c	2007/01/22 15:03:57	1.7
@@ -37,7 +37,8 @@
  * Split buffer into NULL-separated words in argv.
  * Returns number of words.
  */
-int dm_split_words(char *buffer, unsigned max, unsigned ignore_comments,
+int dm_split_words(char *buffer, unsigned max,
+		   unsigned ignore_comments __attribute((unused)),
 		   char **argv)
 {
 	unsigned arg;
--- device-mapper/lib/datastruct/hash.c	2006/01/09 20:35:24	1.4
+++ device-mapper/lib/datastruct/hash.c	2007/01/22 15:03:57	1.5
@@ -230,12 +230,14 @@
 	t->num_nodes = 0u;
 }
 
-char *dm_hash_get_key(struct dm_hash_table *t, struct dm_hash_node *n)
+char *dm_hash_get_key(struct dm_hash_table *t __attribute((unused)),
+		      struct dm_hash_node *n)
 {
 	return n->key;
 }
 
-void *dm_hash_get_data(struct dm_hash_table *t, struct dm_hash_node *n)
+void *dm_hash_get_data(struct dm_hash_table *t __attribute((unused)),
+		       struct dm_hash_node *n)
 {
 	return n->data;
 }
--- device-mapper/lib/mm/dbg_malloc.c	2007/01/15 14:39:12	1.9
+++ device-mapper/lib/mm/dbg_malloc.c	2007/01/22 15:03:57	1.10
@@ -231,7 +231,8 @@
 	}
 }
 
-void *dm_malloc_aux(size_t s, const char *file, int line)
+void *dm_malloc_aux(size_t s, const char *file __attribute((unused)),
+		    int line __attribute((unused)))
 {
 	if (s > 50000000) {
 		log_error("Huge memory allocation (size %" PRIsize_t

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2007-01-22 15:03 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-01-16 18:03 device-mapper ./WHATS_NEW dmeventd/.exported_s agk
  -- strict thread matches above, loose matches on Subject: below --
2007-01-22 15:03 agk
2007-01-15 18:21 agk

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.