aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1996-09-22 03:06:42 +0000
committerUlrich Drepper <drepper@redhat.com>1996-09-22 03:06:42 +0000
commit845dcb57b1de1b8c2ea88cd101d6e5a80181ee4e (patch)
treec13a286fe36773fc4d7d34af8527956a6ec8838b /sysdeps
parentdaf2bb515bdd8212c8d95b78e70ef02f035304c5 (diff)
downloadglibc-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.h15
-rw-r--r--sysdeps/generic/sys/sysinfo.h41
-rw-r--r--sysdeps/posix/sysconf.c25
-rw-r--r--sysdeps/stub/getsysstats.c68
-rw-r--r--sysdeps/stub/sysconf.c25
-rw-r--r--sysdeps/unix/sysv/linux/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/getsysstats.c200
-rw-r--r--sysdeps/unix/sysv/linux/sys/sysinfo.h18
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 */