diff options
author | Ulrich Drepper <drepper@redhat.com> | 1996-09-22 03:06:42 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 1996-09-22 03:06:42 +0000 |
commit | 845dcb57b1de1b8c2ea88cd101d6e5a80181ee4e (patch) | |
tree | c13a286fe36773fc4d7d34af8527956a6ec8838b /sysdeps | |
parent | daf2bb515bdd8212c8d95b78e70ef02f035304c5 (diff) | |
download | glibc-845dcb57b1de1b8c2ea88cd101d6e5a80181ee4e.zip glibc-845dcb57b1de1b8c2ea88cd101d6e5a80181ee4e.tar.gz glibc-845dcb57b1de1b8c2ea88cd101d6e5a80181ee4e.tar.bz2 |
update from main archive 960921
Sun Sep 22 03:40:52 1996 Ulrich Drepper <drepper@cygnus.com>
* resolv/resolv.h: Update to bind-4.9.5-T4B.
* resolv/base64.c: Likewise.
* resolv/res_debug.c: Likewise.
* resolv/res_query.c: Likewise.
* resolv/gethnamaddr.c: Likewise.
* nss/nss_dns/dns-host.c: Likewise.
* resolv/res_comp.c: Likewise.
* resolv/res_send.c: Likewise.
* resolv/arpa/nameser.h: Likewise. Attention: MAXDNAME is much
higher now.
* resolv/Banner: New file.
* resolv/Makefile (distribute): Add Banner.
Sat Sep 21 19:15:24 1996 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/stub/getsysstats.c: New file.
* sysdeps/unix/sysv/linux/getsysstats.c: New file.
* misc/Makefile (headers): Add sys/sysinfo.h.
(routines): Add getsysstats.
* sysdeps/unix/sysv/linux/Makefile [$(subdir)==misc]
(sysdep_headers): Remove sys/sysinfo.h.
* sysdeps/generic/sys/sysinfo.h: New file.
* sysdeps/unix/sysv/linux/sys/sysinfo.h: Add prototype for get_nprocs,
get_phys_pages, and get_avphys_pages.
* misc/Makefile (routines): Add mntent_r.
* misc/mntent_r.c: New file.
* misc/mntent.c: Remove all functions but getmntent and use
__getmntent_r.
* misc/mntent.h: Add prototype for __getmntent_r.
* misc/fstab.c: Use __getmntent_r function instead of getmntent.
This will not clobber the state in getmntent.
* sysdeps/generic/confname.h: Add _SC_PROCESSORS_CONF,
_SC_NPROCESSORS_ONLN, _SC_PHYS_PAGES, _SC_AVPHYS_PAGES,
_SC_ATEXIT_MAX, and _SC_PASS_MAX.
* sysdeps/stub/sysconf.c: Add handling _SC_PROCESSORS_CONF and
_SC_NPROCESSORS_ONLN by calling __get_nprocs, _SC_PHYS_PAGES by
calling __get_phys_pages, _SY_AVPHYS_PAGES by calling
__get_avphys_pages, _SC_ATEXIT_MAX and _SC_PASS_MAX.
* sysdeps/posix/sysconf.c: Likewise.
* posix/getconf.c (vars): Add _NPROCESSORS_CONF, _NPROCESSORS_ONLN,
_PHYS_PAGES, _AVPHYS_PAGES, ATEXIT_MAX, and PASS_MAX entries.
Sat Sep 21 05:20:36 1996 Ulrich Drepper <drepper@cygnus.com>
* version.h (VERSION): Bump to 1.95.
* Make-dist (+tsrcs): Don't filter out files in subdirs which
match files in the sysdeps hierachy (welcome back,
sys/syscall.h!).
* resolv/Makefile (libresolv-routines): Remove getnetnamad.
Sat Sep 21 03:00:19 1996 Ulrich Drepper <drepper@cygnus.com>
* locale/loadlocale.c (_nl_free_locale): Remove function.
* locale/localeinfo.h: Remove prototype for _nl_free_locale.
* locale/setlocale.c (setlocale): Don't free locale data of
categories which succeeded to load after a wrong or missing data
file was observed.
* locale/setlocale (setlocale): Initialize NEWNAME correctly so
that it works even when the locale data is not used.
* stdlib/random_r.c: Fix typo in comment.
* stdlib/drand48-iter.c: Likewise.
* stdlib/drand48.c: Likewise.
* stdlib/erand48.c: Likewise.
* stdlib/jrand48.c: Likewise.
* stdlib/lcong48.c: Likewise.
* stdlib/lrand48.c: Likewise.
* stdlib/mrand48.c: Likewise.
* stdlib/nrand48.c: Likewise.
* stdlib/random.c: Likewise.
* stdlib/seed48.c: Likewise.
* stdlib/srand48.c: Likewise.
* misc/search.h: Likewise.
* misc/hsearch.c: Likewise.
* misc/hsearch_r.c: Likewise.
* sysdeps/unix/sysv/linux/m68k/sysdep.S (__errno_location):
Thu Sep 19 23:36:19 1996 Thomas Bushnell, n/BSG <thomas@gnu.ai.mit.edu>
* hurd/hurdinit.c (__libc_argv): Provide common decl.
(_hurd_setproc): Don't declare __libc_argv here.
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/generic/confname.h | 15 | ||||
-rw-r--r-- | sysdeps/generic/sys/sysinfo.h | 41 | ||||
-rw-r--r-- | sysdeps/posix/sysconf.c | 25 | ||||
-rw-r--r-- | sysdeps/stub/getsysstats.c | 68 | ||||
-rw-r--r-- | sysdeps/stub/sysconf.c | 25 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/Makefile | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/getsysstats.c | 200 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sys/sysinfo.h | 18 |
8 files changed, 393 insertions, 1 deletions
diff --git a/sysdeps/generic/confname.h b/sysdeps/generic/confname.h index d0968a1..3d76843 100644 --- a/sysdeps/generic/confname.h +++ b/sysdeps/generic/confname.h @@ -224,6 +224,21 @@ enum #define _SC_THREAD_PRIO_PROTECT _SC_THREAD_PRIO_PROTECT _SC_THREAD_PROCESS_SHARED, #define _SC_THREAD_PROCESS_SHARED _SC_THREAD_PROCESS_SHARED + + _SC_NPROCESSORS_CONF, +#define _SC_NPROCESSORS_CONF _SC_NPROCESSORS_CONF + _SC_NPROCESSORS_ONLN, +#define _SC_NPROCESSORS_ONLN _SC_NPROCESSORS_ONLN + _SC_PHYS_PAGES, +#define _SC_PHYS_PAGES _SC_PHYS_PAGES + _SC_AVPHYS_PAGES, +#define _SC_AVPHYS_PAGES _SC_AVPHYS_PAGES + _SC_ATEXIT_MAX, +#define _SC_ATEXIT_MAX _SC_ATEXIT_MAX + _SC_PASS_MAX, +#define _SC_PASS_MAX _SC_PASS_MAX + _SC_XOPEN_VERSION +#define _SC_XOPEN_VERSION _SC_XOPEN_VERSION }; #ifdef __USE_POSIX2 diff --git a/sysdeps/generic/sys/sysinfo.h b/sysdeps/generic/sys/sysinfo.h new file mode 100644 index 0000000..e9f6674 --- /dev/null +++ b/sysdeps/generic/sys/sysinfo.h @@ -0,0 +1,41 @@ +/* Copyright (C) 1996 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. */ + +#ifndef _SYS_SYSINFO_H + +#define _SYS_SYSINFO_H 1 +#include <features.h> + +/* Return number of configured processors. */ +extern int __get_nproc_conf __P ((void)); +extern int get_nproc_conf __P ((void)); + +/* Return number of available processors. */ +extern int __get_nproc __P ((void)); +extern int get_nproc __P ((void)); + + +/* Return number of physical pages of memory in the system. */ +extern int __get_phys_pages __P ((void)); +extern int get_phys_pages __P ((void)); + +/* Return number of available physical pages of memory in the system. */ +extern int __get_avphys_pages __P ((void)); +extern int get_avphys_pages __P ((void)); + +#endif /* sys/sysinfo.h */ diff --git a/sysdeps/posix/sysconf.c b/sysdeps/posix/sysconf.c index 29d0613..14ee58c 100644 --- a/sysdeps/posix/sysconf.c +++ b/sysdeps/posix/sysconf.c @@ -24,6 +24,7 @@ Cambridge, MA 02139, USA. */ #include <stdio.h> #include <time.h> #include <unistd.h> +#include <sys/sysinfo.h> extern int __getdtablesize __P ((void)); extern size_t __getpagesize __P ((void)); @@ -595,6 +596,30 @@ __sysconf (name) #else return -1; #endif + + case _SC_NPROCESSORS_CONF: + return __get_nprocs_conf (); + + case _SC_NPROCESSORS_ONLN: + return __get_nprocs (); + + case _SC_PHYS_PAGES: + return __get_phys_pages (); + + case _SC_AVPHYS_PAGES: + return __get_avphys_pages (); + + case _SC_ATEXIT_MAX: + /* We have no limit since we use lists. */ + return INT_MAX; + + case _SC_PASS_MAX: + /* We have no limit but since the return value might be used to + allocate a buffer we restrict the value. */ + return BUFSIZ; + + case _SC_XOPEN_VERSION: + return _XOPEN_VERSION; } } diff --git a/sysdeps/stub/getsysstats.c b/sysdeps/stub/getsysstats.c new file mode 100644 index 0000000..c8fe700 --- /dev/null +++ b/sysdeps/stub/getsysstats.c @@ -0,0 +1,68 @@ +/* getsysstats - Determine various system internal values, stub version. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +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. */ + +#include <errno.h> +#include <sys/sysinfo.h> + +int +__get_nprocs_conf () +{ + /* We don't know how to determine the number. Simply return always 1. */ + return 1; +} +weak_alias (__get_nprocs_conf, get_nprocs_conf) + +link_warning (get_nprocs_conf, "warning: get_nprocs_conf will always return 1") + + + +int +__get_nprocs () +{ + /* We don't know how to determine the number. Simply return always 1. */ + return 1; +} +weak_alias (__get_nprocs, get_nprocs) + +link_warning (get_nprocs, "warning: get_nprocs will always return 1") + + +int +__get_phys_pages () +{ + /* We have no general way to determine this value. */ + errno = ENOSYS; + return -1; +} +weak_alias (__get_phys_pages, get_phys_pages) + +link_warning (get_phys_pages, "warning: get_phys_pages will always fail") + + +int +__get_avphys_pages () +{ + /* We have no general way to determine this value. */ + errno = ENOSYS; + return -1; +} +weak_alias (__get_avphys_pages, get_avphys_pages) + +link_warning (get_avphys_pages, "warning: get_avphys_pages will always fail") diff --git a/sysdeps/stub/sysconf.c b/sysdeps/stub/sysconf.c index 613ef67..1351b48 100644 --- a/sysdeps/stub/sysconf.c +++ b/sysdeps/stub/sysconf.c @@ -17,9 +17,11 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include <errno.h> +#include <stdio.h> #include <unistd.h> #include <time.h> #include <limits.h> +#include <sys/sysinfo.h> /* Get the value of the system variable NAME. */ @@ -64,6 +66,27 @@ __sysconf (name) return -1; #endif + case _SC_NPROCESSORS_CONF: + return __get_nprocs_conf (); + + case _SC_NPROCESSORS_ONLN: + return __get_nprocs (); + + case _SC_PHYS_PAGES: + return __get_phys_pages (); + + case _SC_AVPHYS_PAGES: + return __get_avphys_pages (); + + case _SC_ATEXIT_MAX: + /* We have no limit since we use lists. */ + return INT_MAX; + + case _SC_PASS_MAX: + /* We have no limit but since the return value might be used to + allocate a buffer we restrict the value. */ + return BUFSIZ; + case _SC_ARG_MAX: case _SC_CHILD_MAX: case _SC_CLK_TCK: @@ -145,6 +168,8 @@ __sysconf (name) case _SC_THREAD_PRIO_PROTECT: case _SC_THREAD_PROCESS_SHARED: + case _SC_XOPEN_VERSION: + break; } diff --git a/sysdeps/unix/sysv/linux/Makefile b/sysdeps/unix/sysv/linux/Makefile index 02b44a8..33220df 100644 --- a/sysdeps/unix/sysv/linux/Makefile +++ b/sysdeps/unix/sysv/linux/Makefile @@ -5,7 +5,7 @@ endif ifeq ($(subdir), misc) sysdep_routines += sysctl clone -sysdep_headers += sys/mount.h sys/sysinfo.h sys/acct.h sys/sysctl.h \ +sysdep_headers += sys/mount.h sys/acct.h sys/sysctl.h \ sys/module.h sys/io.h sys/klog.h sys/kdaemon.h \ sys/user.h syscall-list.h sys/sysmacros.h sys/procfs.h diff --git a/sysdeps/unix/sysv/linux/getsysstats.c b/sysdeps/unix/sysv/linux/getsysstats.c new file mode 100644 index 0000000..81946b4 --- /dev/null +++ b/sysdeps/unix/sysv/linux/getsysstats.c @@ -0,0 +1,200 @@ +/* getsysstats - Determine various system internal values, Linux version. +Copyright (C) 1996 Free Software Foundation, Inc. +This file is part of the GNU C Library. +Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996. + +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. */ + +#include <errno.h> +#include <mntent.h> +#include <stdio.h> +#include <string.h> +#include <unistd.h> +#include <sys/sysinfo.h> + + +/* Determine the path to the /proc filesystem if available. */ +static char * +get_proc_path (char *buffer, size_t bufsize) +{ + FILE *fp; + struct mntent mount_point; + struct mntent *entry; + char *result; + + /* First find the mount point of the proc filesystem. */ + fp = __setmntent (_PATH_MNTTAB, "r"); + if (fp == NULL) + /* Cannot find mount table file. */ + result = NULL; + else + { + while ((entry = __getmntent_r (fp, &mount_point, buffer, bufsize)) + != NULL) + if (strcmp (mount_point.mnt_type, "proc") == 0) + { + result = mount_point.mnt_dir; + break; + } + __endmntent (fp); + } + + return result; +} + + +/* How we can determine the number of available processors depends on + the configuration. There is currently (as of version 2.0.21) no + system call to determine the number. It is planned for the 2.1.x + series to add this, though. + + One possibility to implement it for systems using Linux 2.0 is to + examine the pseudo file /proc/meminfo. Here we have one entry for + each processor. + + But not all systems have support for the /proc filesystem. If it + is not available we simply return 1 since there is no way. */ +int +__get_nprocs () +{ + FILE *fp; + char buffer[8192]; + char *proc_path; + int result = 1; + + /* XXX Here will come a test for the new system call. */ + + /* Get mount point of proc filesystem. */ + proc_path = get_proc_path (buffer, sizeof buffer); + + /* If we haven't found an appropriate entry return 1. */ + if (proc_path != NULL) + { + char *proc_cpuinfo = alloca (strlen (proc_path) + sizeof ("/cpuinfo")); + __stpcpy (__stpcpy (proc_cpuinfo, proc_path), "/cpuinfo"); + + fp = fopen (proc_cpuinfo, "r"); + if (fp != NULL) + { + result = 0; + /* Read all lines and count the lines starting with the + string "processor". We don't have to fear extremely long + lines since the kernel will not generate them. 8192 + bytes are really enough. */ + while (fgets (buffer, sizeof buffer, fp) != NULL) + if (strncmp (buffer, "processor", 9) == 0) + ++result; + + fclose (fp); + } + } + + return result; +} +weak_alias (__get_nprocs, get_nprocs) + +/* As far as I know Linux has no separate numbers for configured and + available processors. So make the `get_nprocs_conf' function an + prototype. */ +strong_alias (__get_nprocs, __get_nprocs_conf) +weak_alias (__get_nprocs, get_nprocs_conf) + + +/* General function to get information about memory status from proc + filesystem. */ +static int +phys_pages_info (const char *format) +{ + FILE *fp; + char buffer[8192]; + char *proc_path; + int result = -1; + + /* Get mount point of proc filesystem. */ + proc_path = get_proc_path (buffer, sizeof buffer); + + /* If we haven't found an appropriate entry return 1. */ + if (proc_path != NULL) + { + char *proc_meminfo = alloca (strlen (proc_path) + sizeof ("/meminfo")); + __stpcpy (__stpcpy (proc_meminfo, proc_path), "/meminfo"); + + fp = fopen (proc_meminfo, "r"); + if (fp != NULL) + { + result = 0; + /* Read all lines and count the lines starting with the + string "processor". We don't have to fear extremely long + lines since the kernel will not generate them. 8192 + bytes are really enough. */ + while (fgets (buffer, sizeof buffer, fp) != NULL) + if (sscanf (buffer, format, &result) == 1) + { + result /= (__getpagesize () / 1024); + break; + } + + fclose (fp); + } + } + + if (result == -1) + /* We cannot get the needed value: signal an error. */ + errno = ENOSYS; + + return result; +} + + +/* Return the number of pages of physical memory in the system. There + is currently (as of version 2.0.21) no system call to determine the + number. It is planned for the 2.1.x series to add this, though. + + One possibility to implement it for systems using Linux 2.0 is to + examine the pseudo file /proc/cpuinfo. Here we have one entry for + each processor. + + But not all systems have support for the /proc filesystem. If it + is not available we return -1 as an error signal. */ +int +__get_phys_pages () +{ + /* XXX Here will come a test for the new system call. */ + + return phys_pages_info ("MemTotal: %d kB"); +} +weak_alias (__get_phys_pages, get_phys_pages) + + +/* Return the number of available pages of physical memory in the + system. There is currently (as of version 2.0.21) no system call + to determine the number. It is planned for the 2.1.x series to add + this, though. + + One possibility to implement it for systems using Linux 2.0 is to + examine the pseudo file /proc/cpuinfo. Here we have one entry for + each processor. + + But not all systems have support for the /proc filesystem. If it + is not available we return -1 as an error signal. */ +int +__get_avphys_pages () +{ + /* XXX Here will come a test for the new system call. */ + + return phys_pages_info ("MemFree: %d kB"); +} +weak_alias (__get_avphys_pages, get_avphys_pages) diff --git a/sysdeps/unix/sysv/linux/sys/sysinfo.h b/sysdeps/unix/sysv/linux/sys/sysinfo.h index c05da05..1fabb06 100644 --- a/sysdeps/unix/sysv/linux/sys/sysinfo.h +++ b/sysdeps/unix/sysv/linux/sys/sysinfo.h @@ -27,4 +27,22 @@ Boston, MA 02111-1307, USA. */ /* Returns information on overall system statistics. */ extern int sysinfo __P ((struct sysinfo *__info)); + +/* Return number of configured processors. */ +extern int __get_nproc_conf __P ((void)); +extern int get_nproc_conf __P ((void)); + +/* Return number of available processors. */ +extern int __get_nproc __P ((void)); +extern int get_nproc __P ((void)); + + +/* Return number of physical pages of memory in the system. */ +extern int __get_phys_pages __P ((void)); +extern int get_phys_pages __P ((void)); + +/* Return number of available physical pages of memory in the system. */ +extern int __get_avphys_pages __P ((void)); +extern int get_avphys_pages __P ((void)); + #endif /* sys/sysinfo.h */ |