From patchwork Thu Apr 13 15:37:44 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Florian Weimer X-Patchwork-Id: 750495 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3w3lKz3JNsz9sN9 for ; Fri, 14 Apr 2017 01:37:58 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.b="qe7QzI7m"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:date:to:subject:mime-version:content-type :content-transfer-encoding:message-id:from; q=dns; s=default; b= l2ulb/EZJ6ZMk6bmXpvkrpRolXKg10J3ATw3D9jwbvO05FClSa7531gPQfssfVnr FKwOctaL7KDZ5CQeZa5M6w+z1ZFOLCKKtdGk8w7FlK9sHm3rhR6g4srh8K2DkGyh AvRdoKU9OyV7b6j7H3nwrVR/5hFjRBkZdxz2Yl3ZkdE= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=sourceware.org; h=list-id :list-unsubscribe:list-subscribe:list-archive:list-post :list-help:sender:date:to:subject:mime-version:content-type :content-transfer-encoding:message-id:from; s=default; bh=yJ9IX7 zAmNha6hr/uuuPVj+iHzw=; b=qe7QzI7m8+oJhRnRL1NRsnxxfoUtVY8jShs/Fw xowwpf+6vujHdyD6CVHz9cljAU5ZwKeO7lp91t7KbIr2DXDn4P8UFZMvT1EGZLLl hAD2QKzqrGa9EOBR5mPQAe9opR08AsOOuDTOaJQEvJHF9tCF5fnbEX00HUw02lYm XI35Y= Received: (qmail 40826 invoked by alias); 13 Apr 2017 15:37:48 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 40808 invoked by uid 89); 13 Apr 2017 15:37:47 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RP_MATCHES_RCVD, SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=sk:kernel, *fp, sk:kernel- X-HELO: mx1.redhat.com DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 0F5C1C04BD5A Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx07.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=fweimer@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 0F5C1C04BD5A Date: Thu, 13 Apr 2017 17:37:44 +0200 To: libc-alpha@sourceware.org Subject: [PATCH] Assume that pipe2 is always available User-Agent: Heirloom mailx 12.5 7/5/10 MIME-Version: 1.0 Message-Id: <20170413153744.A69B2400F200A@oldenburg.str.redhat.com> From: fweimer@redhat.com (Florian Weimer) The Debian patches (which are already required to build glibc before this commit) contain an implementation of pipe2. 2017-04-13 Florian Weimer * include/unistd.h (__have_pipe2): Remove declaration. * socket/have_sock_cloexec.c (__have_pipe2): Remove definition. * libio/iopopen.c (_IO_new_proc_open): Assume that pipe2 is available. * posix/wordexp.c (exec_comm_child, exec_comm): Likewise. * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_PIPE2): Remove definition. diff --git a/include/unistd.h b/include/unistd.h index 16d68a1..e15fa0e 100644 --- a/include/unistd.h +++ b/include/unistd.h @@ -171,7 +171,6 @@ extern int __libc_pause (void); /* Not cancelable variant. */ extern int __pause_nocancel (void) attribute_hidden; -extern int __have_pipe2 attribute_hidden; extern int __have_dup3 attribute_hidden; extern int __getlogin_r_loginuid (char *name, size_t namesize) diff --git a/libio/iopopen.c b/libio/iopopen.c index 08e29b4..5887bd1 100644 --- a/libio/iopopen.c +++ b/libio/iopopen.c @@ -141,28 +141,12 @@ _IO_new_proc_open (_IO_FILE *fp, const char *command, const char *mode) return NULL; #ifdef O_CLOEXEC -# ifndef __ASSUME_PIPE2 - if (__have_pipe2 >= 0) -# endif { int r = __pipe2 (pipe_fds, O_CLOEXEC); -# ifndef __ASSUME_PIPE2 - if (__have_pipe2 == 0) - __have_pipe2 = r != -1 || errno != ENOSYS ? 1 : -1; - - if (__have_pipe2 > 0) -# endif if (r < 0) return NULL; } #endif -#ifndef __ASSUME_PIPE2 -# ifdef O_CLOEXEC - if (__have_pipe2 < 0) -# endif - if (__pipe (pipe_fds) < 0) - return NULL; -#endif if (do_read) { @@ -183,27 +167,13 @@ _IO_new_proc_open (_IO_FILE *fp, const char *command, const char *mode) int child_std_end = do_read ? 1 : 0; struct _IO_proc_file *p; -#ifndef __ASSUME_PIPE2 - /* If we have pipe2 the descriptor is marked for close-on-exec. */ - _IO_close (parent_end); -#endif if (child_end != child_std_end) - { - _IO_dup2 (child_end, child_std_end); -#ifndef __ASSUME_PIPE2 - _IO_close (child_end); -#endif - } + _IO_dup2 (child_end, child_std_end); #ifdef O_CLOEXEC else - { - /* The descriptor is already the one we will use. But it must - not be marked close-on-exec. Undo the effects. */ -# ifndef __ASSUME_PIPE2 - if (__have_pipe2 > 0) -# endif - __fcntl (child_end, F_SETFD, 0); - } + /* The descriptor is already the one we will use. But it must + not be marked close-on-exec. Undo the effects. */ + __fcntl (child_end, F_SETFD, 0); #endif /* POSIX.2: "popen() shall ensure that any streams from previous popen() calls that remain open in the parent process are closed @@ -229,26 +199,12 @@ _IO_new_proc_open (_IO_FILE *fp, const char *command, const char *mode) return NULL; } - if (do_cloexec) - { -#ifndef __ASSUME_PIPE2 -# ifdef O_CLOEXEC - if (__have_pipe2 < 0) -# endif - __fcntl (parent_end, F_SETFD, FD_CLOEXEC); -#endif - } - else - { + if (!do_cloexec) #ifdef O_CLOEXEC - /* Undo the effects of the pipe2 call which set the - close-on-exec flag. */ -# ifndef __ASSUME_PIPE2 - if (__have_pipe2 > 0) -# endif - __fcntl (parent_end, F_SETFD, 0); + /* Undo the effects of the pipe2 call which set the + close-on-exec flag. */ + __fcntl (parent_end, F_SETFD, 0); #endif - } _IO_fileno (fp) = parent_end; diff --git a/posix/wordexp.c b/posix/wordexp.c index ba3f3ed..639d73e 100644 --- a/posix/wordexp.c +++ b/posix/wordexp.c @@ -836,10 +836,7 @@ exec_comm_child (char *comm, int *fildes, int showerr, int noexec) { #ifdef O_CLOEXEC /* Reset the close-on-exec flag (if necessary). */ -# ifndef __ASSUME_PIPE2 - if (__have_pipe2 > 0) -# endif - __fcntl (fildes[1], F_SETFD, 0); + __fcntl (fildes[1], F_SETFD, 0); #endif } @@ -906,29 +903,12 @@ exec_comm (char *comm, char **word, size_t *word_length, size_t *max_length, return 0; #ifdef O_CLOEXEC -# ifndef __ASSUME_PIPE2 - if (__have_pipe2 >= 0) -# endif - { - int r = __pipe2 (fildes, O_CLOEXEC); -# ifndef __ASSUME_PIPE2 - if (__have_pipe2 == 0) - __have_pipe2 = r != -1 || errno != ENOSYS ? 1 : -1; - - if (__have_pipe2 > 0) -# endif - if (r < 0) - /* Bad */ - return WRDE_NOSPACE; - } -#endif -#ifndef __ASSUME_PIPE2 -# ifdef O_CLOEXEC - if (__have_pipe2 < 0) -# endif - if (__pipe (fildes) < 0) + { + int r = __pipe2 (fildes, O_CLOEXEC); + if (r < 0) /* Bad */ return WRDE_NOSPACE; + } #endif again: diff --git a/socket/have_sock_cloexec.c b/socket/have_sock_cloexec.c index 70c730e..579577d 100644 --- a/socket/have_sock_cloexec.c +++ b/socket/have_sock_cloexec.c @@ -19,10 +19,6 @@ #include #include -#if defined O_CLOEXEC && !defined __ASSUME_PIPE2 -int __have_pipe2; -#endif - #if defined O_CLOEXEC && !defined __ASSUME_DUP3 int __have_dup3; #endif diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index e6a2720..233e302 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -74,7 +74,6 @@ /* Support for various CLOEXEC and NONBLOCK flags was added in 2.6.27. */ #define __ASSUME_IN_NONBLOCK 1 -#define __ASSUME_PIPE2 1 #define __ASSUME_DUP3 1 /* Support for accept4 functionality was added in 2.6.28, but for some