Use strnstr implementation from FreeBSD if not provided by OS

(cherry picked from commit 5f07fe8cbb)
This commit is contained in:
Mark Andrews
2022-10-04 17:05:18 +11:00
parent 5568aca5a5
commit 9bb5157adf
6 changed files with 41 additions and 2 deletions
+30
View File
@@ -12,9 +12,15 @@
*/
/*
* SPDX-License-Identifier: BSD-3-Clause
*
* Copyright (c) 2001 Mike Barcroft <mike@FreeBSD.org>
* Copyright (c) 1990, 1993
* The Regents of the University of California. All rights reserved.
*
* This code is derived from software contributed to Berkeley by
* Chris Torek.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@@ -48,6 +54,7 @@
#include <string.h>
#include <isc/string.h> /* IWYU pragma: keep */
#include <isc/util.h>
#if !defined(HAVE_STRLCPY)
size_t
@@ -109,6 +116,29 @@ strlcat(char *dst, const char *src, size_t size) {
}
#endif /* !defined(HAVE_STRLCAT) */
#if !defined(HAVE_STRNSTR)
char *
strnstr(const char *s, const char *find, size_t slen) {
char c, sc, *r;
size_t len;
if ((c = *find++) != '\0') {
len = strlen(find);
do {
do {
if (slen-- < 1 || (sc = *s++) == '\0')
return (NULL);
} while (sc != c);
if (len > slen)
return (NULL);
} while (strncmp(s, find, len) != 0);
s--;
}
DE_CONST(s, r);
return (r);
}
#endif
int
isc_string_strerror_r(int errnum, char *buf, size_t buflen) {
#if defined(_WIN32) || defined(_WIN64)