summaryrefslogtreecommitdiffstats
path: root/daemons/dmeventd
diff options
context:
space:
mode:
authorAlasdair Kergon <agk@redhat.com>2010-08-16 22:54:35 +0000
committerAlasdair Kergon <agk@redhat.com>2010-08-16 22:54:35 +0000
commitd1e8046f5602d427e063eaf111e63af58092cbb5 (patch)
treedc23e04b9af4004a0e0aae874be2f39361e70afc /daemons/dmeventd
parent470c18847ddf0d847d31c2e39e7360a21b7f777c (diff)
downloadlvm2-d1e8046f5602d427e063eaf111e63af58092cbb5.tar.gz
lvm2-d1e8046f5602d427e063eaf111e63af58092cbb5.tar.xz
lvm2-d1e8046f5602d427e063eaf111e63af58092cbb5.zip
Various small cleanups and fixes related to monitoring.
Diffstat (limited to 'daemons/dmeventd')
-rw-r--r--daemons/dmeventd/.exported_symbols19
-rw-r--r--daemons/dmeventd/Makefile.in5
-rw-r--r--daemons/dmeventd/libdevmapper-event.c40
-rw-r--r--daemons/dmeventd/libdevmapper-event.h11
4 files changed, 42 insertions, 33 deletions
diff --git a/daemons/dmeventd/.exported_symbols b/daemons/dmeventd/.exported_symbols
index 6c892d30..e69de29b 100644
--- a/daemons/dmeventd/.exported_symbols
+++ b/daemons/dmeventd/.exported_symbols
@@ -1,19 +0,0 @@
-dm_event_handler_create
-dm_event_handler_destroy
-dm_event_handler_set_dso
-dm_event_handler_set_dev_name
-dm_event_handler_set_uuid
-dm_event_handler_set_major
-dm_event_handler_set_minor
-dm_event_handler_set_event_mask
-dm_event_handler_get_dso
-dm_event_handler_get_devname
-dm_event_handler_get_uuid
-dm_event_handler_get_major
-dm_event_handler_get_minor
-dm_event_handler_get_event_mask
-dm_event_register_handler
-dm_event_unregister_handler
-dm_event_get_registered_device
-dm_event_handler_set_timeout
-dm_event_handler_get_timeout
diff --git a/daemons/dmeventd/Makefile.in b/daemons/dmeventd/Makefile.in
index 326f8666..e99e089b 100644
--- a/daemons/dmeventd/Makefile.in
+++ b/daemons/dmeventd/Makefile.in
@@ -48,6 +48,9 @@ CFLOW_LIST = $(SOURCES)
CFLOW_LIST_TARGET = $(LIB_NAME).cflow
CFLOW_TARGET = dmeventd
+EXPORTED_HEADER = $(srcdir)/libdevmapper-event.h
+EXPORTED_FN_PREFIX = dm_event
+
include $(top_builddir)/make.tmpl
all: device-mapper
@@ -102,4 +105,4 @@ install: install_include install_lib install_dmeventd
install_device-mapper: install_include install_lib install_dmeventd
-DISTCLEAN_TARGETS += libdevmapper-event.pc
+DISTCLEAN_TARGETS += libdevmapper-event.pc .exported_symbols_generated
diff --git a/daemons/dmeventd/libdevmapper-event.c b/daemons/dmeventd/libdevmapper-event.c
index 242e02a8..61ca340c 100644
--- a/daemons/dmeventd/libdevmapper-event.c
+++ b/daemons/dmeventd/libdevmapper-event.c
@@ -35,6 +35,8 @@ static int _sequence_nr = 0;
struct dm_event_handler {
char *dso;
+ char *dmeventd_path;
+
char *dev_name;
char *uuid;
@@ -60,6 +62,7 @@ struct dm_event_handler *dm_event_handler_create(void)
if (!(dmevh = dm_malloc(sizeof(*dmevh))))
return NULL;
+ dmevh->dmeventd_path = NULL;
dmevh->dso = dmevh->dev_name = dmevh->uuid = NULL;
dmevh->major = dmevh->minor = 0;
dmevh->mask = 0;
@@ -72,9 +75,24 @@ void dm_event_handler_destroy(struct dm_event_handler *dmevh)
{
_dm_event_handler_clear_dev_info(dmevh);
dm_free(dmevh->dso);
+ dm_free(dmevh->dmeventd_path);
dm_free(dmevh);
}
+int dm_event_handler_set_dmeventd_path(struct dm_event_handler *dmevh, const char *dmeventd_path)
+{
+ if (!dmeventd_path) /* noop */
+ return 0;
+
+ dm_free(dmevh->dmeventd_path);
+
+ dmevh->dmeventd_path = dm_strdup(dmeventd_path);
+ if (!dmevh->dmeventd_path)
+ return -ENOMEM;
+
+ return 0;
+}
+
int dm_event_handler_set_dso(struct dm_event_handler *dmevh, const char *path)
{
if (!path) /* noop */
@@ -387,13 +405,13 @@ static int _daemon_talk(struct dm_event_fifos *fifos,
*
* Returns: 1 on success, 0 otherwise
*/
-static int _start_daemon(struct dm_event_fifos *fifos)
+static int _start_daemon(char *dmeventd_path, struct dm_event_fifos *fifos)
{
int pid, ret = 0;
int status;
struct stat statbuf;
- char dmeventdpath[] = DMEVENTD_PATH; /* const type for execvp */
- char * const args[] = { dmeventdpath, NULL };
+ char default_dmeventd_path[] = DMEVENTD_PATH;
+ char *args[] = { dmeventd_path ? : default_dmeventd_path, NULL };
if (stat(fifos->client_path, &statbuf))
goto start_server;
@@ -449,17 +467,19 @@ static int _start_daemon(struct dm_event_fifos *fifos)
}
/* Initialize client. */
-static int _init_client(struct dm_event_fifos *fifos)
+static int _init_client(char *dmeventd_path, struct dm_event_fifos *fifos)
{
/* FIXME? Is fifo the most suitable method? Why not share
comms/daemon code with something else e.g. multipath? */
/* init fifos */
memset(fifos, 0, sizeof(*fifos));
+
+ /* FIXME Make these either configurable or depend directly on dmeventd_path */
fifos->client_path = DM_EVENT_FIFO_CLIENT;
fifos->server_path = DM_EVENT_FIFO_SERVER;
- if (!_start_daemon(fifos)) {
+ if (!_start_daemon(dmeventd_path, fifos)) {
stack;
return 0;
}
@@ -544,14 +564,14 @@ failed:
}
/* Handle the event (de)registration call and return negative error codes. */
-static int _do_event(int cmd, struct dm_event_daemon_message *msg,
+static int _do_event(int cmd, char *dmeventd_path, struct dm_event_daemon_message *msg,
const char *dso_name, const char *dev_name,
enum dm_event_mask evmask, uint32_t timeout)
{
int ret;
struct dm_event_fifos fifos;
- if (!_init_client(&fifos)) {
+ if (!_init_client(dmeventd_path, &fifos)) {
stack;
return -ESRCH;
}
@@ -585,7 +605,7 @@ int dm_event_register_handler(const struct dm_event_handler *dmevh)
uuid = dm_task_get_uuid(dmt);
- if ((err = _do_event(DM_EVENT_CMD_REGISTER_FOR_EVENT, &msg,
+ if ((err = _do_event(DM_EVENT_CMD_REGISTER_FOR_EVENT, dmevh->dmeventd_path, &msg,
dmevh->dso, uuid, dmevh->mask, dmevh->timeout)) < 0) {
log_error("%s: event registration failed: %s",
dm_task_get_name(dmt),
@@ -614,7 +634,7 @@ int dm_event_unregister_handler(const struct dm_event_handler *dmevh)
uuid = dm_task_get_uuid(dmt);
- if ((err = _do_event(DM_EVENT_CMD_UNREGISTER_FOR_EVENT, &msg,
+ if ((err = _do_event(DM_EVENT_CMD_UNREGISTER_FOR_EVENT, dmevh->dmeventd_path, &msg,
dmevh->dso, uuid, dmevh->mask, dmevh->timeout)) < 0) {
log_error("%s: event deregistration failed: %s",
dm_task_get_name(dmt),
@@ -689,7 +709,7 @@ int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next)
uuid = dm_task_get_uuid(dmt);
if (!(ret = _do_event(next ? DM_EVENT_CMD_GET_NEXT_REGISTERED_DEVICE :
- DM_EVENT_CMD_GET_REGISTERED_DEVICE,
+ DM_EVENT_CMD_GET_REGISTERED_DEVICE, dmevh->dmeventd_path,
&msg, dmevh->dso, uuid, dmevh->mask, 0))) {
/* FIXME this will probably horribly break if we get
ill-formatted reply */
diff --git a/daemons/dmeventd/libdevmapper-event.h b/daemons/dmeventd/libdevmapper-event.h
index 25f5152a..0de20c14 100644
--- a/daemons/dmeventd/libdevmapper-event.h
+++ b/daemons/dmeventd/libdevmapper-event.h
@@ -55,13 +55,18 @@ void dm_event_handler_destroy(struct dm_event_handler *dmevh);
/*
* Path of shared library to handle events.
*
- * All of dso, device_name and uuid strings are duplicated, you do not
- * need to keep the pointers valid after the call succeeds. Thes may
- * return -ENOMEM though.
+ * All of dmeventd, dso, device_name and uuid strings are duplicated so
+ * you do not need to keep the pointers valid after the call succeeds.
+ * They may return -ENOMEM though.
*/
int dm_event_handler_set_dso(struct dm_event_handler *dmevh, const char *path);
/*
+ * Path of dmeventd binary.
+ */
+int dm_event_handler_set_dmeventd_path(struct dm_event_handler *dmevh, const char *dmeventd_path);
+
+/*
* Identify the device to monitor by exactly one of device_name, uuid or
* device number. String arguments are duplicated, see above.
*/