]> granicus.if.org Git - sudo/commitdiff
Emulate pipe2() on systems without it.
authorTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 13 Mar 2017 18:11:51 +0000 (12:11 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Mon, 13 Mar 2017 18:11:51 +0000 (12:11 -0600)
MANIFEST
config.h.in
configure
configure.ac
include/sudo_compat.h
lib/util/Makefile.in
lib/util/pipe2.c [new file with mode: 0644]
mkdep.pl

index bf9b19346d643c26d0ac4b52dc6776b6bd2d957e..d2debad5b6543882a3bc524732aaabe4632cb4c8 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -109,6 +109,7 @@ lib/util/mksigname.h
 lib/util/mktemp.c
 lib/util/nanosleep.c
 lib/util/parseln.c
+lib/util/pipe2.c
 lib/util/progname.c
 lib/util/pw_dup.c
 lib/util/reallocarray.c
index c562be8677dfad3001ac3952b03512074d784838..ef864e1aae943a633a8296c878e95e0fff572b92 100644 (file)
 /* Define to 1 if you have the <paths.h> header file. */
 #undef HAVE_PATHS_H
 
+/* Define to 1 if you have the `pipe2' function. */
+#undef HAVE_PIPE2
+
 /* Define to 1 if you have the `poll' function. */
 #undef HAVE_POLL
 
index 7bb95850cadcc0eaf2064f638cfde1c21fad657f..71783b9fae39ee290332acb0c94c17208d10ffc5 100755 (executable)
--- a/configure
+++ b/configure
@@ -20029,6 +20029,32 @@ esac
 fi
 
 
+fi
+done
+
+for ac_func in pipe2
+do :
+  ac_fn_c_check_func "$LINENO" "pipe2" "ac_cv_func_pipe2"
+if test "x$ac_cv_func_pipe2" = xyes; then :
+  cat >>confdefs.h <<_ACEOF
+#define HAVE_PIPE2 1
+_ACEOF
+
+else
+
+    case " $LIBOBJS " in
+  *" pipe2.$ac_objext "* ) ;;
+  *) LIBOBJS="$LIBOBJS pipe2.$ac_objext"
+ ;;
+esac
+
+
+    for _sym in sudo_pipe2; do
+       COMPAT_EXP="${COMPAT_EXP}${_sym}
+"
+    done
+
+
 fi
 done
 
index 75c079a27a6f21d1a0cec9d5222854b7d932d406..37148dad2867e34f335dbf60d04145d78b9dc67b 100644 (file)
@@ -2619,6 +2619,10 @@ AC_CHECK_FUNCS(nanosleep, [], [
        SUDO_APPEND_COMPAT_EXP(sudo_nanosleep)
     ])
 ])
