From 845dcb57b1de1b8c2ea88cd101d6e5a80181ee4e Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 22 Sep 1996 03:06:42 +0000 Subject: update from main archive 960921 Sun Sep 22 03:40:52 1996 Ulrich Drepper * 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 * 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 * 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 * 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 * hurd/hurdinit.c (__libc_argv): Provide common decl. (_hurd_setproc): Don't declare __libc_argv here. --- sysdeps/unix/sysv/linux/Makefile | 2 +- sysdeps/unix/sysv/linux/getsysstats.c | 200 ++++++++++++++++++++++++++++++++++ sysdeps/unix/sysv/linux/sys/sysinfo.h | 18 +++ 3 files changed, 219 insertions(+), 1 deletion(-) create mode 100644 sysdeps/unix/sysv/linux/getsysstats.c (limited to 'sysdeps/unix/sysv') 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 , 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 +#include +#include +#include +#include +#include + + +/* 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 */ -- cgit v1.1