]> git.ipfire.org Git - thirdparty/collectd.git/commitdiff
configure.ac: Check for strnlen, implement alternative.
authorFlorian Forster <octo@google.com>
Tue, 1 Sep 2020 13:39:57 +0000 (15:39 +0200)
committerFlorian Forster <octo@google.com>
Mon, 14 Sep 2020 06:58:08 +0000 (08:58 +0200)
Solaris 10 doesn't provide a strnlen(3). Provide a simple alternative if so.

configure.ac
src/utils/common/common.c
src/utils/common/common.h
src/utils/strbuf/strbuf.c

index 45b94ce0d2a6c7d207b27fd89698d7aba36f60fa..19c386749eb2ba76ab0580cee4d78f494e7543a3 100644 (file)
@@ -920,6 +920,7 @@ AC_CHECK_FUNCS([host_statistics], [have_host_statistics="yes"], [have_host_stati
 AC_CHECK_FUNCS([processor_info], [have_processor_info="yes"], [have_processor_info="no"])
 AC_CHECK_FUNCS([statfs], [have_statfs="yes"], [have_statfs="no"])
 AC_CHECK_FUNCS([statvfs], [have_statvfs="yes"], [have_statvfs="no"])
+AC_CHECK_FUNCS([strnlen], [have_strnlen="yes"], [have_strnlen="no"])
 AC_CHECK_FUNCS([sysctl], [have_sysctl="yes"], [have_sysctl="no"])
 AC_CHECK_FUNCS([sysctlbyname], [have_sysctlbyname="yes"], [have_sysctlbyname="no"])
 AC_CHECK_FUNCS([syslog], [have_syslog="yes"], [have_syslog="no"])
index 89fe6f52bac7ada4e6ff324a16fdf97f985c7787..eace40f3db9695618762fa449c307e276ac53bdc 100644 (file)
@@ -162,14 +162,16 @@ char *sstrdup(const char *s) {
   return r;
 } /* char *sstrdup */
 
-size_t sstrnlen(const char *s, size_t n) {
-  const char *p = s;
-
-  while (n-- > 0 && *p)
-    p++;
-
-  return p - s;
-} /* size_t sstrnlen */
+#if !HAVE_STRNLEN
+size_t strnlen(const char *s, size_t maxlen) {
+  for (size_t i = 0; i < maxlen; i++) {
+    if (s[i] == 0) {
+      return i;
+    }
+  }
+  return maxlen;
+}
+#endif
 
 char *sstrndup(const char *s, size_t n) {
   char *r;
@@ -178,7 +180,7 @@ char *sstrndup(const char *s, size_t n) {
   if (s == NULL)
     return NULL;
 
-  sz = sstrnlen(s, n);
+  sz = strnlen(s, n);
   r = malloc(sz + 1);
   if (r == NULL) {
     ERROR("sstrndup: Out of memory.");
index b7c9c08cacb7074c303938fb39c4ec949be6fe0f..2812644a257b8d00caaae72368187906973fb0e2 100644 (file)
@@ -73,7 +73,11 @@ __attribute__((format(printf, 1, 2))) char *ssnprintf_alloc(char const *format,
                                                             ...);
 
 char *sstrdup(const char *s);
-size_t sstrnlen(const char *s, size_t n);
+
+#if !HAVE_STRNLEN
+size_t strnlen(const char *s, size_t maxlen);
+#endif
+
 char *sstrndup(const char *s, size_t n);
 void *smalloc(size_t size);
 char *sstrerror(int errnum, char *buf, size_t buflen);
index d72db6a78bc427d824a07db9319390ca6d501ed7..3e4db07a436672187a2d859ad1ef0b598571e87a 100644 (file)
@@ -200,6 +200,17 @@ int strbuf_printf(strbuf_t *buf, char const *format, ...) {
   return 0;
 }
 
+#if !HAVE_STRNLEN
+static size_t strnlen(const char *s, size_t maxlen) {
+  for (size_t i = 0; i < maxlen; i++) {
+    if (s[i] == 0) {
+      return i;
+    }
+  }
+  return maxlen;
+}
+#endif
+
 int strbuf_printn(strbuf_t *buf, char const *s, size_t n) {
   if ((buf == NULL) || (s == NULL))
     return EINVAL;