Here's what happened when I started adjusting the APIs in confdb.h. Changing void* to const void* propagated, of course. Changing int to size_t exposed the problem that tail_key_changed (and two other functions nearby) would mistakenly print non-printing (aka garbage) or incomplete object, key, value strings.
I fixed that by adding a small helper function. If you like this, I'll also fix the two similar functions right below tail_key_changed that have the same problem. >From 6a4fa1dc2b5420a383304bdf3b39777c4e6954fb Mon Sep 17 00:00:00 2001 From: Jim Meyering <[email protected]> Date: Wed, 1 Apr 2009 13:39:01 +0200 Subject: [PATCH 1/3] condb.h: change void* params to "const void *" * include/corosync/confdb.h (confdb_key_change_notify_fn_t) --- include/corosync/confdb.h | 8 ++++---- 1 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/corosync/confdb.h b/include/corosync/confdb.h index efb3fd2..ecc1ff6 100644 --- a/include/corosync/confdb.h +++ b/include/corosync/confdb.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008 Red Hat, Inc. + * Copyright (c) 2008, 2009 Red Hat, Inc. * * All rights reserved. * @@ -62,11 +62,11 @@ typedef void (*confdb_key_change_notify_fn_t) ( confdb_change_type_t change_type, hdb_handle_t parent_object_handle, hdb_handle_t object_handle, - void *object_name, + const void *object_name, int object_name_len, - void *key_name, + const void *key_name, int key_name_len, - void *key_value, + const void *key_value, int key_value_len); typedef void (*confdb_object_create_notify_fn_t) ( -- 1.6.2.rc1.285.gc5f54 >From 943d0317deb489b10cfcf7fccc1aae99add495fa Mon Sep 17 00:00:00 2001 From: Jim Meyering <[email protected]> Date: Wed, 1 Apr 2009 16:44:35 +0200 Subject: [PATCH 2/3] confdb.h: add "const" * include/corosync/confdb.h (confdb_key_change_notify_fn_t): Make 3 params const. * tools/corosync-objctl.c (find_object_of_type_t, callbacks): (tail_key_changed): Don't write into would-be-const members. --- tools/corosync-objctl.c | 26 +++++++++++--------------- 1 files changed, 11 insertions(+), 15 deletions(-) diff --git a/tools/corosync-objctl.c b/tools/corosync-objctl.c index 4f370d7..d0db93b 100644 --- a/tools/corosync-objctl.c +++ b/tools/corosync-objctl.c @@ -71,11 +71,11 @@ static void tail_key_changed(confdb_handle_t handle, confdb_change_type_t change_type, hdb_handle_t parent_object_handle, hdb_handle_t object_handle, - void *object_name, + const void *object_name, int object_name_len, - void *key_name, + const void *key_name, int key_name_len, - void *key_value, + const void *key_value, int key_value_len); static void tail_object_created(confdb_handle_t handle, @@ -89,7 +89,7 @@ static void tail_object_deleted(confdb_handle_t handle, uint8_t *name_pt, int name_len); -confdb_callbacks_t callbacks = { +static confdb_callbacks_t callbacks = { .confdb_key_change_notify_fn = tail_key_changed, .confdb_object_create_change_notify_fn = tail_object_created, .confdb_object_delete_change_notify_fn = tail_object_deleted, @@ -394,21 +394,17 @@ static void tail_key_changed(confdb_handle_t handle, confdb_change_type_t change_type, hdb_handle_t parent_object_handle, hdb_handle_t object_handle, - void *object_name_pt, + const void *object_name_pt, int object_name_len, - void *key_name_pt, + const void *key_name_pt, int key_name_len, - void *key_value_pt, + const void *key_value_pt, int key_value_len) { - char * on = (char*)object_name_pt; - char * kn = (char*)key_name_pt; - char * kv = (char*)key_value_pt; - - on[object_name_len] = '\0'; - kv[key_value_len] = '\0'; - kn[key_name_len] = '\0'; - printf("key_changed> %s.%s=%s\n", on, kn, kv); + printf("key_changed> %.*s.%.*s=%.*s\n", + object_name_len, (const char *)object_name_pt, + key_name_len, (const char *)key_value_pt, + key_value_len, (const char *)key_value_pt); } static void tail_object_created(confdb_handle_t handle, -- 1.6.2.rc1.285.gc5f54 >From 80c5aa45c9949d8b175858afd5c4823e0bb56d3f Mon Sep 17 00:00:00 2001 From: Jim Meyering <[email protected]> Date: Wed, 1 Apr 2009 18:03:06 +0200 Subject: [PATCH 3/3] print "?" in place of non-printing bytes of obj/key/val values * tools/corosync-objctl.c: Include <ctype.h> (print_name): New function. (tail_key_changed): Use it to avoid printing garbage to screen. * include/corosync/confdb.h (confdb_key_change_notify_fn_t): Convert type of "int" length params to "size_t". --- include/corosync/confdb.h | 6 +++--- tools/corosync-objctl.c | 39 +++++++++++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 13 deletions(-) diff --git a/include/corosync/confdb.h b/include/corosync/confdb.h index ecc1ff6..19f6788 100644 --- a/include/corosync/confdb.h +++ b/include/corosync/confdb.h @@ -63,11 +63,11 @@ typedef void (*confdb_key_change_notify_fn_t) ( hdb_handle_t parent_object_handle, hdb_handle_t object_handle, const void *object_name, - int object_name_len, + size_t object_name_len, const void *key_name, - int key_name_len, + size_t key_name_len, const void *key_value, - int key_value_len); + size_t key_value_len); typedef void (*confdb_object_create_notify_fn_t) ( confdb_handle_t handle, diff --git a/tools/corosync-objctl.c b/tools/corosync-objctl.c index d0db93b..a544538 100644 --- a/tools/corosync-objctl.c +++ b/tools/corosync-objctl.c @@ -41,6 +41,7 @@ #include <signal.h> #include <unistd.h> #include <string.h> +#include <ctype.h> #include <sys/types.h> #include <sys/un.h> @@ -72,11 +73,11 @@ static void tail_key_changed(confdb_handle_t handle, hdb_handle_t parent_object_handle, hdb_handle_t object_handle, const void *object_name, - int object_name_len, + size_t object_name_len, const void *key_name, - int key_name_len, + size_t key_name_len, const void *key_value, - int key_value_len); + size_t key_value_len); static void tail_object_created(confdb_handle_t handle, hdb_handle_t parent_object_handle, @@ -390,21 +391,39 @@ static void create_object(confdb_handle_t handle, char * name_pt) } } +/* Print "?" in place of any non-printable byte of OBJ. */ +static void print_name (FILE *fp, const void *obj, size_t obj_len) +{ + const char *p = obj; + size_t i; + for (i = 0; i < obj_len; i++) { + int c = *p++; + if (!isprint (c)) { + c = '?'; + } + fputc (c, fp); + } +} + static void tail_key_changed(confdb_handle_t handle, confdb_change_type_t change_type, hdb_handle_t parent_object_handle, hdb_handle_t object_handle, const void *object_name_pt, - int object_name_len, + size_t object_name_len, const void *key_name_pt, - int key_name_len, + size_t key_name_len, const void *key_value_pt, - int key_value_len) + size_t key_value_len) { - printf("key_changed> %.*s.%.*s=%.*s\n", - object_name_len, (const char *)object_name_pt, - key_name_len, (const char *)key_value_pt, - key_value_len, (const char *)key_value_pt); + /* printf("key_changed> %.*s.%.*s=%.*s\n", */ + fputs("key_changed> ", stdout); + print_name (stdout, object_name_pt, object_name_len); + fputs(".", stdout); + print_name (stdout, key_name_pt, key_name_len); + fputs("=", stdout); + print_name (stdout, key_value_pt, key_value_len); + fputs("\n", stdout); } static void tail_object_created(confdb_handle_t handle, -- 1.6.2.rc1.285.gc5f54 _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
