ed8cae8ba0
This patch introduces the new syscall pipe2 which is like pipe but it also takes an additional parameter which takes a flag value. This patch implements the handling of O_CLOEXEC for the flag. I did not add support for the new syscall for the architectures which have a special sys_pipe implementation. I think the maintainers of those archs have the chance to go with the unified implementation but that's up to them. The implementation introduces do_pipe_flags. I did that instead of changing all callers of do_pipe because some of the callers are written in assembler. I would probably screw up changing the assembly code. To avoid breaking code do_pipe is now a small wrapper around do_pipe_flags. Once all callers are changed over to do_pipe_flags the old do_pipe function can be removed. The following test must be adjusted for architectures other than x86 and x86-64 and in case the syscall numbers changed. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <sys/syscall.h> #ifndef __NR_pipe2 # ifdef __x86_64__ # define __NR_pipe2 293 # elif defined __i386__ # define __NR_pipe2 331 # else # error "need __NR_pipe2" # endif #endif int main (void) { int fd[2]; if (syscall (__NR_pipe2, fd, 0) != 0) { puts ("pipe2(0) failed"); return 1; } for (int i = 0; i < 2; ++i) { int coe = fcntl (fd[i], F_GETFD); if (coe == -1) { puts ("fcntl failed"); return 1; } if (coe & FD_CLOEXEC) { printf ("pipe2(0) set close-on-exit for fd[%d]\n", i); return 1; } } close (fd[0]); close (fd[1]); if (syscall (__NR_pipe2, fd, O_CLOEXEC) != 0) { puts ("pipe2(O_CLOEXEC) failed"); return 1; } for (int i = 0; i < 2; ++i) { int coe = fcntl (fd[i], F_GETFD); if (coe == -1) { puts ("fcntl failed"); return 1; } if ((coe & FD_CLOEXEC) == 0) { printf ("pipe2(O_CLOEXEC) does not set close-on-exit for fd[%d]\n", i); return 1; } } close (fd[0]); close (fd[1]); puts ("OK"); return 0; } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Signed-off-by: Ulrich Drepper <drepper@redhat.com> Acked-by: Davide Libenzi <davidel@xmailserver.org> Cc: Michael Kerrisk <mtk.manpages@googlemail.com> Cc: <linux-arch@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
||
---|---|---|
.. | ||
asm-offsets.c | ||
audit.c | ||
auxio.c | ||
central.c | ||
cherrs.S | ||
chmc.c | ||
compat_audit.c | ||
cpu.c | ||
ds.c | ||
dtlb_miss.S | ||
dtlb_prot.S | ||
ebus.c | ||
entry.h | ||
etrap.S | ||
fpu_traps.S | ||
ftrace.c | ||
getsetcc.S | ||
head.S | ||
helpers.S | ||
hvapi.c | ||
hvcalls.S | ||
hvtramp.S | ||
idprom.c | ||
init_task.c | ||
iommu_common.h | ||
iommu.c | ||
irq.c | ||
itlb_miss.S | ||
ivec.S | ||
kgdb.c | ||
kprobes.c | ||
ktlb.S | ||
ldc.c | ||
Makefile | ||
mdesc.c | ||
misctrap.S | ||
module.c | ||
of_device.c | ||
pci_common.c | ||
pci_fire.c | ||
pci_impl.h | ||
pci_msi.c | ||
pci_psycho.c | ||
pci_sabre.c | ||
pci_schizo.c | ||
pci_sun4v_asm.S | ||
pci_sun4v.c | ||
pci_sun4v.h | ||
pci.c | ||
power.c | ||
process.c | ||
prom.c | ||
ptrace.c | ||
rtrap.S | ||
sbus.c | ||
setup.c | ||
signal32.c | ||
signal.c | ||
smp.c | ||
sparc64_ksyms.c | ||
spiterrs.S | ||
sstate.c | ||
stacktrace.c | ||
starfire.c | ||
sun4v_ivec.S | ||
sun4v_tlb_miss.S | ||
sys32.S | ||
sys_sparc32.c | ||
sys_sparc.c | ||
syscalls.S | ||
sysfs.c | ||
systbls.h | ||
systbls.S | ||
time.c | ||
trampoline.S | ||
traps.c | ||
tsb.S | ||
ttable.S | ||
una_asm.S | ||
unaligned.c | ||
us2e_cpufreq.c | ||
us3_cpufreq.c | ||
utrap.S | ||
vio.c | ||
viohs.c | ||
visemul.c | ||
vmlinux.lds.S | ||
winfixup.S |