compat: add strlcpy, strlcat, for glibc - stagit-gopher - A git gopher frontend… | |
git clone git://bitreich.org/stagit-gopher/ git://enlrupgkhuxnvlhsf6lc3fziv5h2h… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
commit 55556b66bc57be0d82831b9cb353b79816216316 | |
parent 543e74e64fcffd0181cb94f63a4a4029e44c7e4f | |
Author: Hiltjo Posthuma <[email protected]> | |
Date: Fri, 25 Dec 2015 17:48:46 +0100 | |
compat: add strlcpy, strlcat, for glibc | |
Diffstat: | |
M Makefile | 11 +++++++---- | |
M config.mk | 5 +++++ | |
A strlcat.c | 55 +++++++++++++++++++++++++++++… | |
A strlcpy.c | 50 +++++++++++++++++++++++++++++… | |
M urmoms-index.c | 1 + | |
M urmoms.c | 1 + | |
6 files changed, 119 insertions(+), 4 deletions(-) | |
--- | |
diff --git a/Makefile b/Makefile | |
@@ -5,6 +5,9 @@ VERSION = 0.1 | |
SRC = \ | |
urmoms.c\ | |
urmoms-index.c | |
+COMPATSRC = \ | |
+ strlcat.c\ | |
+ strlcpy.c | |
BIN = \ | |
urmoms\ | |
urmoms-index | |
@@ -15,9 +18,9 @@ DOC = \ | |
LICENSE\ | |
README\ | |
TODO | |
-HDR = | |
+HDR = compat.h | |
-OBJ = ${SRC:.c=.o} | |
+OBJ = ${SRC:.c=.o} ${EXTRAOBJ} | |
all: $(BIN) | |
@@ -42,10 +45,10 @@ config.h: | |
@echo creating $@ from config.def.h | |
@cp config.def.h $@ | |
-urmoms: urmoms.o | |
+urmoms: urmoms.o ${EXTRAOBJ} | |
${CC} -o $@ urmoms.o ${LDFLAGS} | |
-urmoms-index: urmoms-index.o | |
+urmoms-index: urmoms-index.o ${EXTRAOBJ} | |
${CC} -o $@ urmoms-index.o ${LDFLAGS} | |
clean: | |
diff --git a/config.mk b/config.mk | |
@@ -26,5 +26,10 @@ LDFLAGS = ${LIBS} | |
# -D_POSIX_C_SOURCE=200809L -D_XOPEN_SOURCE=700 -D_BSD_SOURCE ${INCS} | |
#LDFLAGS = -static -s ${LIBS} | |
+# uncomment for compat | |
+CFLAGS += -DCOMPAT | |
+# uncomment if your libc doesn't support strlcat, strlcpy. | |
+EXTRAOBJ = strlcat.o strlcpy.o | |
+ | |
# compiler and linker | |
#CC = cc | |
diff --git a/strlcat.c b/strlcat.c | |
@@ -0,0 +1,55 @@ | |
+/* $OpenBSD: strlcat.c,v 1.15 2015/03/02 21:41:08 millert Exp $ … | |
+ | |
+/* | |
+ * Copyright (c) 1998, 2015 Todd C. Miller <[email protected]> | |
+ * | |
+ * Permission to use, copy, modify, and distribute this software for any | |
+ * purpose with or without fee is hereby granted, provided that the above | |
+ * copyright notice and this permission notice appear in all copies. | |
+ * | |
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
+ */ | |
+ | |
+#include <sys/types.h> | |
+#include <string.h> | |
+ | |
+/* | |
+ * Appends src to string dst of size dsize (unlike strncat, dsize is the | |
+ * full size of dst, not space left). At most dsize-1 characters | |
+ * will be copied. Always NUL terminates (unless dsize <= strlen(dst)). | |
+ * Returns strlen(src) + MIN(dsize, strlen(initial dst)). | |
+ * If retval >= dsize, truncation occurred. | |
+ */ | |
+size_t | |
+strlcat(char *dst, const char *src, size_t dsize) | |
+{ | |
+ const char *odst = dst; | |
+ const char *osrc = src; | |
+ size_t n = dsize; | |
+ size_t dlen; | |
+ | |
+ /* Find the end of dst and adjust bytes left but don't go past end. */ | |
+ while (n-- != 0 && *dst != '\0') | |
+ dst++; | |
+ dlen = dst - odst; | |
+ n = dsize - dlen; | |
+ | |
+ if (n-- == 0) | |
+ return(dlen + strlen(src)); | |
+ while (*src != '\0') { | |
+ if (n != 0) { | |
+ *dst++ = *src; | |
+ n--; | |
+ } | |
+ src++; | |
+ } | |
+ *dst = '\0'; | |
+ | |
+ return(dlen + (src - osrc)); /* count does not include NUL */ | |
+} | |
diff --git a/strlcpy.c b/strlcpy.c | |
@@ -0,0 +1,50 @@ | |
+/* $OpenBSD: strlcpy.c,v 1.12 2015/01/15 03:54:12 millert Exp $ … | |
+ | |
+/* | |
+ * Copyright (c) 1998, 2015 Todd C. Miller <[email protected]> | |
+ * | |
+ * Permission to use, copy, modify, and distribute this software for any | |
+ * purpose with or without fee is hereby granted, provided that the above | |
+ * copyright notice and this permission notice appear in all copies. | |
+ * | |
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
+ */ | |
+ | |
+#include <sys/types.h> | |
+#include <string.h> | |
+ | |
+/* | |
+ * Copy string src to buffer dst of size dsize. At most dsize-1 | |
+ * chars will be copied. Always NUL terminates (unless dsize == 0). | |
+ * Returns strlen(src); if retval >= dsize, truncation occurred. | |
+ */ | |
+size_t | |
+strlcpy(char *dst, const char *src, size_t dsize) | |
+{ | |
+ const char *osrc = src; | |
+ size_t nleft = dsize; | |
+ | |
+ /* Copy as many bytes as will fit. */ | |
+ if (nleft != 0) { | |
+ while (--nleft != 0) { | |
+ if ((*dst++ = *src++) == '\0') | |
+ break; | |
+ } | |
+ } | |
+ | |
+ /* Not enough room in dst, add NUL and traverse rest of src. */ | |
+ if (nleft == 0) { | |
+ if (dsize != 0) | |
+ *dst = '\0'; /* NUL-terminate dst */ | |
+ while (*src++) | |
+ ; | |
+ } | |
+ | |
+ return(src - osrc - 1); /* count does not include NUL */ | |
+} | |
diff --git a/urmoms-index.c b/urmoms-index.c | |
@@ -12,6 +12,7 @@ | |
#include <git2.h> | |
+#include "compat.h" | |
#include "config.h" | |
static git_repository *repo; | |
diff --git a/urmoms.c b/urmoms.c | |
@@ -12,6 +12,7 @@ | |
#include <git2.h> | |
+#include "compat.h" | |
#include "config.h" | |
struct commitinfo { |