From 5a788adec19043d4d93c4fa2713f9f633bfd35ab Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Sun, 15 Nov 1998 01:04:16 +0000 Subject: [PATCH] use native strlcat() and strlcpy() if available --- configure.in | 1 + lib/compat.c | 45 ++++++++++++++++++++++++++++++++++++++++----- rsync.h | 10 ++++++++++ util.c | 35 ++--------------------------------- 4 files changed, 53 insertions(+), 38 deletions(-) diff --git a/configure.in b/configure.in index c300d6a3..4d96eca0 100644 --- a/configure.in +++ b/configure.in @@ -52,6 +52,7 @@ AC_FUNC_UTIME_NULL AC_CHECK_FUNCS(mmap munmap waitpid getcwd strdup strerror chown chmod mknod) AC_CHECK_FUNCS(fchmod fstat strchr readlink link utime utimes strftime) AC_CHECK_FUNCS(memmove getopt_long lchown vsnprintf snprintf setsid glob strpbrk) +AC_CHECK_FUNCS(strlcat strlcpy) echo $ac_n "checking for working fnmatch... $ac_c" AC_TRY_RUN([#include diff --git a/lib/compat.c b/lib/compat.c index 922d1199..f4913489 100644 --- a/lib/compat.c +++ b/lib/compat.c @@ -36,7 +36,7 @@ #endif #ifndef HAVE_GETCWD -char *getcwd(char *buf, int size) + char *getcwd(char *buf, int size) { return getwd(buf); } @@ -44,7 +44,7 @@ char *getcwd(char *buf, int size) #ifndef HAVE_WAITPID -pid_t waitpid(pid_t pid, int *statptr, int options) + pid_t waitpid(pid_t pid, int *statptr, int options) { return wait4(pid, statptr, options, NULL); } @@ -52,7 +52,7 @@ pid_t waitpid(pid_t pid, int *statptr, int options) #ifndef HAVE_MEMMOVE -void *memmove(void *dest, const void *src, size_t n) + void *memmove(void *dest, const void *src, size_t n) { memcpy(dest, src, n); return dest; @@ -63,7 +63,7 @@ void *memmove(void *dest, const void *src, size_t n) /* Find the first ocurrence in S of any character in ACCEPT. derived from glibc */ -char *strpbrk(const char *s, const char *accept) + char *strpbrk(const char *s, const char *accept) { while (*s != '\0') { const char *a = accept; @@ -78,7 +78,7 @@ char *strpbrk(const char *s, const char *accept) #endif #ifdef REPLACE_INET_NTOA -char *rep_inet_ntoa(struct in_addr ip) + char *rep_inet_ntoa(struct in_addr ip) { unsigned char *p = (unsigned char *)&ip.s_addr; static char buf[18]; @@ -92,3 +92,38 @@ char *rep_inet_ntoa(struct in_addr ip) return buf; } #endif + +#ifndef HAVE_STRLCPY +/* like strncpy but does not 0 fill the buffer and always null + terminates. bufsize is the size of the destination buffer */ + size_t strlcpy(char *d, const char *s, size_t bufsize) +{ + size_t len = strlen(s); + size_t ret = len; + if (len >= bufsize) len = bufsize-1; + memcpy(d, s, len); + d[len] = 0; + return ret; +} +#endif + +#ifndef HAVE_STRLCAT +/* like strncat but does not 0 fill the buffer and always null + terminates. bufsize is the length of the buffer, which should + be one more than the maximum resulting string length */ + size_t strlcat(char *d, const char *s, size_t bufsize) +{ + size_t len1 = strlen(d); + size_t len2 = strlen(s); + size_t ret = len1 + len2; + + if (len1+len2 >= bufsize) { + len2 = bufsize - (len1+1); + } + if (len2 > 0) { + memcpy(d+len1, s, len2); + d[len1+len2] = 0; + } + return ret; +} +#endif diff --git a/rsync.h b/rsync.h index e11b84a0..53b1c318 100644 --- a/rsync.h +++ b/rsync.h @@ -474,3 +474,13 @@ extern int errno; #ifdef REPLACE_INET_NTOA #define inet_ntoa rep_inet_ntoa #endif + + +#ifndef HAVE_STRLCPY +size_t strlcpy(char *d, const char *s, size_t bufsize); +#endif + +#ifndef HAVE_STRLCAT +size_t strlcat(char *d, const char *s, size_t bufsize); +#endif + diff --git a/util.c b/util.c index c5bb4a70..e04d0d78 100644 --- a/util.c +++ b/util.c @@ -358,37 +358,6 @@ void kill_all(int sig) } } -/* like strncpy but does not 0 fill the buffer and always null - terminates. bufsize is the size of the destination buffer */ -size_t strlcpy(char *d, const char *s, size_t bufsize) -{ - size_t len = strlen(s); - size_t ret = len; - if (len >= bufsize) len = bufsize-1; - memcpy(d, s, len); - d[len] = 0; - return ret; -} - -/* like strncat but does not 0 fill the buffer and always null - terminates. bufsize is the length of the buffer, which should - be one more than the maximum resulting string length */ -size_t strlcat(char *d, const char *s, size_t bufsize) -{ - size_t len1 = strlen(d); - size_t len2 = strlen(s); - size_t ret = len1 + len2; - - if (len1+len2 >= bufsize) { - len2 = bufsize - (len1+1); - } - if (len2 > 0) { - memcpy(d+len1, s, len2); - d[len1+len2] = 0; - } - return ret; -} - /* turn a user name into a uid */ int name_to_uid(char *name, uid_t *uid) { @@ -708,8 +677,8 @@ int pop_dir(char *dir) to ensure that signed/unsigned usage is consistent between machines. */ int u_strcmp(const char *cs1, const char *cs2) { - const uchar *s1 = (uchar *)cs1; - const uchar *s2 = (uchar *)cs2; + const uchar *s1 = (const uchar *)cs1; + const uchar *s2 = (const uchar *)cs2; while (*s1 && *s2 && (*s1 == *s2)) { s1++; s2++; -- 2.34.1