mirror of git://sourceware.org/git/glibc.git
Update.
1998-11-23 Ulrich Drepper <drepper@cygnus.com> * Makeconfig: Don't read sysd-sorted unless sysd-dirs is read. Patch by Zack Weinberg. * math/bits/mathcalls.h: Adjust comments. Remove gamma_r prototype. * sysdeps/i386/fpu/bits/mathinline.h: Make log2 only available if __USE_ISOC9X is defined. Provide rint optimization. 1998-11-21 H.J. Lu <hjl@gnu.org> * libio/Versions (_IO_popen, _IO_proc_open, _IO_proc_close, popen, pclose): Add to GLIBC_2.1. * libio/Makefile (routines): Add oldiopopen and oldpclose. (shared-only-routines): Likewise. * libio/pclose.c (pclose): Make it default for GLIBC_2.1. * libio/iopopen.c (_IO_proc_open, _IO_popen, popen, _IO_proc_close): Likewise. * libio/iolibio.h (_IO_new_popen, _IO_old_popen, __new_pclose, __old_pclose): New prototypes. * libio/libioP.h (_IO_new_file_jumps): Removed. (_IO_old_proc_jumps): Added. (_IO_new_proc_open, _IO_old_proc_open): New prototypes. * libio/oldiopopen.c: New file. * libio/oldpclose.c: New file. 1998-11-22 Thorsten Kukuk <kukuk@vt.uni-paderborn.de> * nss/Makefile: Build and install getent. * nss/getent.c: New, get entries from administrative database.
This commit is contained in:
parent
9dc09d3060
commit
7d6a833849
38
ChangeLog
38
ChangeLog
|
@ -1,3 +1,41 @@
|
||||||
|
1998-11-23 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* Makeconfig: Don't read sysd-sorted unless sysd-dirs is read.
|
||||||
|
Patch by Zack Weinberg.
|
||||||
|
|
||||||
|
* math/bits/mathcalls.h: Adjust comments. Remove gamma_r prototype.
|
||||||
|
|
||||||
|
* sysdeps/i386/fpu/bits/mathinline.h: Make log2 only available if
|
||||||
|
__USE_ISOC9X is defined. Provide rint optimization.
|
||||||
|
|
||||||
|
1998-11-21 H.J. Lu <hjl@gnu.org>
|
||||||
|
|
||||||
|
* libio/Versions (_IO_popen, _IO_proc_open, _IO_proc_close,
|
||||||
|
popen, pclose): Add to GLIBC_2.1.
|
||||||
|
|
||||||
|
* libio/Makefile (routines): Add oldiopopen and oldpclose.
|
||||||
|
(shared-only-routines): Likewise.
|
||||||
|
|
||||||
|
* libio/pclose.c (pclose): Make it default for GLIBC_2.1.
|
||||||
|
* libio/iopopen.c (_IO_proc_open, _IO_popen, popen,
|
||||||
|
_IO_proc_close): Likewise.
|
||||||
|
|
||||||
|
* libio/iolibio.h (_IO_new_popen, _IO_old_popen, __new_pclose,
|
||||||
|
__old_pclose): New prototypes.
|
||||||
|
|
||||||
|
* libio/libioP.h (_IO_new_file_jumps): Removed.
|
||||||
|
(_IO_old_proc_jumps): Added.
|
||||||
|
(_IO_new_proc_open, _IO_old_proc_open): New prototypes.
|
||||||
|
|
||||||
|
* libio/oldiopopen.c: New file.
|
||||||
|
|
||||||
|
* libio/oldpclose.c: New file.
|
||||||
|
|
||||||
|
1998-11-22 Thorsten Kukuk <kukuk@vt.uni-paderborn.de>
|
||||||
|
|
||||||
|
* nss/Makefile: Build and install getent.
|
||||||
|
* nss/getent.c: New, get entries from administrative database.
|
||||||
|
|
||||||
1998-11-22 Roland McGrath <roland@baalperazim.frob.com>
|
1998-11-22 Roland McGrath <roland@baalperazim.frob.com>
|
||||||
|
|
||||||
* sysdeps/mach/hurd/i386/init-first.c (init): Provide temporary storage
|
* sysdeps/mach/hurd/i386/init-first.c (init): Provide temporary storage
|
||||||
|
|
|
@ -43,7 +43,8 @@ all: # Make this the default target; it will be defined in Rules.
|
||||||
include ../Makeconfig
|
include ../Makeconfig
|
||||||
|
|
||||||
ifeq ($(versioning),yes)
|
ifeq ($(versioning),yes)
|
||||||
routines += oldiofopen oldiofdopen oldiofclose oldtmpfile
|
routines += oldiofopen oldiofdopen oldiofclose oldiopopen oldpclose \
|
||||||
|
oldtmpfile
|
||||||
endif
|
endif
|
||||||
|
|
||||||
CPPFLAGS-.o += -DIO_DEBUG
|
CPPFLAGS-.o += -DIO_DEBUG
|
||||||
|
@ -63,7 +64,7 @@ aux += oldfileops oldstdfiles
|
||||||
endif
|
endif
|
||||||
|
|
||||||
shared-only-routines = oldiofopen oldiofdopen oldiofclose oldfileops \
|
shared-only-routines = oldiofopen oldiofdopen oldiofclose oldfileops \
|
||||||
oldstdfiles oldtmpfile
|
oldstdfiles oldiopopen oldpclose oldtmpfile
|
||||||
|
|
||||||
distribute := iolibio.h libioP.h strfile.h Banner
|
distribute := iolibio.h libioP.h strfile.h Banner
|
||||||
|
|
||||||
|
|
|
@ -81,13 +81,13 @@ libc {
|
||||||
_IO_2_1_stdin_; _IO_2_1_stdout_; _IO_2_1_stderr_;
|
_IO_2_1_stdin_; _IO_2_1_stdout_; _IO_2_1_stderr_;
|
||||||
|
|
||||||
# functions used in other libraries
|
# functions used in other libraries
|
||||||
_IO_fclose; _IO_fopen; _IO_fdopen; __asprintf;
|
_IO_fclose; _IO_fopen; _IO_fdopen; _IO_popen; __asprintf;
|
||||||
|
|
||||||
# functions used in libstdc++
|
# functions used in libstdc++
|
||||||
_IO_do_write; _IO_file_attach; _IO_file_close_it; _IO_file_finish;
|
_IO_do_write; _IO_file_attach; _IO_file_close_it; _IO_file_finish;
|
||||||
_IO_file_fopen; _IO_file_init; _IO_file_overflow; _IO_file_seekoff;
|
_IO_file_fopen; _IO_file_init; _IO_file_overflow; _IO_file_seekoff;
|
||||||
_IO_file_setbuf; _IO_file_sync; _IO_file_underflow;
|
_IO_file_setbuf; _IO_file_sync; _IO_file_underflow;
|
||||||
_IO_file_write; _IO_file_xsputn;
|
_IO_file_write; _IO_file_xsputn; _IO_proc_open; _IO_proc_close;
|
||||||
|
|
||||||
# Changed getline function in libio.
|
# Changed getline function in libio.
|
||||||
_IO_getline_info;
|
_IO_getline_info;
|
||||||
|
@ -95,6 +95,6 @@ libc {
|
||||||
# f*
|
# f*
|
||||||
fgetpos64; fopen64; freopen64; fseeko; fseeko64; fsetpos64; ftello;
|
fgetpos64; fopen64; freopen64; fseeko; fseeko64; fsetpos64; ftello;
|
||||||
ftello64; fopen; fclose; fdopen; fread_unlocked; fwrite_unlocked;
|
ftello64; fopen; fclose; fdopen; fread_unlocked; fwrite_unlocked;
|
||||||
fgets_unlocked; fputs_unlocked;
|
fgets_unlocked; fputs_unlocked; popen; pclose;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,6 +62,10 @@ extern int _IO_obstack_printf __P ((struct obstack *, const char *, ...));
|
||||||
(_IO_file_close_it(FP), _IO_file_fopen(FP, FILENAME, MODE, 1))
|
(_IO_file_close_it(FP), _IO_file_fopen(FP, FILENAME, MODE, 1))
|
||||||
#define _IO_fileno(FP) ((FP)->_fileno)
|
#define _IO_fileno(FP) ((FP)->_fileno)
|
||||||
extern _IO_FILE* _IO_popen __P((const char*, const char*));
|
extern _IO_FILE* _IO_popen __P((const char*, const char*));
|
||||||
|
extern _IO_FILE* _IO_new_popen __P((const char*, const char*));
|
||||||
|
extern _IO_FILE* _IO_old_popen __P((const char*, const char*));
|
||||||
|
extern int __new_pclose __P((_IO_FILE *));
|
||||||
|
extern int __old_pclose __P((_IO_FILE *));
|
||||||
#define _IO_pclose _IO_fclose
|
#define _IO_pclose _IO_fclose
|
||||||
#define _IO_setbuf(_FP, _BUF) _IO_setbuffer(_FP, _BUF, _IO_BUFSIZ)
|
#define _IO_setbuf(_FP, _BUF) _IO_setbuffer(_FP, _BUF, _IO_BUFSIZ)
|
||||||
#define _IO_setlinebuf(_FP) _IO_setvbuf(_FP, NULL, 1, 0)
|
#define _IO_setlinebuf(_FP) _IO_setvbuf(_FP, NULL, 1, 0)
|
||||||
|
|
|
@ -104,7 +104,7 @@ typedef struct _IO_proc_file _IO_proc_file;
|
||||||
static struct _IO_proc_file *proc_file_chain = NULL;
|
static struct _IO_proc_file *proc_file_chain = NULL;
|
||||||
|
|
||||||
_IO_FILE *
|
_IO_FILE *
|
||||||
_IO_proc_open (fp, command, mode)
|
_IO_new_proc_open (fp, command, mode)
|
||||||
_IO_FILE *fp;
|
_IO_FILE *fp;
|
||||||
const char *command;
|
const char *command;
|
||||||
const char *mode;
|
const char *mode;
|
||||||
|
@ -177,7 +177,7 @@ _IO_proc_open (fp, command, mode)
|
||||||
}
|
}
|
||||||
|
|
||||||
_IO_FILE *
|
_IO_FILE *
|
||||||
_IO_popen (command, mode)
|
_IO_new_popen (command, mode)
|
||||||
const char *command;
|
const char *command;
|
||||||
const char *mode;
|
const char *mode;
|
||||||
{
|
{
|
||||||
|
@ -199,23 +199,19 @@ _IO_popen (command, mode)
|
||||||
fp = &new_f->fpx.file.file;
|
fp = &new_f->fpx.file.file;
|
||||||
_IO_init (fp, 0);
|
_IO_init (fp, 0);
|
||||||
_IO_JUMPS (fp) = &_IO_proc_jumps;
|
_IO_JUMPS (fp) = &_IO_proc_jumps;
|
||||||
_IO_file_init (fp);
|
_IO_new_file_init (fp);
|
||||||
#if !_IO_UNIFIED_JUMPTABLES
|
#if !_IO_UNIFIED_JUMPTABLES
|
||||||
new_f->fpx.file.vtable = NULL;
|
new_f->fpx.file.vtable = NULL;
|
||||||
#endif
|
#endif
|
||||||
if (_IO_proc_open (fp, command, mode) != NULL)
|
if (_IO_new_proc_open (fp, command, mode) != NULL)
|
||||||
return fp;
|
return fp;
|
||||||
_IO_un_link (fp);
|
_IO_un_link (fp);
|
||||||
free (new_f);
|
free (new_f);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef strong_alias
|
|
||||||
strong_alias (_IO_popen, popen);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int
|
int
|
||||||
_IO_proc_close (fp)
|
_IO_new_proc_close (fp)
|
||||||
_IO_FILE *fp;
|
_IO_FILE *fp;
|
||||||
{
|
{
|
||||||
/* This is not name-space clean. FIXME! */
|
/* This is not name-space clean. FIXME! */
|
||||||
|
@ -257,23 +253,40 @@ _IO_proc_close (fp)
|
||||||
|
|
||||||
struct _IO_jump_t _IO_proc_jumps = {
|
struct _IO_jump_t _IO_proc_jumps = {
|
||||||
JUMP_INIT_DUMMY,
|
JUMP_INIT_DUMMY,
|
||||||
JUMP_INIT(finish, _IO_file_finish),
|
JUMP_INIT(finish, _IO_new_file_finish),
|
||||||
JUMP_INIT(overflow, _IO_file_overflow),
|
JUMP_INIT(overflow, _IO_new_file_overflow),
|
||||||
JUMP_INIT(underflow, _IO_file_underflow),
|
JUMP_INIT(underflow, _IO_new_file_underflow),
|
||||||
JUMP_INIT(uflow, _IO_default_uflow),
|
JUMP_INIT(uflow, _IO_default_uflow),
|
||||||
JUMP_INIT(pbackfail, _IO_default_pbackfail),
|
JUMP_INIT(pbackfail, _IO_default_pbackfail),
|
||||||
JUMP_INIT(xsputn, _IO_file_xsputn),
|
JUMP_INIT(xsputn, _IO_new_file_xsputn),
|
||||||
JUMP_INIT(xsgetn, _IO_default_xsgetn),
|
JUMP_INIT(xsgetn, _IO_default_xsgetn),
|
||||||
JUMP_INIT(seekoff, _IO_file_seekoff),
|
JUMP_INIT(seekoff, _IO_new_file_seekoff),
|
||||||
JUMP_INIT(seekpos, _IO_default_seekpos),
|
JUMP_INIT(seekpos, _IO_default_seekpos),
|
||||||
JUMP_INIT(setbuf, _IO_file_setbuf),
|
JUMP_INIT(setbuf, _IO_new_file_setbuf),
|
||||||
JUMP_INIT(sync, _IO_file_sync),
|
JUMP_INIT(sync, _IO_new_file_sync),
|
||||||
JUMP_INIT(doallocate, _IO_file_doallocate),
|
JUMP_INIT(doallocate, _IO_file_doallocate),
|
||||||
JUMP_INIT(read, _IO_file_read),
|
JUMP_INIT(read, _IO_file_read),
|
||||||
JUMP_INIT(write, _IO_file_write),
|
JUMP_INIT(write, _IO_new_file_write),
|
||||||
JUMP_INIT(seek, _IO_file_seek),
|
JUMP_INIT(seek, _IO_file_seek),
|
||||||
JUMP_INIT(close, _IO_proc_close),
|
JUMP_INIT(close, _IO_new_proc_close),
|
||||||
JUMP_INIT(stat, _IO_file_stat),
|
JUMP_INIT(stat, _IO_file_stat),
|
||||||
JUMP_INIT(showmanyc, _IO_default_showmanyc),
|
JUMP_INIT(showmanyc, _IO_default_showmanyc),
|
||||||
JUMP_INIT(imbue, _IO_default_imbue)
|
JUMP_INIT(imbue, _IO_default_imbue)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined PIC && DO_VERSIONING
|
||||||
|
strong_alias (_IO_new_popen, __new_popen)
|
||||||
|
default_symbol_version (_IO_new_popen, _IO_popen, GLIBC_2.1);
|
||||||
|
default_symbol_version (__new_popen, popen, GLIBC_2.1);
|
||||||
|
default_symbol_version (_IO_new_proc_open, _IO_proc_open, GLIBC_2.1);
|
||||||
|
default_symbol_version (_IO_new_proc_close, _IO_proc_close, GLIBC_2.1);
|
||||||
|
#else
|
||||||
|
# ifdef strong_alias
|
||||||
|
strong_alias (_IO_new_popen, popen)
|
||||||
|
# endif
|
||||||
|
# ifdef weak_alias
|
||||||
|
weak_alias (_IO_new_popen, _IO_popen)
|
||||||
|
weak_alias (_IO_new_proc_open, _IO_proc_open)
|
||||||
|
weak_alias (_IO_new_proc_close, _IO_proc_close)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
|
@ -334,10 +334,10 @@ extern int _IO_default_showmanyc __P ((_IO_FILE *));
|
||||||
extern void _IO_default_imbue __P ((_IO_FILE *, void *));
|
extern void _IO_default_imbue __P ((_IO_FILE *, void *));
|
||||||
|
|
||||||
extern struct _IO_jump_t _IO_file_jumps;
|
extern struct _IO_jump_t _IO_file_jumps;
|
||||||
extern struct _IO_jump_t _IO_new_file_jumps;
|
|
||||||
extern struct _IO_jump_t _IO_old_file_jumps;
|
extern struct _IO_jump_t _IO_old_file_jumps;
|
||||||
extern struct _IO_jump_t _IO_streambuf_jumps;
|
extern struct _IO_jump_t _IO_streambuf_jumps;
|
||||||
extern struct _IO_jump_t _IO_proc_jumps;
|
extern struct _IO_jump_t _IO_proc_jumps;
|
||||||
|
extern struct _IO_jump_t _IO_old_proc_jumps;
|
||||||
extern struct _IO_jump_t _IO_str_jumps;
|
extern struct _IO_jump_t _IO_str_jumps;
|
||||||
extern int _IO_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
|
extern int _IO_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
|
||||||
extern int _IO_new_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
|
extern int _IO_new_do_write __P ((_IO_FILE *, const char *, _IO_size_t));
|
||||||
|
@ -424,7 +424,11 @@ extern void _IO_old_file_finish __P ((_IO_FILE *, int));
|
||||||
|
|
||||||
/* Jumptable functions for proc_files. */
|
/* Jumptable functions for proc_files. */
|
||||||
extern _IO_FILE* _IO_proc_open __P ((_IO_FILE *, const char *, const char *));
|
extern _IO_FILE* _IO_proc_open __P ((_IO_FILE *, const char *, const char *));
|
||||||
|
extern _IO_FILE* _IO_new_proc_open __P ((_IO_FILE *, const char *, const char *));
|
||||||
|
extern _IO_FILE* _IO_old_proc_open __P ((_IO_FILE *, const char *, const char *));
|
||||||
extern int _IO_proc_close __P ((_IO_FILE *));
|
extern int _IO_proc_close __P ((_IO_FILE *));
|
||||||
|
extern int _IO_new_proc_close __P ((_IO_FILE *));
|
||||||
|
extern int _IO_old_proc_close __P ((_IO_FILE *));
|
||||||
|
|
||||||
/* Jumptable functions for strfiles. */
|
/* Jumptable functions for strfiles. */
|
||||||
extern int _IO_str_underflow __P ((_IO_FILE *));
|
extern int _IO_str_underflow __P ((_IO_FILE *));
|
||||||
|
|
|
@ -0,0 +1,282 @@
|
||||||
|
/* Copyright (C) 1998 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU IO Library.
|
||||||
|
Written by Per Bothner <bothner@cygnus.com>.
|
||||||
|
|
||||||
|
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. */
|
||||||
|
|
||||||
|
#define _IO_USE_OLD_IO_FILE
|
||||||
|
#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
|
||||||
|
#ifdef _LIBC
|
||||||
|
#define _IO_fork __vfork
|
||||||
|
#else
|
||||||
|
#define _IO_fork vfork /* defined in libiberty, if needed */
|
||||||
|
#endif
|
||||||
|
extern _IO_pid_t _IO_fork __P ((void));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _IO_HAVE_SYS_WAIT */
|
||||||
|
|
||||||
|
#ifndef _IO_pipe
|
||||||
|
#ifdef _LIBC
|
||||||
|
#define _IO_pipe __pipe
|
||||||
|
#else
|
||||||
|
#define _IO_pipe pipe
|
||||||
|
#endif
|
||||||
|
extern int _IO_pipe __P ((int des[2]));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _IO_dup2
|
||||||
|
#ifdef _LIBC
|
||||||
|
#define _IO_dup2 __dup2
|
||||||
|
#else
|
||||||
|
#define _IO_dup2 dup2
|
||||||
|
#endif
|
||||||
|
extern int _IO_dup2 __P ((int fd, int fd2));
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _IO_waitpid
|
||||||
|
#ifdef _LIBC
|
||||||
|
#define _IO_waitpid __waitpid
|
||||||
|
#else
|
||||||
|
#define _IO_waitpid waitpid
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _IO_execl
|
||||||
|
#define _IO_execl execl
|
||||||
|
#endif
|
||||||
|
#ifndef _IO__exit
|
||||||
|
#define _IO__exit _exit
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _IO_close
|
||||||
|
#ifdef _LIBC
|
||||||
|
#define _IO_close __close
|
||||||
|
#else
|
||||||
|
#define _IO_close close
|
||||||
|
#endif
|
||||||
|
#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 *old_proc_file_chain = NULL;
|
||||||
|
|
||||||
|
_IO_FILE *
|
||||||
|
_IO_old_proc_open (fp, command, mode)
|
||||||
|
_IO_FILE *fp;
|
||||||
|
const char *command;
|
||||||
|
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' && mode[1] == '\0')
|
||||||
|
{
|
||||||
|
parent_end = pipe_fds[0];
|
||||||
|
child_end = pipe_fds[1];
|
||||||
|
read_or_write = _IO_NO_WRITES;
|
||||||
|
}
|
||||||
|
else if (mode[0] == 'w' && mode[1] == '\0')
|
||||||
|
{
|
||||||
|
parent_end = pipe_fds[1];
|
||||||
|
child_end = pipe_fds[0];
|
||||||
|
read_or_write = _IO_NO_READS;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
__set_errno (EINVAL);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
((_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 (old_proc_file_chain)
|
||||||
|
{
|
||||||
|
_IO_close (_IO_fileno ((_IO_FILE *) old_proc_file_chain));
|
||||||
|
old_proc_file_chain = old_proc_file_chain->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
_IO_execl ("/bin/sh", "sh", "-c", command, (char *) 0);
|
||||||
|
_IO__exit (127);
|
||||||
|
}
|
||||||
|
_IO_close (child_end);
|
||||||
|
if (child_pid < 0)
|
||||||
|
{
|
||||||
|
_IO_close (parent_end);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
_IO_fileno (fp) = parent_end;
|
||||||
|
|
||||||
|
/* Link into old_proc_file_chain. */
|
||||||
|
((_IO_proc_file *) fp)->next = old_proc_file_chain;
|
||||||
|
old_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 *
|
||||||
|
_IO_old_popen (command, mode)
|
||||||
|
const char *command;
|
||||||
|
const char *mode;
|
||||||
|
{
|
||||||
|
struct locked_FILE
|
||||||
|
{
|
||||||
|
struct _IO_proc_file fpx;
|
||||||
|
#ifdef _IO_MTSAFE_IO
|
||||||
|
_IO_lock_t lock;
|
||||||
|
#endif
|
||||||
|
} *new_f;
|
||||||
|
_IO_FILE *fp;
|
||||||
|
|
||||||
|
new_f = (struct locked_FILE *) malloc (sizeof (struct locked_FILE));
|
||||||
|
if (new_f == NULL)
|
||||||
|
return NULL;
|
||||||
|
#ifdef _IO_MTSAFE_IO
|
||||||
|
new_f->fpx.file.file._lock = &new_f->lock;
|
||||||
|
#endif
|
||||||
|
fp = &new_f->fpx.file.file;
|
||||||
|
_IO_init (fp, 0);
|
||||||
|
_IO_JUMPS (fp) = &_IO_old_proc_jumps;
|
||||||
|
_IO_old_file_init (fp);
|
||||||
|
#if !_IO_UNIFIED_JUMPTABLES
|
||||||
|
new_f->fpx.file.vtable = NULL;
|
||||||
|
#endif
|
||||||
|
if (_IO_old_proc_open (fp, command, mode) != NULL)
|
||||||
|
return fp;
|
||||||
|
_IO_un_link (fp);
|
||||||
|
free (new_f);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
_IO_old_proc_close (fp)
|
||||||
|
_IO_FILE *fp;
|
||||||
|
{
|
||||||
|
/* This is not name-space clean. FIXME! */
|
||||||
|
#if _IO_HAVE_SYS_WAIT
|
||||||
|
int wstatus;
|
||||||
|
_IO_proc_file **ptr = &old_proc_file_chain;
|
||||||
|
_IO_pid_t wait_pid;
|
||||||
|
int status = -1;
|
||||||
|
|
||||||
|
/* Unlink from old_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_old_proc_jumps = {
|
||||||
|
JUMP_INIT_DUMMY,
|
||||||
|
JUMP_INIT(finish, _IO_old_file_finish),
|
||||||
|
JUMP_INIT(overflow, _IO_old_file_overflow),
|
||||||
|
JUMP_INIT(underflow, _IO_old_file_underflow),
|
||||||
|
JUMP_INIT(uflow, _IO_default_uflow),
|
||||||
|
JUMP_INIT(pbackfail, _IO_default_pbackfail),
|
||||||
|
JUMP_INIT(xsputn, _IO_old_file_xsputn),
|
||||||
|
JUMP_INIT(xsgetn, _IO_default_xsgetn),
|
||||||
|
JUMP_INIT(seekoff, _IO_old_file_seekoff),
|
||||||
|
JUMP_INIT(seekpos, _IO_default_seekpos),
|
||||||
|
JUMP_INIT(setbuf, _IO_old_file_setbuf),
|
||||||
|
JUMP_INIT(sync, _IO_old_file_sync),
|
||||||
|
JUMP_INIT(doallocate, _IO_file_doallocate),
|
||||||
|
JUMP_INIT(read, _IO_file_read),
|
||||||
|
JUMP_INIT(write, _IO_old_file_write),
|
||||||
|
JUMP_INIT(seek, _IO_file_seek),
|
||||||
|
JUMP_INIT(close, _IO_old_proc_close),
|
||||||
|
JUMP_INIT(stat, _IO_file_stat),
|
||||||
|
JUMP_INIT(showmanyc, _IO_default_showmanyc),
|
||||||
|
JUMP_INIT(imbue, _IO_default_imbue)
|
||||||
|
};
|
||||||
|
|
||||||
|
strong_alias (_IO_old_popen, __old_popen)
|
||||||
|
symbol_version (_IO_old_popen, _IO_popen, GLIBC_2.0);
|
||||||
|
symbol_version (__old_popen, popen, GLIBC_2.0);
|
||||||
|
symbol_version (_IO_old_proc_open, _IO_proc_open, GLIBC_2.0);
|
||||||
|
symbol_version (_IO_old_proc_close, _IO_proc_close, GLIBC_2.0);
|
|
@ -0,0 +1,44 @@
|
||||||
|
/* Copyright (C) 1998 Free Software Foundation, Inc.
|
||||||
|
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. */
|
||||||
|
|
||||||
|
#define _IO_USE_OLD_IO_FILE
|
||||||
|
#include "libioP.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
__old_pclose (fp)
|
||||||
|
FILE *fp;
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
/* Does not actually test that stream was created by popen(). Instead,
|
||||||
|
it depends on the filebuf::sys_close() virtual to Do The Right Thing. */
|
||||||
|
if (fp is not a proc_file)
|
||||||
|
return -1;
|
||||||
|
#endif
|
||||||
|
return _IO_old_fclose (fp);
|
||||||
|
}
|
||||||
|
|
||||||
|
symbol_version (__old_pclose, pclose, GLIBC_2.0);
|
|
@ -1,4 +1,4 @@
|
||||||
/* Copyright (C) 1993, 1995, 1996, 1997 Free Software Foundation, Inc.
|
/* Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU IO Library.
|
This file is part of the GNU IO Library.
|
||||||
|
|
||||||
This library is free software; you can redistribute it and/or
|
This library is free software; you can redistribute it and/or
|
||||||
|
@ -28,7 +28,7 @@
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
int
|
int
|
||||||
pclose (fp)
|
__new_pclose (fp)
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
{
|
{
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -37,5 +37,13 @@ pclose (fp)
|
||||||
if (fp is not a proc_file)
|
if (fp is not a proc_file)
|
||||||
return -1;
|
return -1;
|
||||||
#endif
|
#endif
|
||||||
return _IO_fclose (fp);
|
return _IO_new_fclose (fp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined PIC && DO_VERSIONING
|
||||||
|
default_symbol_version (__new_pclose, pclose, GLIBC_2.1);
|
||||||
|
#else
|
||||||
|
# ifdef weak_alias
|
||||||
|
weak_alias (__new_pclose, pclose)
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
|
@ -225,7 +225,7 @@ __MATHCALL (yn,, (int, _Mdouble_));
|
||||||
|
|
||||||
|
|
||||||
#if defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC9X
|
#if defined __USE_MISC || defined __USE_XOPEN || defined __USE_ISOC9X
|
||||||
/* Error, gamma, and Bessel functions. */
|
/* Error and gamma functions. */
|
||||||
__MATHCALL (erf,, (_Mdouble_));
|
__MATHCALL (erf,, (_Mdouble_));
|
||||||
__MATHCALL (erfc,, (_Mdouble_));
|
__MATHCALL (erfc,, (_Mdouble_));
|
||||||
__MATHCALL (lgamma,, (_Mdouble_));
|
__MATHCALL (lgamma,, (_Mdouble_));
|
||||||
|
@ -233,15 +233,15 @@ __MATHCALL (tgamma,, (_Mdouble_));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined __USE_MISC || defined __USE_XOPEN
|
#if defined __USE_MISC || defined __USE_XOPEN
|
||||||
|
/* Obsolete alias for `lgamma'. */
|
||||||
__MATHCALL (gamma,, (_Mdouble_));
|
__MATHCALL (gamma,, (_Mdouble_));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __USE_MISC
|
#ifdef __USE_MISC
|
||||||
/* Reentrant versions of gamma and lgamma. Those functions use the global
|
/* Reentrant version of lgamma. This function uses the global variable
|
||||||
variable `signgam'. The reentrant versions instead take a pointer and
|
`signgam'. The reentrant version instead takes a pointer and stores
|
||||||
store the value through it. */
|
the value through it. */
|
||||||
__MATHCALL (gamma,_r, (_Mdouble_, int *));
|
__MATHCALL (lgamma,_r, (_Mdouble_, int *__signgamp));
|
||||||
__MATHCALL (lgamma,_r, (_Mdouble_, int *));
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,9 @@ routines = nsswitch $(addsuffix -lookup,$(databases))
|
||||||
databases = proto service hosts network grp pwd rpc ethers \
|
databases = proto service hosts network grp pwd rpc ethers \
|
||||||
spwd netgrp key alias
|
spwd netgrp key alias
|
||||||
|
|
||||||
|
others := getent
|
||||||
|
install-bin := getent
|
||||||
|
|
||||||
tests = test-netdb
|
tests = test-netdb
|
||||||
|
|
||||||
include ../Makeconfig
|
include ../Makeconfig
|
||||||
|
|
|
@ -0,0 +1,511 @@
|
||||||
|
/* Copyright (c) 1998 Free Software Foundation, Inc.
|
||||||
|
This file is part of the GNU C Library.
|
||||||
|
Contributed by Thorsten Kukuk <kukuk@vt.uni-paderborn.de>, 1998.
|
||||||
|
|
||||||
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public License as
|
||||||
|
published by the Free Software Foundation; either version 2 of the
|
||||||
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
|
The GNU C 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
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
|
/* getent: get entries from administrative database
|
||||||
|
supported databases: passwd, group, hosts, services, protocols
|
||||||
|
and networks */
|
||||||
|
|
||||||
|
#include <argp.h>
|
||||||
|
#include <grp.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <error.h>
|
||||||
|
#include <libintl.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
/* Get libc version number. */
|
||||||
|
#include <version.h>
|
||||||
|
|
||||||
|
#define PACKAGE _libc_intl_domainname
|
||||||
|
|
||||||
|
/* Name and version of program. */
|
||||||
|
static void print_version (FILE *stream, struct argp_state *state);
|
||||||
|
void (*argp_program_version_hook) (FILE *, struct argp_state *) = print_version;
|
||||||
|
|
||||||
|
/* Short description of parameters. */
|
||||||
|
static const char args_doc[] = N_("database [key ...]");
|
||||||
|
|
||||||
|
/* Short description of program. */
|
||||||
|
static const char doc[] =
|
||||||
|
N_("getent - get entries from administrative database.");
|
||||||
|
|
||||||
|
/* Data structure to communicate with argp functions. */
|
||||||
|
static struct argp argp = {
|
||||||
|
NULL, NULL, args_doc, doc,
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Print the version information. */
|
||||||
|
static void
|
||||||
|
print_version (FILE *stream, struct argp_state *state)
|
||||||
|
{
|
||||||
|
fprintf (stream, "getent (GNU %s) %s\n", PACKAGE, VERSION);
|
||||||
|
fprintf (stream, gettext ("\
|
||||||
|
Copyright (C) %s Free Software Foundation, Inc.\n\
|
||||||
|
This is free software; see the source for copying conditions. There is NO\n\
|
||||||
|
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\
|
||||||
|
"), "1998");
|
||||||
|
fprintf (stream, gettext ("Written by %s.\n"), "Thorsten Kukuk");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is for group */
|
||||||
|
static inline void
|
||||||
|
print_group (struct group *grp)
|
||||||
|
{
|
||||||
|
unsigned int i = 0;
|
||||||
|
|
||||||
|
printf ("%s:%s:%ld:", grp->gr_name ? grp->gr_name : "",
|
||||||
|
grp->gr_passwd ? grp->gr_passwd : "",
|
||||||
|
(unsigned long)grp->gr_gid);
|
||||||
|
|
||||||
|
while (grp->gr_mem[i] != NULL)
|
||||||
|
{
|
||||||
|
fputs (grp->gr_mem[i], stdout);
|
||||||
|
++i;
|
||||||
|
if (grp->gr_mem[i] != NULL)
|
||||||
|
fputs (",", stdout);
|
||||||
|
}
|
||||||
|
fputs ("\n", stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
group_keys (int number, char *key[])
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < number; ++i)
|
||||||
|
{
|
||||||
|
struct group *grp;
|
||||||
|
|
||||||
|
if (isdigit (key[i][0]))
|
||||||
|
grp = getgrgid (atol (key[i]));
|
||||||
|
else
|
||||||
|
grp = getgrnam (key[i]);
|
||||||
|
|
||||||
|
if (grp == NULL)
|
||||||
|
result = 2;
|
||||||
|
else
|
||||||
|
print_group (grp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is for networks */
|
||||||
|
static inline void
|
||||||
|
print_networks (struct netent *net)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
struct in_addr ip;
|
||||||
|
ip.s_addr = htonl (net->n_net);
|
||||||
|
|
||||||
|
fputs (net->n_name, stdout);
|
||||||
|
for (i = strlen (net->n_name); i < 22; ++i)
|
||||||
|
fputs (" ", stdout);
|
||||||
|
fputs (inet_ntoa (ip), stdout);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (net->n_aliases[i] != NULL)
|
||||||
|
{
|
||||||
|
fputs (" ", stdout);
|
||||||
|
fputs (net->n_aliases[i], stdout);
|
||||||
|
++i;
|
||||||
|
if (net->n_aliases[i] != NULL)
|
||||||
|
fputs (",", stdout);
|
||||||
|
}
|
||||||
|
fputs ("\n", stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
networks_keys (int number, char *key[])
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < number; ++i)
|
||||||
|
{
|
||||||
|
struct netent *net;
|
||||||
|
|
||||||
|
if (isdigit (key[i][0]))
|
||||||
|
net = getnetbyaddr (inet_addr (key[i]), AF_UNIX);
|
||||||
|
else
|
||||||
|
net = getnetbyname (key[i]);
|
||||||
|
|
||||||
|
if (net == NULL)
|
||||||
|
result = 2;
|
||||||
|
else
|
||||||
|
print_networks (net);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now is all for passwd */
|
||||||
|
static inline void
|
||||||
|
print_passwd (struct passwd *pwd)
|
||||||
|
{
|
||||||
|
printf ("%s:%s:%ld:%ld:%s:%s:%s\n",
|
||||||
|
pwd->pw_name ? pwd->pw_name : "",
|
||||||
|
pwd->pw_passwd ? pwd->pw_passwd : "",
|
||||||
|
(unsigned long)pwd->pw_uid,
|
||||||
|
(unsigned long)pwd->pw_gid,
|
||||||
|
pwd->pw_gecos ? pwd->pw_gecos : "",
|
||||||
|
pwd->pw_dir ? pwd->pw_dir : "",
|
||||||
|
pwd->pw_shell ? pwd->pw_shell : "");
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
passwd_keys (int number, char *key[])
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < number; ++i)
|
||||||
|
{
|
||||||
|
struct passwd *pwd;
|
||||||
|
|
||||||
|
if (isdigit (key[i][0]))
|
||||||
|
pwd = getpwuid (atol (key[i]));
|
||||||
|
else
|
||||||
|
pwd = getpwnam (key[i]);
|
||||||
|
|
||||||
|
if (pwd == NULL)
|
||||||
|
result = 2;
|
||||||
|
else
|
||||||
|
print_passwd (pwd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is for protocols */
|
||||||
|
static inline void
|
||||||
|
print_protocols (struct protoent *proto)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
fputs (proto->p_name, stdout);
|
||||||
|
for (i = strlen (proto->p_name); i < 22; ++i)
|
||||||
|
fputs (" ", stdout);
|
||||||
|
printf ("%d", proto->p_proto);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (proto->p_aliases[i] != NULL)
|
||||||
|
{
|
||||||
|
fputs (" ", stdout);
|
||||||
|
fputs (proto->p_aliases[i], stdout);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
fputs ("\n", stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
protocols_keys (int number, char *key[])
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < number; ++i)
|
||||||
|
{
|
||||||
|
struct protoent *proto;
|
||||||
|
|
||||||
|
if (isdigit (key[i][0]))
|
||||||
|
proto = getprotobynumber (atol (key[i]));
|
||||||
|
else
|
||||||
|
proto = getprotobyname (key[i]);
|
||||||
|
|
||||||
|
if (proto == NULL)
|
||||||
|
result = 2;
|
||||||
|
else
|
||||||
|
print_protocols (proto);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* This is for hosts */
|
||||||
|
static inline void
|
||||||
|
print_hosts (struct hostent *host)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
char *ip = inet_ntoa(* (struct in_addr *) host->h_addr_list[0]);
|
||||||
|
|
||||||
|
fputs (ip, stdout);
|
||||||
|
for (i = strlen (ip); i < 16; ++i)
|
||||||
|
fputs (" ", stdout);
|
||||||
|
fputs (host->h_name, stdout);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (host->h_aliases[i] != NULL)
|
||||||
|
{
|
||||||
|
fputs (" ", stdout);
|
||||||
|
fputs (host->h_aliases[i], stdout);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
fputs ("\n", stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
hosts_keys (int number, char *key[])
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < number; ++i)
|
||||||
|
{
|
||||||
|
struct hostent *host;
|
||||||
|
|
||||||
|
if (isdigit (key[i][0]))
|
||||||
|
{
|
||||||
|
struct in_addr addr;
|
||||||
|
addr.s_addr = inet_addr (key[i]);
|
||||||
|
|
||||||
|
host = gethostbyaddr ((char *)&addr, sizeof (struct in_addr),
|
||||||
|
AF_INET);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
host = gethostbyname (key[i]);
|
||||||
|
|
||||||
|
if (host == NULL)
|
||||||
|
result = 2;
|
||||||
|
else
|
||||||
|
print_hosts (host);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* for services */
|
||||||
|
static inline void
|
||||||
|
print_services (struct servent *serv)
|
||||||
|
{
|
||||||
|
unsigned int i;
|
||||||
|
|
||||||
|
fputs (serv->s_name, stdout);
|
||||||
|
for (i = strlen (serv->s_name); i < 22; ++i)
|
||||||
|
fputs (" ", stdout);
|
||||||
|
printf ("%d/%s", ntohs (serv->s_port), serv->s_proto);
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
while (serv->s_aliases[i] != NULL)
|
||||||
|
{
|
||||||
|
fputs (" ", stdout);
|
||||||
|
fputs (serv->s_aliases[i], stdout);
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
fputs ("\n", stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int
|
||||||
|
services_keys (int number, char *key[])
|
||||||
|
{
|
||||||
|
int result = 0;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < number; ++i)
|
||||||
|
{
|
||||||
|
struct servent *serv;
|
||||||
|
char *proto = strchr (key[i], '/');
|
||||||
|
|
||||||
|
if (proto == NULL)
|
||||||
|
{
|
||||||
|
setservent (0);
|
||||||
|
if (isdigit (key[i][0]))
|
||||||
|
{
|
||||||
|
int port = htons (atol (key[i]));
|
||||||
|
while ((serv = getservent ()) != NULL)
|
||||||
|
if (serv->s_port == port)
|
||||||
|
{
|
||||||
|
print_services (serv);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
while ((serv = getservent ()) != NULL)
|
||||||
|
if (strcmp (serv->s_name, key[i]) == 0)
|
||||||
|
{
|
||||||
|
print_services (serv);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
endservent ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
*proto++ = '\0';
|
||||||
|
|
||||||
|
if (isdigit (key[i][0]))
|
||||||
|
serv = getservbyport (atol (key[i]), proto);
|
||||||
|
else
|
||||||
|
serv = getservbyname (key[i], proto);
|
||||||
|
|
||||||
|
if (serv == NULL)
|
||||||
|
result = 2;
|
||||||
|
else
|
||||||
|
print_services (serv);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* the main function */
|
||||||
|
int
|
||||||
|
main (int argc, char *argv[])
|
||||||
|
{
|
||||||
|
int remaining;
|
||||||
|
|
||||||
|
/* Set locale via LC_ALL. */
|
||||||
|
setlocale (LC_ALL, "");
|
||||||
|
/* Set the text message domain. */
|
||||||
|
textdomain (PACKAGE);
|
||||||
|
|
||||||
|
/* Parse and process arguments. */
|
||||||
|
argp_parse (&argp, argc, argv, 0, &remaining, NULL);
|
||||||
|
|
||||||
|
if ((argc - remaining) < 1)
|
||||||
|
{
|
||||||
|
error (0, 0, gettext ("wrong number of arguments"));
|
||||||
|
argp_help (&argp, stdout, ARGP_HELP_SEE, program_invocation_short_name);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(argv[1][0])
|
||||||
|
{
|
||||||
|
case 'g': /* group */
|
||||||
|
if (strcmp (argv[1], "group") == 0)
|
||||||
|
{
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
struct group *grp;
|
||||||
|
|
||||||
|
setgrent ();
|
||||||
|
while ((grp = getgrent()) != NULL)
|
||||||
|
print_group (grp);
|
||||||
|
endgrent ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return group_keys (argc - 2, &argv[2]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto error;
|
||||||
|
break;
|
||||||
|
case 'h': /* hosts */
|
||||||
|
if (strcmp (argv[1], "hosts") == 0)
|
||||||
|
{
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
struct hostent *host;
|
||||||
|
|
||||||
|
sethostent (0);
|
||||||
|
while ((host = gethostent()) != NULL)
|
||||||
|
print_hosts (host);
|
||||||
|
endhostent ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return hosts_keys (argc - 2, &argv[2]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto error;
|
||||||
|
break;
|
||||||
|
case 'n': /* networks */
|
||||||
|
if (strcmp (argv[1], "networks") == 0)
|
||||||
|
{
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
struct netent *net;
|
||||||
|
|
||||||
|
setnetent (0);
|
||||||
|
while ((net = getnetent()) != NULL)
|
||||||
|
print_networks (net);
|
||||||
|
endnetent ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return networks_keys (argc - 2, &argv[2]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto error;
|
||||||
|
break;
|
||||||
|
case 'p': /* passwd, protocols */
|
||||||
|
if (strcmp (argv[1], "passwd") == 0)
|
||||||
|
{
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
struct passwd *pwd;
|
||||||
|
|
||||||
|
setpwent ();
|
||||||
|
while ((pwd = getpwent()) != NULL)
|
||||||
|
print_passwd (pwd);
|
||||||
|
endpwent ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return passwd_keys (argc - 2, &argv[2]);
|
||||||
|
}
|
||||||
|
else if (strcmp (argv[1], "protocols") == 0)
|
||||||
|
{
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
struct protoent *proto;
|
||||||
|
|
||||||
|
setprotoent (0);
|
||||||
|
while ((proto = getprotoent()) != NULL)
|
||||||
|
print_protocols (proto);
|
||||||
|
endprotoent ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return protocols_keys (argc - 2, &argv[2]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto error;
|
||||||
|
break;
|
||||||
|
case 's': /* services */
|
||||||
|
if (strcmp (argv[1], "services") == 0)
|
||||||
|
{
|
||||||
|
if (argc == 2)
|
||||||
|
{
|
||||||
|
struct servent *serv;
|
||||||
|
|
||||||
|
setservent (0);
|
||||||
|
while ((serv = getservent()) != NULL)
|
||||||
|
print_services (serv);
|
||||||
|
endservent ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return services_keys (argc - 2, &argv[2]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
goto error;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
error:
|
||||||
|
fprintf (stderr, _("Unknown database: %s\n"), argv[1]);
|
||||||
|
argp_help (&argp, stdout, ARGP_HELP_SEE, program_invocation_short_name);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -499,8 +499,6 @@ ldexp (double __x, int __y)
|
||||||
/* Optimized versions for some non-standardized functions. */
|
/* Optimized versions for some non-standardized functions. */
|
||||||
#if defined __USE_ISOC9X || defined __USE_MISC
|
#if defined __USE_ISOC9X || defined __USE_MISC
|
||||||
|
|
||||||
__inline_mathop(log2, "fld1; fxch; fyl2x")
|
|
||||||
|
|
||||||
__inline_mathcode (expm1, __x, __expm1_code)
|
__inline_mathcode (expm1, __x, __expm1_code)
|
||||||
|
|
||||||
/* We cannot rely on M_SQRT being defined. So we do it for ourself
|
/* We cannot rely on M_SQRT being defined. So we do it for ourself
|
||||||
|
@ -533,7 +531,6 @@ __inline_mathcode (atanh, __x, \
|
||||||
register long double __y = __fabsl (__x); \
|
register long double __y = __fabsl (__x); \
|
||||||
return -0.5 * log1pl (-(__y + __y) / (1.0 + __y)) * __sgn1l (__x))
|
return -0.5 * log1pl (-(__y + __y) / (1.0 + __y)) * __sgn1l (__x))
|
||||||
|
|
||||||
|
|
||||||
/* The argument range of the inline version of hypotl is slightly reduced. */
|
/* The argument range of the inline version of hypotl is slightly reduced. */
|
||||||
__inline_mathcode2 (hypot, __x, __y, return __sqrtl (__x * __x + __y * __y))
|
__inline_mathcode2 (hypot, __x, __y, return __sqrtl (__x * __x + __y * __y))
|
||||||
|
|
||||||
|
@ -545,6 +542,11 @@ __inline_mathcode(logb, __x, \
|
||||||
: "=t" (__junk), "=u" (__value) : "0" (__x)); \
|
: "=t" (__junk), "=u" (__value) : "0" (__x)); \
|
||||||
return __value)
|
return __value)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __USE_ISOC9X
|
||||||
|
__inline_mathop(log2, "fld1; fxch; fyl2x")
|
||||||
|
|
||||||
__MATH_INLINE float ldexpf (float __x, int __y);
|
__MATH_INLINE float ldexpf (float __x, int __y);
|
||||||
__MATH_INLINE float
|
__MATH_INLINE float
|
||||||
ldexpf (float __x, int __y)
|
ldexpf (float __x, int __y)
|
||||||
|
@ -560,6 +562,9 @@ ldexpl (long double __x, int __y)
|
||||||
}
|
}
|
||||||
|
|
||||||
__inline_mathcode3 (fma, __x, __y, __z, return (__x * __y) + __z)
|
__inline_mathcode3 (fma, __x, __y, __z, return (__x * __y) + __z)
|
||||||
|
|
||||||
|
__inline_mathop(rint, "frndint")
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue