Module Name:    src
Committed By:   christos
Date:           Wed Aug 24 12:15:45 UTC 2011

Modified Files:
        src/sbin/sysctl: sysctl.c

Log Message:
Instead of using strncat and re-scanning the strings all the time, use and
append printf function.


To generate a diff of this commit:
cvs rdiff -u -r1.136 -r1.137 src/sbin/sysctl/sysctl.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/sysctl/sysctl.c
diff -u src/sbin/sysctl/sysctl.c:1.136 src/sbin/sysctl/sysctl.c:1.137
--- src/sbin/sysctl/sysctl.c:1.136	Tue Aug  2 21:58:30 2011
+++ src/sbin/sysctl/sysctl.c	Wed Aug 24 08:15:44 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: sysctl.c,v 1.136 2011/08/03 01:58:30 christos Exp $ */
+/*	$NetBSD: sysctl.c,v 1.137 2011/08/24 12:15:44 christos Exp $ */
 
 /*-
  * Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -68,7 +68,7 @@
 #if 0
 static char sccsid[] = "@(#)sysctl.c	8.1 (Berkeley) 6/6/93";
 #else
-__RCSID("$NetBSD: sysctl.c,v 1.136 2011/08/03 01:58:30 christos Exp $");
+__RCSID("$NetBSD: sysctl.c,v 1.137 2011/08/24 12:15:44 christos Exp $");
 #endif
 #endif /* not lint */
 
@@ -554,6 +554,21 @@
 	rnode->sysctl_desc = NULL;
 }
 
+static void __attribute__((__format__(__printf__, 3, 4)))
+appendprintf(char **bp, size_t *lbp, const char *fmt, ...)
+{
+	int r;
+	va_list ap;
+
+	va_start(ap, fmt);
+	r = vsnprintf(*bp, *lbp, fmt, ap);
+	va_end(ap);
+	if (r < 0 || (size_t)r > *lbp)
+		r = *lbp;
+	*bp += r;
+	*lbp -= r;
+}
+
 /*
  * ********************************************************************
  * print this node and any others underneath it
@@ -565,35 +580,31 @@
 {
 	struct sysctlnode *node;
 	int rc;
-	size_t ni, sz;
-	char *sp, *dp, n[20];
+	size_t ni, sz, ldp, lsp;
+	char *sp, *dp, *tsp, *tdp;
 	const struct handlespec *p;
 
-	sp = &gsname[strlen(gsname)];
-	dp = &gdname[strlen(gdname)];
+	sp = tsp = &gsname[strlen(gsname)];
+	dp = tdp = &gdname[strlen(gdname)];
+	ldp = sizeof(gdname) - (dp - gdname);
+	lsp = sizeof(gsname) - (sp - gsname);
 
 	if (sp != &gsname[0] && dp == &gdname[0]) {
 		/*
 		 * aw...shucks.  now we must play catch up
 		 */
-		for (ni = 0; ni < namelen; ni++) {
-			(void)snprintf(n, sizeof(n), "%d", name[ni]);
-			if (ni > 0)
-				strncat(gdname, ".", sizeof(gdname));
-			strncat(gdname, n, sizeof(gdname));
-		}
+		for (ni = 0; ni < namelen; ni++)
+			appendprintf(&tdp, &ldp, "%s%d", ni > 0 ? "." : "",
+			    name[ni]);
 	}
 
 	if (pnode == NULL)
 		pnode = &my_root;
 	else if (add) {
-		snprintf(n, sizeof(n), "%d", pnode->sysctl_num);
-		if (namelen > 1) {
-			strncat(gsname, sep, sizeof(gsname));
-			strncat(gdname, ".", sizeof(gdname));
-		}
-		strncat(gsname, pnode->sysctl_name, sizeof(gsname));
-		strncat(gdname, n, sizeof(gdname));
+		appendprintf(&tsp, &lsp, "%s%s", namelen > 1 ? sep : "", 
+			pnode->sysctl_name);
+		appendprintf(&tdp, &ldp, "%s%d", namelen > 1 ? "." : "", 
+			pnode->sysctl_num);
 	}
 
 	if (Mflag && pnode != &my_root) {

Reply via email to