+AC_CHECK_FUNCS([pipe2], [], [
+    AC_LIBOBJ(pipe2)
+    SUDO_APPEND_COMPAT_EXP(sudo_pipe2)
+])
 AC_CHECK_FUNCS([pw_dup], [], [
     AC_LIBOBJ(pw_dup)
     SUDO_APPEND_COMPAT_EXP(sudo_pw_dup)
index 311c4440a395939b7651c4425f0cff1ac50a49bb..eea93b474154cf10dc31f2ca710635ed5f217b72 100644 (file)
 # endif
 #endif
 
+/* For pipe2() emulation. */
+#if !defined(HAVE_PIPE2) && defined(O_NONBLOCK) && !defined(O_CLOEXEC)
+# define O_CLOEXEC     0x80000000
+#endif
+
 /*
  * BSD defines these in <sys/param.h> but we don't include that anymore.
  */
@@ -520,5 +525,10 @@ __dso_public void sudo_vsyslog(int pri, const char *fmt, va_list ap);
 # undef vsyslog
 # define vsyslog(_a, _b, _c) sudo_vsyslog((_a), (_b), (_c))
 #endif /* HAVE_VSYSLOG */
+#ifndef HAVE_PIPE2
+__dso_public int sudo_pipe2(int fildes[2], int flags);
+# undef pipe2
+# define pipe2(_a, _b) sudo_pipe2((_a), (_b))
+#endif /* HAVE_PIPE2 */
 
 #endif /* SUDO_COMPAT_H */
index b1b24eec82e190704a4dc9bbaefc69514929541e..dbf6a766722633868df07153d39a49e35abbb5a6 100644 (file)
@@ -489,6 +489,8 @@ parseln_test.lo: $(srcdir)/regress/sudo_parseln/parseln_test.c \
                  $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
                  $(incdir)/sudo_util.h $(top_builddir)/config.h
        $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/regress/sudo_parseln/parseln_test.c
+pipe2.lo: $(srcdir)/pipe2.c $(incdir)/sudo_compat.h $(top_builddir)/config.h
+       $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(SSP_CFLAGS) $(srcdir)/pipe2.c
 progname.lo: $(srcdir)/progname.c $(incdir)/compat/stdbool.h \
              $(incdir)/sudo_compat.h $(incdir)/sudo_util.h \
              $(top_builddir)/config.h
diff --git a/lib/util/pipe2.c b/lib/util/pipe2.c
new file mode 100644 (file)
index 0000000..5c6831c
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2017 Todd C. Miller <Todd.Miller@courtesan.com>
+ *
+ * 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 <config.h>
+
+#ifndef HAVE_PIPE2
+
+#include <sys/types.h>
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "sudo_compat.h"
+
+int
+sudo_pipe2(int fildes[2], int flags)
+{
+    if (pipe(fildes) != 0)
+       return -1;
+
+    if (ISSET(flags, O_NONBLOCK)) {
+       int flags = fcntl(fildes[0], F_GETFL, 0);
+       if (flags == -1)
+           goto bad;
+       if (fcntl(fildes[0], F_SETFL, flags | O_NONBLOCK) == -1)
+           goto bad;
+       flags = fcntl(fildes[1], F_GETFL, 0);
+       if (flags == -1)
+           goto bad;
+       if (fcntl(fildes[1], F_SETFL, flags | O_NONBLOCK) == -1)
+           goto bad;
+    }
+    if (ISSET(flags, O_CLOEXEC)) {
+       if (fcntl(fildes[0], F_SETFD, FD_CLOEXEC) == -1)
+           goto bad;
+       if (fcntl(fildes[1], F_SETFD, FD_CLOEXEC) == -1)
+           goto bad;
+    }
+    return 0;
+bad:
+    close(fildes[0]);
+    close(fildes[1]);
+    return -1;
+}
+
+#endif /* HAVE_PIPE2 */
index 3f94c069b5f7a66e39452ff98539d2013d9bce4c..67a59609667b5c862cfc608181e6555f20308786 100755 (executable)
--- a/mkdep.pl
+++ b/mkdep.pl
@@ -71,7 +71,7 @@ sub mkdep {
     # XXX - fill in AUTH_OBJS from contents of the auth dir instead
     $makefile =~ s:\@AUTH_OBJS\@:afs.lo aix_auth.lo bsdauth.lo dce.lo fwtk.lo getspwuid.lo kerb5.lo pam.lo passwd.lo rfc1938.lo secureware.lo securid5.lo sia.lo:;
     $makefile =~ s:\@FILEDIGEST\@:filedigest.lo filedigest_openssl.lo filedigest_gcrypt.lo:;
-    $makefile =~ s:\@LTLIBOBJS\@:closefrom.lo fnmatch.lo getaddrinfo.lo getcwd.lo getgrouplist.lo getline.lo getopt_long.lo glob.lo inet_ntop_lo inet_pton.lo isblank.lo memrchr.lo memset_s.lo mksiglist.lo mksigname.lo mktemp.lo nanosleep.lo pw_dup.lo reallocarray.lo sha2.lo sig2str.lo siglist.lo signame.lo snprintf.lo strlcat.lo strlcpy.lo strndup.lo strnlen.lo strsignal.lo strtonum.lo utimens.lo vsyslog.lo:;
+    $makefile =~ s:\@LTLIBOBJS\@:closefrom.lo fnmatch.lo getaddrinfo.lo getcwd.lo getgrouplist.lo getline.lo getopt_long.lo glob.lo inet_ntop_lo inet_pton.lo isblank.lo memrchr.lo memset_s.lo mksiglist.lo mksigname.lo mktemp.lo nanosleep.lo pw_dup.lo reallocarray.lo sha2.lo sig2str.lo siglist.lo signame.lo snprintf.lo strlcat.lo strlcpy.lo strndup.lo strnlen.lo strsignal.lo strtonum.lo utimens.lo vsyslog.lo pipe2.lo:;
 
     # Parse OBJS lines
     my %objs;