diff options
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/bits/poll.h | 38 | ||||
-rw-r--r-- | sysdeps/generic/dl-sysdep.c | 27 |
2 files changed, 56 insertions, 9 deletions
diff --git a/sysdeps/generic/bits/poll.h b/sysdeps/generic/bits/poll.h new file mode 100644 index 0000000000..55ec70e363 --- /dev/null +++ b/sysdeps/generic/bits/poll.h @@ -0,0 +1,38 @@ +/* Copyright (C) 1997 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + 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. */ + + +/* Event types that can be polled for. These bits may be set in `events' + to indicate the interesting event types; they will appear in `revents' + to indicate the status of the file descriptor. */ +#define POLLIN 01 /* There is data to read. */ +#define POLLPRI 02 /* There is urgent data to read. */ +#define POLLOUT 04 /* Writing now will not block. */ + +/* Some aliases. */ +#define POLLWRNORM POLLOUT + +/* Event types always implicitly polled for. These bits need not be set in + `events', but they will appear in `revents' to indicate the status of + the file descriptor. */ +#define POLLERR 010 /* Error condition. */ +#define POLLHUP 020 /* Hung up. */ +#define POLLNVAL 040 /* Invalid polling request. */ + +/* Canonical number of polling requests to read in at a time in poll. */ +#define NPOLLFILE 30 diff --git a/sysdeps/generic/dl-sysdep.c b/sysdeps/generic/dl-sysdep.c index b942e40f7a..7ee3002314 100644 --- a/sysdeps/generic/dl-sysdep.c +++ b/sysdeps/generic/dl-sysdep.c @@ -45,6 +45,21 @@ int __libc_multiple_libcs; /* Defining this here avoids the inclusion of init-first. */ static ElfW(auxv_t) *_dl_auxv; + +#ifndef DL_FIND_ARG_COMPONENTS +#define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \ + do { \ + void **_tmp; \ + (argc) = *(long *) cookie; \ + (argv) = (char **) cookie + 1; \ + (envp) = (argv) + (argc) + 1; \ + for (_tmp = (void **) (envp); *_tmp; ++_tmp) \ + continue; \ + (auxp) = (void *) ++_tmp; \ + } while (0) +#endif + + ElfW(Addr) _dl_sysdep_start (void **start_argptr, void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum, @@ -60,21 +75,15 @@ _dl_sysdep_start (void **start_argptr, gid_t egid = 0; unsigned int seen; + DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, _dl_argv, _environ, _dl_auxv); + user_entry = (ElfW(Addr)) &ENTRY_POINT; - _dl_argc = *(long *) start_argptr; - _dl_argv = (char **) start_argptr + 1; - _environ = &_dl_argv[_dl_argc + 1]; _dl_platform = NULL; /* Default to nothing known about the platform. */ - start_argptr = (void **) _environ; - while (*start_argptr) - ++start_argptr; seen = 0; #define M(type) (1 << (type)) - for (av = _dl_auxv = (void *) ++start_argptr; - av->a_type != AT_NULL; - seen |= M ((++av)->a_type)) + for (av = _dl_auxv; av->a_type != AT_NULL; seen |= M ((++av)->a_type)) switch (av->a_type) { case AT_PHDR: |