* device-mapper ./WHATS_NEW dmeventd/dmeventd.c ...
@ 2007-01-15 22:05 agk
0 siblings, 0 replies; 6+ messages in thread
From: agk @ 2007-01-15 22:05 UTC (permalink / raw)
To: dm-cvs, dm-devel
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: agk@sourceware.org 2007-01-15 22:05:51
Modified files:
. : WHATS_NEW
dmeventd : dmeventd.c
dmsetup : dmsetup.c
Log message:
Fix a malloc error path in dmsetup message.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.147&r2=1.148
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.32&r2=1.33
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmsetup/dmsetup.c.diff?cvsroot=dm&r1=1.74&r2=1.75
--- device-mapper/WHATS_NEW 2007/01/15 18:21:01 1.147
+++ device-mapper/WHATS_NEW 2007/01/15 22:05:50 1.148
@@ -1,5 +1,6 @@
Version 1.02.15 -
===================================
+ Fix a malloc error path in dmsetup message.
More libdevmapper-event interface changes and fixes.
Rename dm_saprintf() to dm_asprintf().
Report error if NULL pointer is supplied to dm_strdup_aux().
--- device-mapper/dmeventd/dmeventd.c 2007/01/15 19:47:48 1.32
+++ device-mapper/dmeventd/dmeventd.c 2007/01/15 22:05:50 1.33
@@ -29,22 +29,11 @@
#include <dlfcn.h>
#include <errno.h>
-#include <fcntl.h>
-#include <libgen.h>
#include <pthread.h>
-#include <signal.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include <sys/file.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-#include <sys/stat.h>
#include <sys/wait.h>
-#include <sys/resource.h>
#include <unistd.h>
-#include <stdarg.h>
#include <arpa/inet.h> /* for htonl, ntohl */
#ifdef linux
--- device-mapper/dmsetup/dmsetup.c 2006/10/19 15:34:50 1.74
+++ device-mapper/dmsetup/dmsetup.c 2007/01/15 22:05:50 1.75
@@ -533,7 +533,11 @@
for (i = 0; i < argc; i++)
sz += strlen(argv[i]) + 1;
- str = dm_malloc(sz);
+ if (!(str = dm_malloc(sz))) {
+ err("message string allocation failed");
+ goto out;
+ }
+
memset(str, 0, sz);
for (i = 0; i < argc; i++) {
^ permalink raw reply [flat|nested] 6+ messages in thread
* device-mapper ./WHATS_NEW dmeventd/dmeventd.c ...
@ 2007-01-23 17:38 agk
0 siblings, 0 replies; 6+ messages in thread
From: agk @ 2007-01-23 17:38 UTC (permalink / raw)
To: dm-cvs, dm-devel
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: agk@sourceware.org 2007-01-23 17:38:39
Modified files:
. : WHATS_NEW
dmeventd : dmeventd.c libdevmapper-event.h
lib : libdm-report.c
Log message:
add a dso-private variable to dmeventd interface
more inline docn
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.156&r2=1.157
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.43&r2=1.44
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.h.diff?cvsroot=dm&r1=1.12&r2=1.13
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/libdm-report.c.diff?cvsroot=dm&r1=1.6&r2=1.7
--- device-mapper/WHATS_NEW 2007/01/22 15:03:56 1.156
+++ device-mapper/WHATS_NEW 2007/01/23 17:38:38 1.157
@@ -1,5 +1,6 @@
Version 1.02.16 -
===================================
+ Add a dso-private variable to dmeventd dso interface.
Add dm_event_handler_[gs]et_timeout functions.
Streamline dm_report_field_* interface.
Add cmdline debug & version options to dmeventd.
--- device-mapper/dmeventd/dmeventd.c 2007/01/22 15:03:57 1.43
+++ device-mapper/dmeventd/dmeventd.c 2007/01/23 17:38:39 1.44
@@ -77,6 +77,19 @@
*/
static pthread_mutex_t _global_mutex;
+/*
+ There are three states a thread can attain (see struct
+ thread_status, field int status):
+
+ - DM_THREAD_RUNNING: thread has started up and is either working or
+ waiting for events... transitions to either SHUTDOWN or DONE
+ - DM_THREAD_SHUTDOWN: thread is still doing something, but it is
+ supposed to terminate (and transition to DONE) as soon as it
+ finishes whatever it was doing at the point of flipping state to
+ SHUTDOWN... the thread is still on the thread list
+ - DM_THREAD_DONE: thread has terminated and has been moved over to
+ unused thread list, cleanup pending
+ */
#define DM_THREAD_RUNNING 0
#define DM_THREAD_SHUTDOWN 1
#define DM_THREAD_DONE 2
@@ -106,7 +119,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_mask event);
+ void (*process_event)(struct dm_task *dmt, enum dm_event_mask event, void **user);
/*
* Device registration.
@@ -117,7 +130,7 @@
* and activate a mapping).
*/
int (*register_device)(const char *device, const char *uuid, int major,
- int minor);
+ int minor, void **user);
/*
* Device unregistration.
@@ -127,7 +140,7 @@
* steps (eg, deactivate mapping, metadata update).
*/
int (*unregister_device)(const char *device, const char *uuid,
- int major, int minor);
+ int major, int minor, void **user);
};
static LIST_INIT(_dso_registry);
@@ -166,13 +179,16 @@
} device;
uint32_t event_nr; /* event number */
int processing; /* Set when event is being processed */
- int status; /* running/shutdown/done */
+
+ int status; /* see DM_THREAD_{RUNNING,SHUTDOWN,DONE}
+ constants above */
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;
struct list timeout_list;
+ void *dso_private; /* dso per-thread status variable */
};
static LIST_INIT(_thread_registry);
static LIST_INIT(_thread_registry_unused);
@@ -630,7 +646,8 @@
return thread->dso_data->register_device(thread->device.name,
thread->device.uuid,
thread->device.major,
- thread->device.minor);
+ thread->device.minor,
+ &(thread->dso_private));
}
/* Unregister a device with the DSO. */
@@ -639,13 +656,14 @@
return thread->dso_data->unregister_device(thread->device.name,
thread->device.uuid,
thread->device.major,
- thread->device.minor);
+ thread->device.minor,
+ &(thread->dso_private));
}
/* Process an event in the DSO. */
static void _do_process_event(struct thread_status *thread, struct dm_task *task)
{
- thread->dso_data->process_event(task, thread->current_events);
+ thread->dso_data->process_event(task, thread->current_events, &(thread->dso_private));
}
/* Thread cleanup handler to unregister device. */
@@ -1107,22 +1125,25 @@
if (!hit)
goto out;
- goto out; /* FIXME the next == 1 thing is currently horridly
- broken, do something about it... */
+ thread = hit;
- do {
+ while (1) {
if (list_end(&_thread_registry, &thread->list))
goto out;
thread = list_item(thread->list.n, struct thread_status);
- } while (!_want_registered_device(message_data->dso_name, NULL, thread));
+ if (_want_registered_device(message_data->dso_name, NULL, thread)) {
+ hit = thread;
+ break;
+ }
+ }
_unlock_mutex();
- return _registered_device(message_data, thread);
+ return _registered_device(message_data, hit);
out:
_unlock_mutex();
-
+
return -ENOENT;
}
--- device-mapper/dmeventd/libdevmapper-event.h 2007/01/22 15:03:57 1.12
+++ device-mapper/dmeventd/libdevmapper-event.h 2007/01/23 17:38:39 1.13
@@ -98,9 +98,9 @@
/* 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 *device_name, const char *uuid, int major, int minor);
+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);
+ int minor, void **user);
#endif
--- device-mapper/lib/libdm-report.c 2007/01/22 15:03:57 1.6
+++ device-mapper/lib/libdm-report.c 2007/01/23 17:38:39 1.7
@@ -757,8 +757,7 @@
/* Print and clear buffer */
list_iterate_safe(rowh, rtmp, &rh->rows) {
if (!dm_pool_begin_object(rh->mem, 512)) {
- log_error("dm_report: "
- "dm_pool_begin_object failed for row");
+ log_error("dm_report: Unable to allocate output line");
return 0;
}
row = list_item(rowh, struct row);
@@ -771,35 +770,48 @@
width = field->props->width;
if (!(rh->flags & DM_REPORT_OUTPUT_ALIGNED)) {
if (!dm_pool_grow_object(rh->mem, repstr,
- strlen(repstr)))
- goto bad_grow;
+ strlen(repstr))) {
+ log_error("dm_report: Unable to extend output line");
+ goto bad;
+ }
} else {
if (!(align = field->props->flags & DM_REPORT_FIELD_ALIGN_MASK))
align = (field->props->flags & DM_REPORT_FIELD_TYPE_NUMBER) ?
DM_REPORT_FIELD_ALIGN_RIGHT : DM_REPORT_FIELD_ALIGN_LEFT;
if (align & DM_REPORT_FIELD_ALIGN_LEFT) {
if (dm_snprintf(buf, sizeof(buf), "%-*.*s",
- width, width, repstr) < 0)
- goto bad_snprintf;
- if (!dm_pool_grow_object(rh->mem, buf, width))
- goto bad_grow;
+ width, width, repstr) < 0) {
+ log_error("dm_report: left-aligned snprintf() failed");
+ goto bad;
+ }
+ if (!dm_pool_grow_object(rh->mem, buf, width)) {
+ log_error("dm_report: Unable to extend output line");
+ goto bad;
+ }
} else if (align & DM_REPORT_FIELD_ALIGN_RIGHT) {
if (dm_snprintf(buf, sizeof(buf), "%*.*s",
- width, width, repstr) < 0)
- goto bad_snprintf;
+ width, width, repstr) < 0) {
+ log_error("dm_report: right-aligned snprintf() failed");
+ goto bad;
+ }
if (!dm_pool_grow_object(rh->mem, buf, width))
- goto bad_grow;
+ log_error("dm_report: Unable to extend output line");
+ goto bad;
}
}
if (!list_end(&row->fields, fh))
if (!dm_pool_grow_object(rh->mem, rh->separator,
- strlen(rh->separator)))
- goto bad_grow;
+ strlen(rh->separator))) {
+ log_error("dm_report: Unable to extend output line");
+ goto bad;
+ }
list_del(&field->list);
}
- if (!dm_pool_grow_object(rh->mem, "\0", 1))
- goto bad_grow;
+ if (!dm_pool_grow_object(rh->mem, "\0", 1)) {
+ log_error("dm_report: Unable to terminate output line");
+ goto bad;
+ }
log_print("%s", (char *) dm_pool_end_object(rh->mem));
list_del(&row->list);
}
@@ -809,10 +821,7 @@
return 1;
- bad_snprintf:
- log_error("dm_report: snprintf row failed");
- bad_grow:
- log_error("dm_report: Failed to generate row for printing");
+ bad:
dm_pool_abandon_object(rh->mem);
return 0;
}
^ permalink raw reply [flat|nested] 6+ messages in thread
* device-mapper ./WHATS_NEW dmeventd/dmeventd.c ...
@ 2007-01-25 14:16 agk
0 siblings, 0 replies; 6+ messages in thread
From: agk @ 2007-01-25 14:16 UTC (permalink / raw)
To: dm-cvs, dm-devel
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: agk@sourceware.org 2007-01-25 14:16:21
Modified files:
. : WHATS_NEW
dmeventd : dmeventd.c
dmsetup : dmsetup.c
lib/ioctl : libdm-iface.c
Log message:
Add some missing close() and fclose() return value checks.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.159&r2=1.160
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.44&r2=1.45
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmsetup/dmsetup.c.diff?cvsroot=dm&r1=1.79&r2=1.80
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/ioctl/libdm-iface.c.diff?cvsroot=dm&r1=1.40&r2=1.41
--- device-mapper/WHATS_NEW 2007/01/24 18:09:06 1.159
+++ device-mapper/WHATS_NEW 2007/01/25 14:16:20 1.160
@@ -1,5 +1,6 @@
Version 1.02.16 -
===================================
+ Add some missing close() and fclose() return value checks.
Migrate dmsetup column-based output over to new libdevmapper report framework.
Add descriptions to reporting field definitions.
Add a dso-private variable to dmeventd dso interface.
--- device-mapper/dmeventd/dmeventd.c 2007/01/23 17:38:39 1.44
+++ device-mapper/dmeventd/dmeventd.c 2007/01/25 14:16:20 1.45
@@ -1566,7 +1566,8 @@
}
fprintf(fp, "%i", val);
- fclose(fp);
+ if (fclose(fp))
+ perror(OOM_ADJ_FILE ": fclose failed");
return 1;
}
@@ -1583,7 +1584,7 @@
sigemptyset(&my_sigset);
if (sigprocmask(SIG_SETMASK, &my_sigset, NULL) < 0) {
- fprintf(stderr, "Unable to restore signals.");
+ fprintf(stderr, "Unable to restore signals.\n");
exit(EXIT_FAILURE);
}
signal(SIGTERM, &_exit_handler);
--- device-mapper/dmsetup/dmsetup.c 2007/01/24 18:09:07 1.79
+++ device-mapper/dmsetup/dmsetup.c 2007/01/25 14:16:20 1.80
@@ -231,8 +231,9 @@
#else
free(buffer);
#endif
- if (file)
- fclose(fp);
+ if (file && fclose(fp))
+ fprintf(stderr, "%s: fclose failed: %s", file, strerror(errno));
+
return r;
}
@@ -1479,7 +1480,7 @@
static int _int32_disp(struct dm_report *rh,
struct dm_pool *mem __attribute((unused)),
struct dm_report_field *field, const void *data,
- void *private)
+ void *private __attribute((unused)))
{
const int32_t value = *(const int32_t *)data;
@@ -1489,7 +1490,7 @@
static int _uint32_disp(struct dm_report *rh,
struct dm_pool *mem __attribute((unused)),
struct dm_report_field *field, const void *data,
- void *private)
+ void *private __attribute((unused)))
{
const uint32_t value = *(const int32_t *)data;
@@ -1499,7 +1500,7 @@
static int _dm_name_disp(struct dm_report *rh,
struct dm_pool *mem __attribute((unused)),
struct dm_report_field *field, const void *data,
- void *private)
+ void *private __attribute((unused)))
{
const char *name = dm_task_get_name((struct dm_task *) data);
@@ -1509,7 +1510,7 @@
static int _dm_uuid_disp(struct dm_report *rh,
struct dm_pool *mem __attribute((unused)),
struct dm_report_field *field,
- const void *data, void *private)
+ const void *data, void *private __attribute((unused)))
{
const char *uuid = dm_task_get_uuid((struct dm_task *) data);
@@ -1522,7 +1523,7 @@
static int _dm_info_status_disp(struct dm_report *rh,
struct dm_pool *mem __attribute((unused)),
struct dm_report_field *field, const void *data,
- void *private)
+ void *private __attribute((unused)))
{
char buf[5];
const char *s = buf;
@@ -1607,7 +1608,7 @@
options = _string_args[OPTIONS_ARG];
else {
len = strlen(default_report_options) +
- strlen(_string_args[OPTIONS_ARG]);
+ strlen(_string_args[OPTIONS_ARG]) + 1;
if (!(options = dm_malloc(len))) {
err("Failed to allocate option string.");
return 0;
--- device-mapper/lib/ioctl/libdm-iface.c 2007/01/08 15:18:52 1.40
+++ device-mapper/lib/ioctl/libdm-iface.c 2007/01/25 14:16:20 1.41
@@ -149,7 +149,8 @@
if (!strcmp(name, nm)) {
if (number) {
*number = num;
- fclose(fl);
+ if (fclose(fl))
+ log_error("%s: fclose failed: %s", file, strerror(errno));
return 1;
}
dm_bit_set(_dm_bitset, num);
@@ -158,7 +159,8 @@
c = fgetc(fl);
} while (c != EOF && c != '\n');
}
- fclose(fl);
+ if (fclose(fl))
+ log_error("%s: fclose failed: %s", file, strerror(errno));
if (number) {
log_error("%s: No entry for %s found", file, name);
@@ -1322,7 +1324,7 @@
dir = dm_dir();
if (!(d = opendir(dir))) {
- fprintf(stderr, "opendir %s: %s", dir, strerror(errno));
+ log_error("opendir %s: %s", dir, strerror(errno));
return 0;
}
@@ -1335,9 +1337,8 @@
dm_task_run(dmt);
}
- if (closedir(d)) {
- fprintf(stderr, "closedir %s: %s", dir, strerror(errno));
- }
+ if (closedir(d))
+ log_error("closedir %s: %s", dir, strerror(errno));
return r;
}
^ permalink raw reply [flat|nested] 6+ messages in thread
* device-mapper ./WHATS_NEW dmeventd/dmeventd.c ...
@ 2007-02-02 17:08 agk
0 siblings, 0 replies; 6+ messages in thread
From: agk @ 2007-02-02 17:08 UTC (permalink / raw)
To: dm-cvs, dm-devel
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: agk@sourceware.org 2007-02-02 17:08:51
Modified files:
. : WHATS_NEW
dmeventd : dmeventd.c dmeventd.h libdevmapper-event.c
Log message:
Improve dmeventd messaging protocol: drain pipe and tag messages.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.168&r2=1.169
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.45&r2=1.46
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.h.diff?cvsroot=dm&r1=1.3&r2=1.4
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/libdevmapper-event.c.diff?cvsroot=dm&r1=1.20&r2=1.21
--- device-mapper/WHATS_NEW 2007/01/29 20:25:19 1.168
+++ device-mapper/WHATS_NEW 2007/02/02 17:08:51 1.169
@@ -1,5 +1,6 @@
Version 1.02.18 -
===================================
+ Improve dmeventd messaging protocol: drain pipe and tag messages.
Version 1.02.17 - 29th January 2007
===================================
--- device-mapper/dmeventd/dmeventd.c 2007/01/25 14:16:20 1.45
+++ device-mapper/dmeventd/dmeventd.c 2007/02/02 17:08:51 1.46
@@ -146,6 +146,7 @@
/* Structure to keep parsed register variables from client message. */
struct message_data {
+ char *id;
char *dso_name; /* Name of DSO. */
char *device_uuid; /* Mapped device path. */
union {
@@ -320,6 +321,8 @@
/* Free message memory. */
static void _free_message(struct message_data *message_data)
{
+ if (message_data->id)
+ dm_free(message_data->id);
if (message_data->dso_name)
dm_free(message_data->dso_name);
@@ -342,7 +345,8 @@
* Retrieve application identifier, mapped device
* path and events # string from message.
*/
- if (_fetch_string(&message_data->dso_name, &p, ' ') &&
+ if (_fetch_string(&message_data->id, &p, ' ') &&
+ _fetch_string(&message_data->dso_name, &p, ' ') &&
_fetch_string(&message_data->device_uuid, &p, ' ') &&
_fetch_string(&message_data->events.str, &p, ' ') &&
_fetch_string(&message_data->timeout.str, &p, ' ')) {
@@ -875,8 +879,8 @@
syslog(LOG_ERR, "dmeventd %s dlopen failed: %s", data->dso_name,
dlerr);
data->msg->size =
- dm_asprintf(&(data->msg->data), "%s dlopen failed: %s",
- data->dso_name, dlerr);
+ dm_asprintf(&(data->msg->data), "%s %s dlopen failed: %s",
+ data->id, data->dso_name, dlerr);
return NULL;
}
@@ -1056,7 +1060,8 @@
{
struct dm_event_daemon_message *msg = message_data->msg;
- const char *fmt = "%s %s %u";
+ const char *fmt = "%s %s %s %u";
+ const char *id = message_data->id;
const char *dso = thread->dso_data->dso_name;
const char *dev = thread->device.uuid;
unsigned events = ((thread->status == DM_THREAD_RUNNING)
@@ -1066,7 +1071,7 @@
if (msg->data)
dm_free(msg->data);
- msg->size = dm_asprintf(&(msg->data), fmt, dso, dev, events);
+ msg->size = dm_asprintf(&(msg->data), fmt, id, dso, dev, events);
_unlock_mutex();
@@ -1180,7 +1185,8 @@
_lock_mutex();
if ((thread = _lookup_thread_status(message_data))) {
msg->size =
- dm_asprintf(&(msg->data), "%" PRIu32, thread->timeout);
+ dm_asprintf(&(msg->data), "%s %" PRIu32, message_data->id,
+ thread->timeout);
} else {
msg->data = NULL;
msg->size = 0;
@@ -1375,17 +1381,32 @@
static int _do_process_request(struct dm_event_daemon_message *msg)
{
int ret;
+ char *answer;
static struct message_data message_data;
/* Parse the message. */
memset(&message_data, 0, sizeof(message_data));
message_data.msg = msg;
- if (msg->cmd != DM_EVENT_CMD_ACTIVE && !_parse_message(&message_data)) {
+ if (msg->cmd == DM_EVENT_CMD_HELLO) {
+ ret = 0;
+ answer = dm_strdup(msg->data);
+ if (answer) {
+ msg->size = dm_asprintf(&(msg->data), "%s HELLO", answer);
+ dm_free(answer);
+ } else {
+ msg->size = 0;
+ msg->data = NULL;
+ }
+ } else if (msg->cmd != DM_EVENT_CMD_ACTIVE && !_parse_message(&message_data)) {
stack;
ret = -EINVAL;
} else
ret = _handle_request(msg, &message_data);
+ msg->cmd = ret;
+ if (!msg->data)
+ msg->size = dm_asprintf(&(msg->data), "%s %s", message_data.id, strerror(-ret));
+
_free_message(&message_data);
return ret;
@@ -1405,16 +1426,9 @@
if (!_client_read(fifos, &msg))
return;
- msg.cmd = _do_process_request(&msg);
- if (!msg.data) {
- msg.data = dm_strdup(strerror(-msg.cmd));
- if (msg.data)
- msg.size = strlen(msg.data) + 1;
- else {
- msg.size = 0;
- stack;
- }
- }
+ /* _do_process_request fills in msg (if memory allows for
+ data, otherwise just cmd and size = 0) */
+ _do_process_request(&msg);
if (!_client_write(fifos, &msg))
stack;
--- device-mapper/dmeventd/dmeventd.h 2007/01/08 15:18:52 1.3
+++ device-mapper/dmeventd/dmeventd.h 2007/02/02 17:08:51 1.4
@@ -20,6 +20,7 @@
DM_EVENT_CMD_GET_NEXT_REGISTERED_DEVICE,
DM_EVENT_CMD_SET_TIMEOUT,
DM_EVENT_CMD_GET_TIMEOUT,
+ DM_EVENT_CMD_HELLO,
};
/* Message passed between client and daemon. */
--- device-mapper/dmeventd/libdevmapper-event.c 2007/01/22 15:03:57 1.20
+++ device-mapper/dmeventd/libdevmapper-event.c 2007/02/02 17:08:51 1.21
@@ -30,6 +30,8 @@
#include <sys/wait.h>
#include <arpa/inet.h> /* for htonl, ntohl */
+static int _sequence_nr = 0;
+
struct dm_event_handler {
char *dso;
@@ -182,6 +184,21 @@
return dmevh->mask;
}
+static int _check_message_id(struct dm_event_daemon_message *msg)
+{
+ int pid, seq_nr;
+
+ if ((sscanf(msg->data, "%d:%d", &pid, &seq_nr) != 2) ||
+ (pid != getpid()) || (seq_nr != _sequence_nr)) {
+ log_error("Ignoring out-of-sequence reply from dmeventd. "
+ "Expected %d:%d but received %s", getpid(),
+ _sequence_nr, msg->data);
+ return 0;
+ }
+
+ return 1;
+}
+
/*
* daemon_read
* @fifos
@@ -260,11 +277,28 @@
size_t size = 2 * sizeof(uint32_t) + msg->size;
char *buf = alloca(size);
+ char drainbuf[128];
+ struct timeval tval = { 0, 0 };
*((uint32_t *)buf) = htonl(msg->cmd);
*((uint32_t *)buf + 1) = htonl(msg->size);
memcpy(buf + 2 * sizeof(uint32_t), msg->data, msg->size);
+ /* drain the answer fifo */
+ while (1) {
+ FD_ZERO(&fds);
+ FD_SET(fifos->server, &fds);
+ tval.tv_usec = 100;
+ ret = select(fifos->server + 1, &fds, NULL, NULL, &tval);
+ if ((ret < 0) && (errno != EINTR)) {
+ log_error("Unable to talk to event daemon");
+ return 0;
+ }
+ if (ret == 0)
+ break;
+ read(fifos->server, drainbuf, 127);
+ }
+
while (bytes < size) {
do {
/* Watch daemon write FIFO to be ready for output. */
@@ -301,7 +335,7 @@
{
const char *dso = dso_name ? dso_name : "";
const char *dev = dev_name ? dev_name : "";
- const char *fmt = "%s %s %u %" PRIu32;
+ const char *fmt = "%d:%d %s %s %u %" PRIu32;
int msg_size;
memset(msg, 0, sizeof(*msg));
@@ -310,8 +344,10 @@
* into ASCII message string.
*/
msg->cmd = cmd;
- if ((msg_size = dm_asprintf(&(msg->data), fmt, dso, dev, evmask,
- timeout)) < 0) {
+ if (cmd == DM_EVENT_CMD_HELLO)
+ fmt = "%d:%d HELLO";
+ if ((msg_size = dm_asprintf(&(msg->data), fmt, getpid(), _sequence_nr,
+ dso, dev, evmask, timeout)) < 0) {
log_error("_daemon_talk: message allocation failed");
return -ENOMEM;
}
@@ -326,10 +362,14 @@
return -EIO;
}
- if (!_daemon_read(fifos, msg)) {
- stack;
- return -EIO;
- }
+ do {
+ if (!_daemon_read(fifos, msg)) {
+ stack;
+ return -EIO;
+ }
+ } while (!_check_message_id(msg));
+
+ _sequence_nr++;
return (int32_t) msg->cmd;
}
@@ -507,7 +547,9 @@
return -ESRCH;
}
- ret = _daemon_talk(&fifos, msg, cmd, dso_name, dev_name, evmask, timeout);
+ ret = _daemon_talk(&fifos, msg, DM_EVENT_CMD_HELLO, 0, 0, 0, 0);
+ if (!ret)
+ ret = _daemon_talk(&fifos, msg, cmd, dso_name, dev_name, evmask, timeout);
/* what is the opposite of init? */
_dtr_client(&fifos);
@@ -521,7 +563,7 @@
int ret = 1, err;
const char *uuid;
struct dm_task *dmt;
- struct dm_event_daemon_message msg;
+ struct dm_event_daemon_message msg = { 0, 0, NULL };
if (!(dmt = _get_device_info(dmevh))) {
stack;
@@ -551,7 +593,7 @@
int ret = 1, err;
const char *uuid;
struct dm_task *dmt;
- struct dm_event_daemon_message msg;
+ struct dm_event_daemon_message msg = { 0, 0, NULL };
if (!(dmt = _get_device_info(dmevh))) {
stack;
@@ -598,15 +640,20 @@
static int _parse_message(struct dm_event_daemon_message *msg, char **dso_name,
char **uuid, enum dm_event_mask *evmask)
{
+ char *id = NULL;
char *p = msg->data;
- if ((*dso_name = _fetch_string(&p, ' ')) &&
+ if ((id = _fetch_string(&p, ' ')) &&
+ (*dso_name = _fetch_string(&p, ' ')) &&
(*uuid = _fetch_string(&p, ' '))) {
*evmask = atoi(p);
+ dm_free(id);
return 0;
}
+ if (id)
+ dm_free(id);
return -ENOMEM;
}
@@ -621,12 +668,12 @@
*/
int dm_event_get_registered_device(struct dm_event_handler *dmevh, int next)
{
- int ret;
+ int ret = 0;
const char *uuid = NULL;
char *reply_dso = NULL, *reply_uuid = NULL;
- enum dm_event_mask reply_mask;
- struct dm_task *dmt;
- struct dm_event_daemon_message msg;
+ enum dm_event_mask reply_mask = 0;
+ struct dm_task *dmt = NULL;
+ struct dm_event_daemon_message msg = { 0, 0, NULL };
if (!(dmt = _get_device_info(dmevh))) {
stack;
@@ -696,9 +743,17 @@
#if 0 /* left out for now */
+static char *_skip_string(char *src, const int delimiter)
+{
+ src = srtchr(src, delimiter);
+ if (src && *(src + 1))
+ return src + 1;
+ return NULL;
+}
+
int dm_event_set_timeout(const char *device_path, uint32_t timeout)
{
- struct dm_event_daemon_message msg;
+ struct dm_event_daemon_message msg = { 0, 0, NULL };
if (!device_exists(device_path))
return -ENODEV;
@@ -710,13 +765,20 @@
int dm_event_get_timeout(const char *device_path, uint32_t *timeout)
{
int ret;
- struct dm_event_daemon_message msg;
+ struct dm_event_daemon_message msg = { 0, 0, NULL };
if (!device_exists(device_path))
return -ENODEV;
if (!(ret = _do_event(DM_EVENT_CMD_GET_TIMEOUT, &msg, NULL, device_path,
- 0, 0)))
- *timeout = atoi(msg.data);
+ 0, 0))) {
+ char *p = _skip_string(msg.data, ' ');
+ if (!p) {
+ log_error("malformed reply from dmeventd '%s'\n",
+ msg.data);
+ return -EIO;
+ }
+ *timeout = atoi(p);
+ }
if (msg.data)
dm_free(msg.data);
return ret;
^ permalink raw reply [flat|nested] 6+ messages in thread
* device-mapper ./WHATS_NEW dmeventd/dmeventd.c ...
@ 2007-03-16 14:36 agk
0 siblings, 0 replies; 6+ messages in thread
From: agk @ 2007-03-16 14:36 UTC (permalink / raw)
To: dm-cvs, dm-devel
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: agk@sourceware.org 2007-03-16 14:36:16
Modified files:
. : WHATS_NEW
dmeventd : dmeventd.c
multilog : libmultilog.c
multilog/pthread_lock: pthread_lock.c
Log message:
Remove unnecessary memset() return value checks. [Jim Meyering]
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.172&r2=1.173
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.46&r2=1.47
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/multilog/libmultilog.c.diff?cvsroot=dm&r1=1.17&r2=1.18
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/multilog/pthread_lock/pthread_lock.c.diff?cvsroot=dm&r1=1.1&r2=1.2
--- device-mapper/WHATS_NEW 2007/02/14 15:12:14 1.172
+++ device-mapper/WHATS_NEW 2007/03/16 14:36:14 1.173
@@ -1,5 +1,6 @@
Version 1.02.19 -
====================================
+ Remove unnecessary memset() return value checks.
Fix a few leaks in reporting error paths. [1.02.15+]
Version 1.02.18 - 13th February 2007
--- device-mapper/dmeventd/dmeventd.c 2007/02/02 17:08:51 1.46
+++ device-mapper/dmeventd/dmeventd.c 2007/03/16 14:36:14 1.47
@@ -226,8 +226,8 @@
if (!ret)
return NULL;
- if (!memset(ret, 0, sizeof(*ret)) ||
- !(ret->device.uuid = dm_strdup(data->device_uuid))) {
+ memset(ret, 0, sizeof(*ret));
+ if (!(ret->device.uuid = dm_strdup(data->device_uuid))) {
dm_free(ret);
return NULL;
}
@@ -258,8 +258,8 @@
if (!ret)
return NULL;
- if (!memset(ret, 0, sizeof(*ret)) ||
- !(ret->dso_name = dm_strdup(data->dso_name))) {
+ memset(ret, 0, sizeof(*ret));
+ if (!(ret->dso_name = dm_strdup(data->dso_name))) {
dm_free(ret);
return NULL;
}
--- device-mapper/multilog/libmultilog.c 2005/06/08 15:11:21 1.17
+++ device-mapper/multilog/libmultilog.c 2007/03/16 14:36:16 1.18
@@ -294,10 +294,11 @@
/*
* Preallocate because we don't want to sleep holding a lock.
*/
- if (!(logl = malloc(sizeof(*logl))) ||
- !(memset(logl, 0, sizeof(*logl))))
+ if (!(logl = malloc(sizeof(*logl))))
return 0;
+ memset(logl, 0, sizeof(*logl));
+
/*
* If the type has already been registered, it doesn't need to
* be registered again. This means the caller will need to
@@ -315,11 +316,7 @@
logl->type = type;
- if(!memset(&logl->data, 0, sizeof(logl->data))) {
- /* Should never get here */
- free(logl);
- return 0;
- }
+ memset(&logl->data, 0, sizeof(logl->data));
logl->data.verbose_level = DEFAULT_VERBOSITY;
logl->log = nop_log;
--- device-mapper/multilog/pthread_lock/pthread_lock.c 2005/05/04 17:55:12 1.1
+++ device-mapper/multilog/pthread_lock/pthread_lock.c 2007/03/16 14:36:16 1.2
@@ -28,8 +28,8 @@
pthread_mutex_t *mutex;
if(!(mutex = malloc(sizeof(*mutex))))
return NULL;
- if(!memset(mutex, 0, sizeof(*mutex)))
- return NULL;
+ memset(mutex, 0, sizeof(*mutex));
+
/*
* Hack to ensure DSO loading fails if not linked with
* libpthread
^ permalink raw reply [flat|nested] 6+ messages in thread
* device-mapper ./WHATS_NEW dmeventd/dmeventd.c ...
@ 2007-07-24 14:16 meyering
0 siblings, 0 replies; 6+ messages in thread
From: meyering @ 2007-07-24 14:16 UTC (permalink / raw)
To: dm-cvs, dm-devel
CVSROOT: /cvs/dm
Module name: device-mapper
Changes by: meyering@sourceware.org 2007-07-24 14:16:48
Modified files:
. : WHATS_NEW
dmeventd : dmeventd.c
lib/fs : libdevmapper.c
Log message:
libdevmapper, dmeventd: be paranoid about detecting write failure
* dmeventd/dmeventd.c (_set_oom_adj): When writing to /proc/self/oom_adj,
detect failure even if it's hidden behind ferror. [Using dm_fclose's
extra ferror test here is probably not needed, since the amount written
is nowhere near BUFSIZ, but use it regardless, for consistency. ]
* lib/fs/libdevmapper.c (do_suspend): Detect fclose failure when
writing to suspend.
Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/WHATS_NEW.diff?cvsroot=dm&r1=1.192&r2=1.193
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/dmeventd/dmeventd.c.diff?cvsroot=dm&r1=1.49&r2=1.50
http://sourceware.org/cgi-bin/cvsweb.cgi/device-mapper/lib/fs/libdevmapper.c.diff?cvsroot=dm&r1=1.13&r2=1.14
--- device-mapper/WHATS_NEW 2007/07/24 14:15:45 1.192
+++ device-mapper/WHATS_NEW 2007/07/24 14:16:48 1.193
@@ -1,6 +1,7 @@
Version 1.02.22 -
================================
dm_fclose: new function
+ libdevmapper, dmeventd: be paranoid about detecting write failure
Version 1.02.21 - 13th July 2007
================================
--- device-mapper/dmeventd/dmeventd.c 2007/04/24 13:29:02 1.49
+++ device-mapper/dmeventd/dmeventd.c 2007/07/24 14:16:48 1.50
@@ -1579,7 +1579,7 @@
}
fprintf(fp, "%i", val);
- if (fclose(fp))
+ if (dm_fclose(fp))
perror(OOM_ADJ_FILE ": fclose failed");
return 1;
--- device-mapper/lib/fs/libdevmapper.c 2004/03/30 19:08:57 1.13
+++ device-mapper/lib/fs/libdevmapper.c 2007/07/24 14:16:48 1.14
@@ -150,7 +150,8 @@
ret = 1;
else
log_error("%s: fputc failed: %s", path, strerror(errno));
- fclose(fp);
+ if (fclose(fp))
+ log_error("%s: write failed: %s", path, strerror(errno));
} else
log_error("%s: fopen failed: %s", path, strerror(errno));
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2007-07-24 14:16 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-02-02 17:08 device-mapper ./WHATS_NEW dmeventd/dmeventd.c agk
-- strict thread matches above, loose matches on Subject: below --
2007-07-24 14:16 meyering
2007-03-16 14:36 agk
2007-01-25 14:16 agk
2007-01-23 17:38 agk
2007-01-15 22:05 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.