mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
Sat Sep 7 05:15:45 1996 Ulrich Drepper <drepper@cygnus.com> * libio/iofdopen: Initialize _lock field only if _IO_MTSAFE_IO. * libio/iofopen: Likewise. * libio/iofopncook.c: Likewise. * libio/iopopen.c: Likewise. * libio/iovsprintf.c: Likewise. * libio/iovsscanf.c: Likewise. * libio/memstream.c: Likewise. * libio/vasprintf.c: Likewise. * libio/vdprintf.c: Likewise. * libio/vsnprintf.c: Likewise. Sat Sep 7 03:55:47 1996 Ulrich Drepper <drepper@cygnus.com> * Makeconfig (soversions.mk): Also use shlib-versions files in add-on directories. * config.make.in (config-defines): Remove. Not used anymore. (defines): New variable. Initiliazed by @DEFINES@. * configure.in: Add AC_SUBST(DEFINES). * libio/Makefile (routines): When compiling reentrant libc add clearerr_u, feof_u, ferror_u, fputc_u, getc_u, getchar_u, iofflush_u, putc_u, putchar_u, ioflockfile. (CPPFLAGS): Add -D_IO_MTSAFE_IO for reentrant libc. * sysdeps/stub/libc-lock.h: Add stubs for __libc_cleanup_region_start and __libc_cleanup_region_end. * sysdeps/unix/i386/sysdep.S [_LIBC_REENTRANT]: Set errno using __errno_location function. * sysdeps/unix/sysv/linux/i386/sysdep.S [_LIBC_REENTRANT]: Set errno using __errno_location function. (__errno_location): New function. * sysdeps/unix/sysv/linux/i386/sysdep.h [PIC]: Add second syscall_error handler for reentrant libc. * sysdeps/unix/opendir.c: Remove unneeded `;'. * libio.h [_IO_MTSAFE_IO]: Include <pthread.h>. [!_IO_MTSAFE_IO]: Define _IO_flockfile and _IO_funlockfile as empty macros. * libioP.h: Include <libc-lock.h>. * libio/stdio.h: Add prototypes for *_locked and *_unlocked functions. * libio/clearerr.c: Use _IO_ protected versions of flockfile and funlockfile to be namespace clean. * libio/genops.c: Use __libc_lock_* macros for handling lock. * libio/iofdopen: Add initialization of _lock in _IO_FILE. * libio/iofopen: Likewise. * libio/iofopncook.c: Likewise. * libio/iopopen.c: Likewise. * libio/iovsprintf.c: Likewise. * libio/iovsscanf.c: Likewise. * libio/memstream.c: Likewise. * libio/vasprintf.c: Likewise. * libio/vdprintf.c: Likewise. * libio/vsnprintf.c: Likewise. * libio/fgetc.c: Use __libc_cleanup_region_* macros instead of flockfile etc. * libio/fputc.c: Likewise. * libio/freopen.c: Likewise. * libio/fseek.c: Likewise. * libio/getc.c: Likewise. * libio/getchar.c: Likewise. * libio/iofclose.c: Likewise. * libio/iofflush.c: Likewise. * libio/iofgetpos.c: Likewise. * libio/iofgets.c: Likewise. * libio/iofputs.c: Likewise. * libio/iofread.c: Likewise. * libio/iofsetpos.c: Likewise. * libio/ioftell.c: Likewise. * libio/iofwrite.c: Likewise. * libio/iogetdelim.c: Likewise. * libio/iogets.c: Likewise. * libio/ioputs.c: Likewise. * libio/iosetbuffer.c: Likewise. * libio/iosetvbuf.c: Likewise. * libio/ioungetc.c: Likewise. * libio/putc.c: Likewise. * libio/putchar.c: Likewise. * libio/rewind.c: Likewise. * stdio-common/vfprintf.c: Likewise. * stdio-common/vfscanf.c: Likewise. * libio/clearerr_u.c: Correct alias name. * libio/ferror_u.c: Likewise. * libio/fileno.c: Likewise. * libio/fputc_u.c: Likewise. * libio/getc.c: Likewise. * libio/getc_u.c: Likewise. * libio/getchar.c: Likewise. * libio/getchar_u.c: Likewise. * libio/putc.c: Likewise. * libio/putchar.c: Likewise. * libio/feof_u.c: Undefine macro with name of function before definition of function itself. * libio/ioflockfile.c: New file. Implementation of flockfile and funlockfile. * libio/putchar_u.c: Fix typo. Use stdout instead of fp. * malloc/malloc.h: Don't include <libc-lock.h> and don't declare _malloc_loc. * malloc/free.c: Include <libc-lock.h>. * malloc/realloc.c: Likewise. * malloc/malloc-find.c: Likewise. * malloc/malloc-size.c: Likewise. * malloc/malloc-walk.c: Likewise. * malloc/memalign.c: Likewise. * malloc/malloc.c: Likewise. * sysdeps/i386/dl-machine.h: Correct clearing of _dl_starting_up. Fri Sep 6 19:38:49 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/stub/libc-lock.h: Define __libc_lock_critical_start and __libc_lock_critical_end as empty macros. * malloc/malloc.h: Don't include <libc-lock.h> and don't declare __libc_malloc_lock. * malloc/free.c: Include <libc-lock.h>. * malloc/malloc-find.c: Likewise. * malloc/malloc-size.c: Likewise. * malloc/malloc-walk.c: Likewise. * malloc/malloc.c: Likewise. * malloc/memalign.c: Likewise. * malloc/realloc.c: Likewise. * Makefile: Undo change from Mon Sep 2 22:15:14 1996. No more extra_solibs pass. * Rules: Likewise. * extra-lib.mk: Likewise. * manual/Makefile: Likewise. * db/Makefile (makedb): Choose dependecies based on build-shared. Patch by Andres Schwab. * sysdeps/posix/sysconf.c: Don't use PTHREAD_DESTRUCTOR_ITERATIONS but _POSIX_THREAD_DESTRUCTOR_ITERATIONS. * sysdeps/unix/sysv/linux/errnos.h: New file. * sysdeps/unix/sysv/linux/schedbits.h: New file. * sysdeps/unix/sysv/linux/waitflags.h: New file. * sysdeps/unix/sysv/linux/gnu/types.h: Add definition of `key_t'. Fri Sep 6 08:26:31 1996 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * rpm/template: Fix typo in %build section. Fri Sep 6 03:31:07 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/unix/sysv/linux/errnos.h: Don't define errno macro when building libc without thread support. * resolv/netdb.h: Likewise for h_errno macro. Thu Sep 5 23:01:48 1996 Ulrich Drepper <drepper@cygnus.com> * libc-symbols.h: Add new macro weak_const_function. It's like weak_function, but the function is additionally marked as const. * features.h: Only include <sys/cdefs.h> if !__ASSEMBLER__. Thu Sep 5 22:55:49 1996 Richard Henderson <rth@tamu.edu> * inet/herrno.c (__h_errno_location): New function. (h_errno): Make strong_alias __h_errno so that we can access the variable even if `h_errno' is a macro. * resolv/netdb.h: Define macro h_errno to access thread specific version of h_errno variable. Declare alias __h_errno for h_errno. * resolv/res_query (h_errno): Remove definition. * sysdeps/unix/sysv/linux/errnos.h [!__ASSEMBLER__ && __USE_REENTRANT]: Add macro `errno' to get thread specific variable. * sysdeps/unix/alpha/sysdep.S [_LIBC_REENTRANT]: Set errno using __errno_location function. (__errno_location): New function. Thu Sep 5 21:08:44 1996 Ulrich Drepper <drepper@cygnus.com> * posix/gnu/types.h: Remove definition of key_t. * sysdeps/generic/gnu/types.h: Move it to here. * sysdeps/unix/sysv/linux/gnu/types.h: Add Linux specific definition of key_t. * sysdeps/unix/sysv/linux/waitflags.h: New file. Linux specific definitions. * sysdeps/unix/sysv/linux/schedbits.h: New file. Include clone prototypes and associated flags. Thu Sep 5 08:58:47 1996 Richard Henderson <rth@tamu.edu> * sysdeps/alpha/elf/start.S: Make _start global again. hertz. here. Wed Sep 4 16:16:13 1996 Ulrich Drepper <drepper@cygnus.com> * sysdeps/mach/hurd/send.c (__send): De-ANSI-fy. * sysdeps/mach/hurd/sendto.c (sendto): Likewise.
237 lines
6.1 KiB
C
237 lines
6.1 KiB
C
/*
|
|
Copyright (C) 1993 Free Software Foundation
|
|
|
|
This file is part of the GNU IO Library. This library is free
|
|
software; you can redistribute it and/or modify it under the
|
|
terms of the GNU General Public License as published by the
|
|
Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
This library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this library; see the file COPYING. If not, write to the Free
|
|
Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
As a special exception, if you link this library with files
|
|
compiled with a GNU compiler to produce an executable, this does not cause
|
|
the resulting executable to be covered by the GNU General Public License.
|
|
This exception does not however invalidate any other reasons why
|
|
the executable file might be covered by the GNU General Public License. */
|
|
|
|
/* written by Per Bothner (bothner@cygnus.com) */
|
|
|
|
#ifndef _POSIX_SOURCE
|
|
# define _POSIX_SOURCE
|
|
#endif
|
|
#include "libioP.h"
|
|
#if _IO_HAVE_SYS_WAIT
|
|
#include <signal.h>
|
|
#include <unistd.h>
|
|
#ifdef __STDC__
|
|
#include <stdlib.h>
|
|
#endif
|
|
#ifdef _LIBC
|
|
# include <unistd.h>
|
|
#endif
|
|
#include <sys/types.h>
|
|
#include <sys/wait.h>
|
|
|
|
#ifndef _IO_fork
|
|
#define _IO_fork vfork /* defined in libiberty, if needed */
|
|
extern _IO_pid_t _IO_fork __P ((void));
|
|
#endif
|
|
|
|
#endif /* _IO_HAVE_SYS_WAIT */
|
|
|
|
#ifndef _IO_pipe
|
|
#define _IO_pipe pipe
|
|
extern int _IO_pipe __P ((int des[2]));
|
|
#endif
|
|
|
|
#ifndef _IO_dup2
|
|
#define _IO_dup2 dup2
|
|
extern int _IO_dup2 __P ((int fd, int fd2));
|
|
#endif
|
|
|
|
#ifndef _IO_waitpid
|
|
#define _IO_waitpid waitpid
|
|
#endif
|
|
|
|
#ifndef _IO_execl
|
|
#define _IO_execl execl
|
|
#endif
|
|
#ifndef _IO__exit
|
|
#define _IO__exit _exit
|
|
#endif
|
|
|
|
struct _IO_proc_file
|
|
{
|
|
struct _IO_FILE_plus file;
|
|
/* Following fields must match those in class procbuf (procbuf.h) */
|
|
_IO_pid_t pid;
|
|
struct _IO_proc_file *next;
|
|
};
|
|
typedef struct _IO_proc_file _IO_proc_file;
|
|
|
|
static struct _IO_proc_file *proc_file_chain = NULL;
|
|
|
|
_IO_FILE *
|
|
DEFUN(_IO_proc_open, (fp, command, mode),
|
|
_IO_FILE* fp AND const char *command AND const char *mode)
|
|
{
|
|
#if _IO_HAVE_SYS_WAIT
|
|
volatile int read_or_write;
|
|
volatile int parent_end, child_end;
|
|
int pipe_fds[2];
|
|
_IO_pid_t child_pid;
|
|
if (_IO_file_is_open(fp))
|
|
return NULL;
|
|
if (_IO_pipe(pipe_fds) < 0)
|
|
return NULL;
|
|
if (mode[0] == 'r')
|
|
{
|
|
parent_end = pipe_fds[0];
|
|
child_end = pipe_fds[1];
|
|
read_or_write = _IO_NO_WRITES;
|
|
}
|
|
else
|
|
{
|
|
parent_end = pipe_fds[1];
|
|
child_end = pipe_fds[0];
|
|
read_or_write = _IO_NO_READS;
|
|
}
|
|
((_IO_proc_file*)fp)->pid = child_pid = _IO_fork();
|
|
if (child_pid == 0)
|
|
{
|
|
int child_std_end = mode[0] == 'r' ? 1 : 0;
|
|
_IO_close(parent_end);
|
|
if (child_end != child_std_end)
|
|
{
|
|
_IO_dup2(child_end, child_std_end);
|
|
_IO_close(child_end);
|
|
}
|
|
/* Posix.2: "popen() shall ensure that any streams from previous
|
|
popen() calls that remain open in the parent process are closed
|
|
in the new child process." */
|
|
while (proc_file_chain)
|
|
{
|
|
_IO_close (_IO_fileno ((_IO_FILE *) proc_file_chain));
|
|
proc_file_chain = proc_file_chain->next;
|
|
}
|
|
|
|
_IO_execl("/bin/sh", "sh", "-c", command, NULL);
|
|
_IO__exit(127);
|
|
}
|
|
_IO_close(child_end);
|
|
if (child_pid < 0)
|
|
{
|
|
_IO_close(parent_end);
|
|
return NULL;
|
|
}
|
|
_IO_fileno(fp) = parent_end;
|
|
|
|
/* Link into proc_file_chain. */
|
|
((_IO_proc_file*)fp)->next = proc_file_chain;
|
|
proc_file_chain = (_IO_proc_file*)fp;
|
|
|
|
_IO_mask_flags (fp, read_or_write, _IO_NO_READS|_IO_NO_WRITES);
|
|
return fp;
|
|
#else /* !_IO_HAVE_SYS_WAIT */
|
|
return NULL;
|
|
#endif
|
|
}
|
|
|
|
_IO_FILE *
|
|
DEFUN(_IO_popen, (command, mode),
|
|
const char *command AND const char *mode)
|
|
{
|
|
struct locked_FILE
|
|
{
|
|
struct _IO_proc_file fpx;
|
|
_IO_lock_t lock;
|
|
} *new_f;
|
|
_IO_FILE *fp;
|
|
|
|
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
|
|
if (new_f == NULL)
|
|
return NULL;
|
|
new_f->fpx.file.file._lock = &new_f->lock;
|
|
fp = (_IO_FILE*)&new_f->fpx;
|
|
_IO_init(fp, 0);
|
|
_IO_JUMPS(fp) = &_IO_proc_jumps;
|
|
_IO_file_init(fp);
|
|
#if !_IO_UNIFIED_JUMPTABLES
|
|
((struct _IO_FILE_plus*)fp)->vtable = NULL;
|
|
#endif
|
|
if (_IO_proc_open (fp, command, mode) != NULL)
|
|
return fp;
|
|
free (new_f);
|
|
return NULL;
|
|
}
|
|
|
|
strong_alias (_IO_popen, popen);
|
|
|
|
int
|
|
DEFUN(_IO_proc_close, (fp),
|
|
_IO_FILE *fp)
|
|
{
|
|
/* This is not name-space clean. FIXME! */
|
|
#if _IO_HAVE_SYS_WAIT
|
|
int wstatus;
|
|
_IO_proc_file **ptr = &proc_file_chain;
|
|
_IO_pid_t wait_pid;
|
|
int status = -1;
|
|
|
|
/* Unlink from proc_file_chain. */
|
|
for ( ; *ptr != NULL; ptr = &(*ptr)->next)
|
|
{
|
|
if (*ptr == (_IO_proc_file*)fp)
|
|
{
|
|
*ptr = (*ptr)->next;
|
|
status = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (status < 0 || _IO_close(_IO_fileno(fp)) < 0)
|
|
return -1;
|
|
/* POSIX.2 Rationale: "Some historical implementations either block
|
|
or ignore the signals SIGINT, SIGQUIT, and SIGHUP while waiting
|
|
for the child process to terminate. Since this behavior is not
|
|
described in POSIX.2, such implementations are not conforming." */
|
|
do
|
|
{
|
|
wait_pid = _IO_waitpid (((_IO_proc_file*)fp)->pid, &wstatus, 0);
|
|
} while (wait_pid == -1 && errno == EINTR);
|
|
if (wait_pid == -1)
|
|
return -1;
|
|
return wstatus;
|
|
#else /* !_IO_HAVE_SYS_WAIT */
|
|
return -1;
|
|
#endif
|
|
}
|
|
|
|
struct _IO_jump_t _IO_proc_jumps = {
|
|
JUMP_INIT_DUMMY,
|
|
JUMP_INIT(finish, _IO_file_finish),
|
|
JUMP_INIT(overflow, _IO_file_overflow),
|
|
JUMP_INIT(underflow, _IO_file_underflow),
|
|
JUMP_INIT(uflow, _IO_default_uflow),
|
|
JUMP_INIT(pbackfail, _IO_default_pbackfail),
|
|
JUMP_INIT(xsputn, _IO_file_xsputn),
|
|
JUMP_INIT(xsgetn, _IO_default_xsgetn),
|
|
JUMP_INIT(seekoff, _IO_file_seekoff),
|
|
JUMP_INIT(seekpos, _IO_default_seekpos),
|
|
JUMP_INIT(setbuf, _IO_file_setbuf),
|
|
JUMP_INIT(sync, _IO_file_sync),
|
|
JUMP_INIT(doallocate, _IO_file_doallocate),
|
|
JUMP_INIT(read, _IO_file_read),
|
|
JUMP_INIT(write, _IO_file_write),
|
|
JUMP_INIT(seek, _IO_file_seek),
|
|
JUMP_INIT(close, _IO_proc_close),
|
|
JUMP_INIT(stat, _IO_file_stat)
|
|
};
|