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

Reply via email to