Solaris 10 doesn't provide a strnlen(3). Provide a simple alternative if so.
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"])
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;
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.");
...);
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);
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;