diff options
author | Alasdair Kergon <agk@redhat.com> | 2010-08-16 22:54:35 +0000 |
---|---|---|
committer | Alasdair Kergon <agk@redhat.com> | 2010-08-16 22:54:35 +0000 |
commit | d1e8046f5602d427e063eaf111e63af58092cbb5 (patch) | |
tree | dc23e04b9af4004a0e0aae874be2f39361e70afc /daemons/dmeventd | |
parent | 470c18847ddf0d847d31c2e39e7360a21b7f777c (diff) | |
download | lvm2-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_symbols | 19 | ||||
-rw-r--r-- | daemons/dmeventd/Makefile.in | 5 | ||||
-rw-r--r-- | daemons/dmeventd/libdevmapper-event.c | 40 | ||||
-rw-r--r-- | daemons/dmeventd/libdevmapper-event.h | 11 |
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. */ |