/* * Copyright (C) 2005-2015 Red Hat, Inc. All rights reserved. * * This file is part of the device-mapper userspace tools. * * This copyrighted material is made available to anyone wishing to use, * modify, copy, or redistribute it subject to the terms and conditions * of the GNU Lesser General Public License v.2.1. * * You should have received a copy of the GNU Lesser General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* * Note that this file is released only as part of a technology preview * and its contents may change in future updates in ways that do not * preserve compatibility. */ #ifndef LIB_DMEVENT_H #define LIB_DMEVENT_H #include #include /* * 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. */ DM_EVENT_ERROR_MASK = 0x00FF00, 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 of a host adaptor. */ DM_EVENT_STATUS_MASK = 0xFF0000, DM_EVENT_SYNC_STATUS = 0x010000, /* Mirror synchronization completed/failed. */ DM_EVENT_TIMEOUT = 0x020000, /* Timeout has occured */ DM_EVENT_REGISTRATION_PENDING = 0x1000000, /* Monitor thread is setting-up/shutting-down */ }; #define DM_EVENT_ALL_ERRORS DM_EVENT_ERROR_MASK #define DM_EVENT_PROTOCOL_VERSION 2 struct dm_task; struct dm_event_handler; struct dm_event_handler *dm_event_handler_create(void); void dm_event_handler_destroy(struct dm_event_handler *dmevh); /* * Path of shared library to handle events. * * 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. */ int dm_event_handler_set_dev_name(struct dm_event_handler *dmevh, const char *device_name); int 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); void dm_event_handler_set_timeout(struct dm_event_handler *dmevh, int timeout); /* * Specify mask for events to monitor. */ // FIXME misuse of bitmask as enum 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_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); int dm_event_handler_get_timeout(const struct dm_event_handler *dmevh); // FIXME misuse of bitmask as enum enum dm_event_mask dm_event_handler_get_event_mask(const struct dm_event_handler *dmevh); /* FIXME Review interface (what about this next thing?) */ int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next); /* * 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); /* Set debug level for logging, and whether to log on stdout/stderr or syslog */ void dm_event_log_set(int debug_log_level, int use_syslog); /* Log messages acroding to current debug level */ __attribute__((format(printf, 6, 0))) void dm_event_log(const char *subsys, int level, const char *file, int line, int dm_errno_or_class, const char *format, va_list ap); /* Macro to route print_log do dm_event_log() */ #define DM_EVENT_LOG_FN(subsys) \ void print_log(int level, const char *file, int line, int dm_errno_or_class,\ const char *format, ...)\ {\ va_list ap;\ va_start(ap, format);\ dm_event_log(subsys, level, file, line, dm_errno_or_class, format, ap);\ va_end(ap);\ } /* Prototypes for DSO interface, see dmeventd.c, struct dso_data for detailed descriptions. */ // FIXME misuse of bitmask as enum void process_event(struct dm_task *dmt, enum dm_event_mask evmask, void **user); int register_device(const char *device_name, const char *uuid, int major, int minor, void **user); int unregister_device(const char *device_name, const char *uuid, int major, int minor, void **user); #endif