Преглед изворни кода

* Added openbsd's strlcpy()

svn: 1707
Bryan Drewery пре 21 година
родитељ
комит
c7f834c169
4 измењених фајлова са 49 додато и 2 уклоњено
  1. 2 1
      src/compat/Makefile.in
  2. 1 1
      src/compat/compat.h
  3. 35 0
      src/compat/strlcpy.c
  4. 11 0
      src/compat/strlcpy.h

+ 2 - 1
src/compat/Makefile.in

@@ -23,7 +23,8 @@ OBJS = dirname.o \
 	memcpy.o \
 	memcpy.o \
 	memutil.o \
 	memutil.o \
 	strcasecmp.o \
 	strcasecmp.o \
-	strftime.o
+	strftime.o \
+	strlcpy.o 
 
 
 doofus:
 doofus:
 	@echo ""
 	@echo ""

+ 1 - 1
src/compat/compat.h

@@ -18,7 +18,7 @@
 #include "strcasecmp.h"
 #include "strcasecmp.h"
 #include "strftime.h"
 #include "strftime.h"
 #include "makepath.h"
 #include "makepath.h"
-
+#include "strlcpy.h"
 
 
 /* These apparently are unsafe without recasting. */
 /* These apparently are unsafe without recasting. */
 #define egg_isdigit(x)  isdigit((int)  (unsigned char) (x))
 #define egg_isdigit(x)  isdigit((int)  (unsigned char) (x))

+ 35 - 0
src/compat/strlcpy.c

@@ -0,0 +1,35 @@
+/* strlcpy
+ *
+ */
+#include <string.h>
+#include <sys/types.h>
+
+
+/*
+ * Copy src to string dst of size siz.  At most siz-1 characters
+ * will be copied.  Always NUL terminates (unless siz == 0).
+ * Returns strlen(src); if retval >= siz, truncation occurred.
+ */
+size_t strlcpy(char *dst, const char *src, size_t siz)
+{
+  register char *d = dst;
+  register const char *s = src;
+  register size_t n = siz;
+
+  /* Copy as many bytes as will fit */
+  if (n != 0 && --n != 0) {
+    do {
+      if ((*d++ = *s++) == 0)
+        break;
+    } while (--n != 0);
+  }
+
+  /* Not enough room in dst, add NUL and traverse rest of src */
+  if (n == 0) {
+    if (siz != 0)
+      *d = '\0';                /* NUL-terminate dst */
+    while (*s++) ;
+  }
+
+  return (s - src - 1);         /* count does not include NUL */
+}

+ 11 - 0
src/compat/strlcpy.h

@@ -0,0 +1,11 @@
+#ifndef _STRLCPY_H
+#define _STRLCPY_H
+
+#include <sys/types.h>
+
+#undef strlcpy
+
+size_t strlcpy(char *, const char *, size_t);
+
+#endif /* !_STRLCPY_H */
+