[Openais] [PATCH] V2 Fix debug function in logsys.c (Was: Re: Remove unused functions from logsys.c)

Andreas Florath gnu4u at flonatel.org
Fri Jun 4 23:31:23 PDT 2010


Hello!

Ok - looks that it's needed sometimes during debugging.

Attached a patch against svn version 2920 which (hopefully)
does The-Right-Thing and has no buffer overflow.
(IMHO also the debug-code should be bug-free ;-) ).

Kind regards

Andreas Florath

Signed-off-by: Andreas Florath <gnu4u at flonatel dot org>
---

Index: exec/logsys.c
===================================================================
--- exec/logsys.c	(revision 2920)
+++ exec/logsys.c	(working copy)
@@ -217,6 +217,130 @@
 /* forward declarations */
 static void logsys_close_logfile(int subsysid);

+#ifdef LOGSYS_DEBUG
+struct st_ls2str
+{
+	unsigned long  flag;
+	char const *   name;
+}
+	ls2str[] =
+	{
+		{ LOGSYS_MODE_OUTPUT_FILE,     "FILE" },
+		{ LOGSYS_MODE_OUTPUT_STDERR,   "STDERR" },
+		{ LOGSYS_MODE_OUTPUT_SYSLOG,   "SYSLOG" },
+		{ LOGSYS_MODE_FORK,            "FORK" },
+		{ LOGSYS_MODE_THREADED,        "THREADED" }
+	};
+
+/* This is a copy of the strncpy(3) function but it returns the
+ * index to the end of the dest string.
+ * This eliminates the need for additional strlen() calls. */
+static size_t mstrncpy(char *dest, const char *src, size_t n)
+{
+	size_t i;
+
+	for (i=0; i<n && src[i]!='\0'; ++i)
+		dest[i] = src[i];
+	dest[i] = '\0';
+
+	return i;
+}
+
+/* Appends exactly one string to the buffer.
+ * It takes care about the maximal size of buf and the comma
+ * handling between the words.
+ * The function recognizes the fact, that a comma must be inserted, on
+ * the condition whether the used_buf is 0 (->no comma prepended) or
+ * 1 (->comma prepended). */
+static void decode_mode_append(
+	unsigned int const mode, char * const buf, size_t const buflen,
+	struct st_ls2str const * const l2si, size_t * const used_buf)
+{
+	if (mode & l2si->flag)
+	{
+		if (*used_buf) buf[(*used_buf)++] = ',';
+		*used_buf += mstrncpy(buf+*used_buf, l2si->name,
+				      buflen-*used_buf-1);
+	}
+}
+
+/* Appends all modes with an index less than the given 'maxidx' to the
+ * buffer. */
+static char * decode_mode_maxidx(
+	unsigned int mode, char *buf, size_t buflen, int maxidx)
+{
+	int idx;
+	size_t used_buf = 0;
+	*buf = '\0';
+
+	/* buflen-1: the \0 must fit in the buffer */
+	for (idx=0; idx<maxidx && used_buf<buflen-1; ++idx)
+		decode_mode_append(
+			mode, buf, buflen, &ls2str[idx], &used_buf);
+	return buf;
+}
+
+static char * decode_mode(int subsysid, char *buf, size_t buflen)
+{
+	return decode_mode_maxidx(
+		logsys_loggers[subsysid].mode, buf, buflen,
+		subsysid == LOGSYS_MAX_SUBSYS_COUNT ? 5 : 3);
+}
+
+static const char *decode_debug(int subsysid)
+{
+	if (logsys_loggers[subsysid].debug)
+		return "on";
+
+	return "off";
+}
+
+static const char *decode_status(int subsysid)
+{
+	if (!logsys_loggers[subsysid].init_status)
+		return "INIT_DONE";
+
+	return "NEEDS_INIT";
+}
+
+static void dump_subsys_config(int subsysid)
+{
+	char modebuf[1024];
+
+	fprintf(stderr,
+		"ID: %d\n"
+		"subsys: %s\n"
+		"logfile: %s\n"
+		"logfile_fp: %p\n"
+		"mode: %s\n"
+		"debug: %s\n"
+		"syslog_fac: %s\n"
+		"syslog_pri: %s\n"
+		"logfile_pri: %s\n"
+		"init_status: %s\n",
+		subsysid,
+		logsys_loggers[subsysid].subsys,
+		logsys_loggers[subsysid].logfile,
+		logsys_loggers[subsysid].logfile_fp,
+		decode_mode(subsysid, modebuf, sizeof(modebuf)),
+		decode_debug(subsysid),
+		logsys_facility_name_get(logsys_loggers[subsysid].syslog_facility),
+		logsys_priority_name_get(logsys_loggers[subsysid].syslog_priority),
+		logsys_priority_name_get(logsys_loggers[subsysid].logfile_priority),
+		decode_status(subsysid));
+}
+
+static void dump_full_config(void)
+{
+	int i;
+
+	for (i = 0; i <= LOGSYS_MAX_SUBSYS_COUNT; i++) {
+		if (strlen(logsys_loggers[i].subsys) > 0)
+			dump_subsys_config(i);
+	}
+}
+#endif
+
 static uint32_t circular_memory_map (void **buf, size_t bytes)
 {
 	void *addr_orig;


More information about the Openais mailing list