On 8/18/20 5:50 AM, Richard W.M. Jones wrote:
Especially on Windows, some common functions are missing. Use the
autoconf LIBOBJS mechanism to replace these functions.
This includes replacement functions for:
Function names Implementation Origin
getdelim, getline general purpose NetBSD under a compatible license
openlog, syslog, Win32 written by me
vsyslog
realpath Win32 written by me
strndup general purpose written by me
This should do nothing on existing supported platforms. It is only
intended in preparation for porting nbdkit to Windows.
---
@@ -464,6 +475,15 @@ AS_CASE([$host_os],
AC_MSG_RESULT([$is_windows])
AC_SUBST([NO_UNDEFINED_ON_WINDOWS])
AC_SUBST([LINK_LIBNBDKIT_ON_WINDOWS])
+AM_CONDITIONAL([IS_WINDOWS],[test "x$is_windows" = "xyes"])
+
+dnl For Windows, look for the mc/windmc utility.
+dnl XXX Do we need to check for mc.exe as well?
+AS_IF([test "x$is_windows" = "xyes"],[
+ AC_CHECK_TOOLS([MC],[windmc mc],[no])
+ AS_IF([test "x$MC" = "xno"],
+ [AC_MSG_ERROR([mc/windmc utility must be available when compiling for
Windows])])
+])
That's true for native windows, but not for cygwin. This one looks like
our grouping of Cygwin as being 'is_windows' will bite us.
+++ b/common/replacements/Makefile.am
@@ -0,0 +1,53 @@
+# nbdkit
+# Copyright (C) 2019 Red Hat Inc.
You can add 2020 if desired.
+++ b/common/replacements/win32/Makefile.am
@@ -0,0 +1,46 @@
+# nbdkit
+# Copyright (C) 2019 Red Hat Inc.
and again
+# All rights reserved.
Stale copy-and-paste; we got rid of these lines in 1.12.
+EXTRA_DIST = nbdkit-cat.mc
+
+if IS_WINDOWS
+
+# Build the message catalog.
+noinst_DATA = MSG00001.bin nbdkit-cat.h nbdkit-cat.rc
+
+$(noinst_DATA): nbdkit-cat.mc
+ rm -f $@
+ $(MC) $<
Is the message catalog integral to the general function replacements, or
should this be split into a separate commit?
+++ b/common/replacements/getline.h
@@ -0,0 +1,50 @@
+/* nbdkit
+ * Copyright (C) 2019 Red Hat Inc.
+ * All rights reserved.
More of this line; looks like you'll want to scrub the series.
+
+#ifndef NBDKIT_GETLINE_H
+#define NBDKIT_GETLINE_H
+
+#include <config.h>
+
+#ifdef HAVE_GETLINE
+
+#include <stdio.h>
You'll want this include to be unconditional, since...
+
+#else
+
+ssize_t getline (char **lineptr, size_t *n, FILE *stream);
the reference to ssize_t and FILE* depend on it.
+++ b/common/replacements/realpath.h
+
+#include <config.h>
+
+#ifdef HAVE_REALPATH
+
+#include <limits.h>
+#include <stdlib.h>
Why limits.h?
+
+#else
+
+char *realpath (const char *path, char *out);
+
+#endif
+
+#endif /* NBDKIT_REALPATH_H */
diff --git a/common/replacements/strndup.h b/common/replacements/strndup.h
new file mode 100644
index 00000000..464ce954
--- /dev/null
+++ b/common/replacements/strndup.h
+#ifndef NBDKIT_STRNDUP_H
+#define NBDKIT_STRNDUP_H
+
+#include <config.h>
+
+#ifdef HAVE_STRNDUP
+
+#include <string.h>
+
+#else
+
+char *strndup(const char *s, size_t n);
You'll probably want a header to guarantee size_t is defined (either
stddef.h or sys/types.h works).
+
+#endif
+
+#endif /* NBDKIT_STRNDUP_H */
diff --git a/common/replacements/syslog.h b/common/replacements/syslog.h
new file mode 100644
index 00000000..e4d76677
--- /dev/null
+++ b/common/replacements/syslog.h
+#include <config.h>
+
+#ifdef HAVE_SYSLOG_H
+
+#include_next <syslog.h>
I guess our insistence on a decent compiler (for other reasons such as
__attribute__((cleanup))) means we can rely on #include_next ;)
+++ b/common/replacements/getdelim.c
@@ -0,0 +1,84 @@
+/* $NetBSD: getdelim.c,v 1.2 2015/12/25 20:12:46 joerg Exp $ */
+/* NetBSD-src: getline.c,v 1.2 2014/09/16 17:23:50 christos Exp */
+
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
This one makes sense; you are lifting it straight out of another source
verbatim.
+++ b/common/replacements/openlog.c
+#ifdef WIN32
+
+/* Replacement openlog for Win32. */
+
+#include <windows.h>
+
+HANDLE event_source = INVALID_HANDLE_VALUE;
+
+void
+openlog (const char *ident, int option, int facility)
+{
+ event_source = RegisterEventSource (NULL, ident);
+}
Ah, so if I understand, the message catalog compilation matters when
replacing openlog? Cygwin has openlog, and thus does not need the
replacement and thus not the message catalog.
+
+#else /* !WIN32 */
+#error "no replacement openlog is available on this platform"
+#endif
+
+#endif /* !HAVE_SYSLOG_H */
diff --git a/common/replacements/realpath.c b/common/replacements/realpath.c
new file mode 100644
index 00000000..622ee7ea
--- /dev/null
+++ b/common/replacements/realpath.c
+++ b/common/replacements/strndup.c
+
+char *
+strndup(const char *s, size_t n)
+{
+ size_t len = strlen (s);
You _must_ use strnlen here. Otherwise, a user that passes in a pointer
to bytes that are bounded by a memory page transition rather than a NUL
can cause you to SEGV reading beyond n bytes.
+ char *ret;
+
+ if (len > n)
+ len = n;
and once you've used strnlen, this is dead.
+
+ ret = malloc (len+1);
+ if (ret == NULL)
+ return NULL;
+ memcpy (ret, s, len);
+ ret[len] = '\0';
+
+ return ret;
+}
+
+#endif /* !HAVE_STRNDUP */
diff --git a/common/replacements/syslog.c b/common/replacements/syslog.c
new file mode 100644
index 00000000..6f41cbd8
--- /dev/null
+++ b/common/replacements/syslog.c
+++ b/common/replacements/vsyslog.c
+++ b/common/replacements/win32/nbdkit-cat.mc
@@ -0,0 +1,6 @@
+MessageId=1
+Severity=Error
+SymbolicName=NBDKIT_SYSLOG_ERROR
+Language=English
+%1
+.
Does this file not allow for a copyright blurb? Or is it small enough
to be trivial and not need one?
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization:
qemu.org |
libvirt.org