فهرست منبع

Merge branch 'maint'

* maint:
  Add memmem(3) from FreeBSD r188080 for use where needed
  Only use madvise(2) if available.
Bryan Drewery 11 سال پیش
والد
کامیت
bdd7ab8e1e
7فایلهای تغییر یافته به همراه82 افزوده شده و 5 حذف شده
  1. 2 2
      build/autotools/configure.ac
  2. 2 2
      configure
  3. 2 0
      src/binary.c
  4. 2 1
      src/compat/Makefile.in
  5. 4 0
      src/compat/compat.h
  6. 64 0
      src/compat/memmem.c
  7. 6 0
      src/config.h.in

+ 2 - 2
build/autotools/configure.ac

@@ -198,8 +198,8 @@ AC_FUNC_STRFTIME
 
 #checkpoint
 AC_CACHE_SAVE
-AC_CHECK_FUNCS([clock fsync getrusage isascii getpassphrase])
-AC_CHECK_FUNCS([memcpy memset random rename snprintf srandom gettime])
+AC_CHECK_FUNCS([clock fsync getrusage isascii getpassphrase madvise])
+AC_CHECK_FUNCS([memcpy memmem memset random rename snprintf srandom gettime])
 #checkpoint
 AC_CACHE_SAVE
 AC_CHECK_FUNCS([strcasecmp strncasecmp vsnprintf inet_ntop])

+ 2 - 2
configure

@@ -8589,7 +8589,7 @@ $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;}
   fi
 fi
 rm -f confcache
-for ac_func in clock fsync getrusage isascii getpassphrase
+for ac_func in clock fsync getrusage isascii getpassphrase madvise
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var"
@@ -8601,7 +8601,7 @@ _ACEOF
 fi
 done
 
-for ac_func in memcpy memset random rename snprintf srandom gettime
+for ac_func in memcpy memmem memset random rename snprintf srandom gettime
 do :
   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
 ac_fn_cxx_check_func "$LINENO" "$ac_func" "$as_ac_var"

+ 2 - 0
src/binary.c

@@ -178,7 +178,9 @@ bin_checksum(const char *fname, int todo)
     close(fd);
     werr(ERR_BINSTAT);
   }
+#ifdef HAVE_MADVISE
   madvise(map, size, MADV_SEQUENTIAL);
+#endif
   MD5_Update(&ctx, map, offset);
 
   /* Hash everything after the packdata too */

+ 2 - 1
src/compat/Makefile.in

@@ -17,8 +17,9 @@ OBJS = dirname.o \
 	dn_expand.o \
 	inet_ntop.o \
 	snprintf.o \
-	memset.o \
 	memcpy.o \
+	memmem.o \
+	memset.o \
 	memutil.o \
 	strcasecmp.o \
 	strftime.o \

+ 4 - 0
src/compat/compat.h

@@ -24,6 +24,10 @@
 #include "strsep.h"
 #include "timespec.h"
 
+#ifndef HAVE_MEMMEM
+void *memmem(const void *l, size_t l_len, const void *s, size_t s_len);
+#endif
+
 /* These apparently are unsafe without recasting. */
 #define egg_isdigit(x)  isdigit((int)  (unsigned char) (x))
 #define egg_isxdigit(x) isxdigit((int) (unsigned char) (x))

+ 64 - 0
src/compat/memmem.c

@@ -0,0 +1,64 @@
+/*-
+ * Copyright (c) 2005 Pascal Gloor <pascal.gloor@spale.com>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote
+ *    products derived from this software without specific prior written
+ *    permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+/* $FreeBSD: head/lib/libc/string/memmem.c 188080 2009-02-03 17:58:20Z danger $ */
+#include <string.h>
+
+/*
+ * Find the first occurrence of the byte string s in byte string l.
+ */
+
+void *
+memmem(const void *l, size_t l_len, const void *s, size_t s_len)
+{
+	register char *cur, *last;
+	const char *cl = (const char *)l;
+	const char *cs = (const char *)s;
+
+	/* we need something to compare */
+	if (l_len == 0 || s_len == 0)
+		return NULL;
+
+	/* "s" must be smaller or equal to "l" */
+	if (l_len < s_len)
+		return NULL;
+
+	/* special case where s_len == 1 */
+	if (s_len == 1)
+		return memchr(l, (int)*cs, l_len);
+
+	/* the last position where its possible to find "s" in "l" */
+	last = (char *)cl + l_len - s_len;
+
+	for (cur = (char *)cl; cur <= last; cur++)
+		if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
+			return cur;
+
+	return NULL;
+}

+ 6 - 0
src/config.h.in

@@ -106,6 +106,9 @@
    zero-length file name argument. */
 #undef HAVE_LSTAT_EMPTY_STRING_BUG
 
+/* Define to 1 if you have the `madvise' function. */
+#undef HAVE_MADVISE
+
 /* Define to 1 if your system has a GNU libc compatible `malloc' function, and
    to 0 otherwise. */
 #undef HAVE_MALLOC
@@ -113,6 +116,9 @@
 /* Define to 1 if you have the `memcpy' function. */
 #undef HAVE_MEMCPY
 
+/* Define to 1 if you have the `memmem' function. */
+#undef HAVE_MEMMEM
+
 /* Define to 1 if you have the <memory.h> header file. */
 #undef HAVE_MEMORY_H