From bde4d37a647fa27331ba1ca7a28ad92cf605e4b6 Mon Sep 17 00:00:00 2001 From: Olaf Barthel Date: Fri, 28 Jul 2006 14:02:32 +0000 Subject: [PATCH] - Added sysinfo() as contributed by Peter Bengtsson. Thank you very much! git-svn-id: file:///Users/olsen/Code/migration-svn-zu-git/logical-line-staging/clib2/trunk@15107 87f5fb63-7c3d-0410-a384-fd976d0f7a62 --- library/GNUmakefile.68k | 4 +- library/GNUmakefile.os4 | 4 +- library/changes | 2 +- library/include/sys/resource.h | 14 ++- library/include/sys/systeminfo.h | 84 +++++++++++++ library/include/sys/timeb.h | 14 ++- library/include/ulimit.h | 18 ++- library/systeminfo_sysinfo.c | 209 +++++++++++++++++++++++++++++++ library/ulimit_ulimit.c | 90 +++++++++++++ 9 files changed, 433 insertions(+), 6 deletions(-) create mode 100644 library/include/sys/systeminfo.h create mode 100644 library/systeminfo_sysinfo.c create mode 100644 library/ulimit_ulimit.c diff --git a/library/GNUmakefile.68k b/library/GNUmakefile.68k index 0448984..617c5e0 100644 --- a/library/GNUmakefile.68k +++ b/library/GNUmakefile.68k @@ -1,5 +1,5 @@ # -# $Id: GNUmakefile.68k,v 1.87 2006-07-28 13:36:16 obarthel Exp $ +# $Id: GNUmakefile.68k,v 1.88 2006-07-28 14:02:30 obarthel Exp $ # # :ts=8 # @@ -506,6 +506,7 @@ UNIX_LIB = \ stdlib_realloc.o \ stdlib_resetmemstats.o \ stdlib_system.o \ + systeminfo_sysinfo.o \ termios_cfgetispeed.o \ termios_cfgetospeed.o \ termios_cfmakeraw.o \ @@ -797,6 +798,7 @@ NET_LIB = \ socket_get_h_errno.o \ socket_set_h_errno.o \ stat_umask.o \ + systeminfo_sysinfo.o \ usergroup_crypt.o \ usergroup_data.o \ usergroup_endgrent.o \ diff --git a/library/GNUmakefile.os4 b/library/GNUmakefile.os4 index f3ed335..a265e2c 100644 --- a/library/GNUmakefile.os4 +++ b/library/GNUmakefile.os4 @@ -1,5 +1,5 @@ # -# $Id: GNUmakefile.os4,v 1.100 2006-07-28 13:36:16 obarthel Exp $ +# $Id: GNUmakefile.os4,v 1.101 2006-07-28 14:02:31 obarthel Exp $ # # :ts=8 # @@ -548,6 +548,7 @@ UNIX_LIB = \ stdlib_realloc.o \ stdlib_resetmemstats.o \ stdlib_system.o \ + systeminfo_sysinfo.o \ termios_cfgetispeed.o \ termios_cfgetospeed.o \ termios_cfmakeraw.o \ @@ -807,6 +808,7 @@ NET_LIB = \ socket_hstrerror.o \ socket_get_h_errno.o \ socket_set_h_errno.o \ + systeminfo_sysinfo.o \ stat_umask.o \ usergroup_crypt.o \ usergroup_data.o \ diff --git a/library/changes b/library/changes index a51af78..ac0f468 100644 --- a/library/changes +++ b/library/changes @@ -1,4 +1,4 @@ -- Added ftime(), ulimit(), getrlimit() and setrlimit() as contributed by +- Added sysinfo(), ftime(), ulimit(), getrlimit() and setrlimit() as contributed by Peter Bengtsson. Thank you very much! - Added the missing S_ISSOCKET() macro to . Note that this diff --git a/library/include/sys/resource.h b/library/include/sys/resource.h index cf72c25..6042567 100644 --- a/library/include/sys/resource.h +++ b/library/include/sys/resource.h @@ -1,5 +1,5 @@ /* - * $Id: resource.h,v 1.1 2006-07-28 13:36:17 obarthel Exp $ + * $Id: resource.h,v 1.2 2006-07-28 14:02:32 obarthel Exp $ * * :ts=4 * @@ -49,6 +49,12 @@ /****************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/****************************************************************************/ + /* The following is not part of the ISO 'C' (1994) standard. */ /****************************************************************************/ @@ -84,4 +90,10 @@ extern int setrlimit(int resource,const struct rlimit *rlp); /****************************************************************************/ +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/****************************************************************************/ + #endif /* _SYS_RESOURCE_H */ diff --git a/library/include/sys/systeminfo.h b/library/include/sys/systeminfo.h new file mode 100644 index 0000000..b380100 --- /dev/null +++ b/library/include/sys/systeminfo.h @@ -0,0 +1,84 @@ +/* + * $Id: systeminfo.h,v 1.1 2006-07-28 14:02:32 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2006 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + * + ***************************************************************************** + * + * Documentation and source code for this library, and the most recent library + * build are available from . + * + ***************************************************************************** + */ + +#ifndef _SYS_SYSTEMINFO_H +#define _SYS_SYSTEMINFO_H + +/****************************************************************************/ + +/* The following is not part of the ISO 'C' (1994) standard. */ + +/****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/****************************************************************************/ + +/* Numbers are picked to be the same as for Solaris */ + +#define SI_SYSNAME 1 +#define SI_HOSTNAME 2 +#define SI_RELEASE 3 +#define SI_VERSION 4 +#define SI_MACHINE 5 +#define SI_ARCHITECTURE 6 +#define SI_HW_SERIAL 7 +#define SI_HW_PROVIDER 8 + +#define SI_SET_HOSTNAME 258 + +#define SI_PLATFORM 513 +#define SI_ISALIST 514 + +/****************************************************************************/ + +extern long sysinfo(int cmd,char *buf,long buflen); + +/****************************************************************************/ + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/****************************************************************************/ + +#endif /* _SYS_SYSTEMINFO_H */ diff --git a/library/include/sys/timeb.h b/library/include/sys/timeb.h index 4208b15..8e5d11d 100644 --- a/library/include/sys/timeb.h +++ b/library/include/sys/timeb.h @@ -1,5 +1,5 @@ /* - * $Id: timeb.h,v 1.2 2006-07-28 13:36:17 obarthel Exp $ + * $Id: timeb.h,v 1.3 2006-07-28 14:02:32 obarthel Exp $ * * :ts=4 * @@ -49,6 +49,12 @@ /****************************************************************************/ +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/****************************************************************************/ + /* The following is not part of the ISO 'C' (1994) standard. */ /****************************************************************************/ @@ -67,4 +73,10 @@ extern int ftime(struct timeb *); /****************************************************************************/ +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/****************************************************************************/ + #endif /* _SYS_TIMEB_H */ diff --git a/library/include/ulimit.h b/library/include/ulimit.h index bcebc8d..d0ed6ce 100644 --- a/library/include/ulimit.h +++ b/library/include/ulimit.h @@ -1,5 +1,5 @@ /* - * $Id: ulimit.h,v 1.1 2006-07-28 13:36:17 obarthel Exp $ + * $Id: ulimit.h,v 1.2 2006-07-28 14:02:32 obarthel Exp $ * * :ts=4 * @@ -43,6 +43,16 @@ /****************************************************************************/ +/* The following is not part of the ISO 'C' (1994) standard. */ + +/****************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/****************************************************************************/ + #define UL_GETFSIZE 1 #define UL_SETFSIZE 2 #define UL_GMEMLIM 3 @@ -54,4 +64,10 @@ extern long ulimit(int cmd,long newlimit); /****************************************************************************/ +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +/****************************************************************************/ + #endif /* _ULIMIT_H */ diff --git a/library/systeminfo_sysinfo.c b/library/systeminfo_sysinfo.c new file mode 100644 index 0000000..1030f9b --- /dev/null +++ b/library/systeminfo_sysinfo.c @@ -0,0 +1,209 @@ +/* + * $Id: systeminfo_sysinfo.c,v 1.1 2006-07-28 14:02:31 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2006 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include + +/****************************************************************************/ + +#if defined(SOCKET_SUPPORT) && !defined(_SOCKET_HEADERS_H) +#include "socket_headers.h" +#endif /* SOCKET_SUPPORT && !_SOCKET_HEADERS_H */ + +#ifndef _STDLIB_HEADERS_H +#include "stdlib_headers.h" +#endif /* _STDLIB_HEADERS_H */ + +/****************************************************************************/ + +#if !defined(__amigaos4__) +#include + +/* The order here is important. */ +static const struct { UWORD flags; char *name; } isanames[] = +{ + /* Apparently there is a 060 card sans FPU, but how to detect it without a LineF exception? + Perhaps I should see if I can find my old MC68060 manual. */ + {AFF_68060|AFF_68060, "68060+fpu060 "}, + {AFF_68060|AFF_68060, "68060+fpu "}, + {AFF_68040|AFF_FPU40, "68040+fpu040 "}, + {AFF_68040|AFF_68882, "68040+fpu "}, + {AFF_68040|AFF_68881, "68040+fpu "}, + {AFF_68040, "68040 "}, + {AFF_68030|AFF_68882, "68030+fpu "}, + {AFF_68030|AFF_68881, "68030+fpu "}, + {AFF_68020|AFF_68882, "68020+fpu "}, + {AFF_68020|AFF_68881, "68020+fpu "}, + {AFF_68030, "68030 "}, + {AFF_68020, "68020 "}, + {AFF_68010, "68010 "}, +}; +#endif /* !__amigaos4__ */ + +/****************************************************************************/ + +long +sysinfo(int cmd,char *buf,long buflen) +{ + struct utsname info; + long ret = -1; + + ENTER(); + + if(buf == NULL) + { + __set_errno(EFAULT); + goto out; + } + + uname(&info); /* Most of the keys use this. */ + + switch(cmd) + { + case SI_SYSNAME: + + ret = strlcpy(buf,info.sysname,buflen); + break; + + case SI_HOSTNAME: + + ret = strlcpy(buf,info.nodename,buflen); + break; + + case SI_SET_HOSTNAME: + + __set_errno(EPERM); + goto out; + + case SI_RELEASE: + + ret = strlcpy(buf,info.release,buflen); + break; + + case SI_VERSION: + + ret = strlcpy(buf,info.version,buflen); + break; + + case SI_MACHINE: + + ret = strlcpy(buf,"amiga",buflen); + break; + + case SI_ARCHITECTURE: + + ret = strlcpy(buf,info.machine,buflen); + break; + + case SI_ISALIST: + + #if defined(__amigaos4__) + { + /* Solaris uses "ppc" as the isa name, but gcc uses powerpc. "ppc+altivec" follows the + convention of specifying isa+ext from Solaris on SPARC machines. This way of implementing + SI_ISALIST seemed like a good idea at the time. */ + uint32 vecu; + + GetCPUInfoTags(GCIT_VectorUnit,&vecu,TAG_DONE); + + if(vecu == VECTORTYPE_ALTIVEC || vecu == VECTORTYPE_VMX) /* AltiVec and VMX are the same. */ + s = "ppc+altivec ppc common"; + else + s = "ppc common"; + + ret = strlcpy(buf,s,buflen); + } + #else + { + UWORD attention_flags = ((struct ExecBase *)SysBase)->AttnFlags; + char * last_added = ""; + size_t i; + + ret = 0; + + strlcpy(buf,"",buflen); + + for(i = 0 ; i < NUM_ENTRIES(isanames) ; i++) + { + if((attention_flags & isanames[i].flags) == isanames[i].flags) + { + if(strcmp(last_added,isanames[i].name) != SAME) + { + ret += strlcat(buf,isanames[i].name,buflen); + + last_added = isanames[i].name; + } + } + } + + ret += strlcat(buf,"68000",buflen); + } + #endif + + break; + + case SI_PLATFORM: /* TODO: Figure out a good way of checking this. */ + + ret = strlcpy(buf,"Amiga,Unknown",buflen); + break; + + case SI_HW_PROVIDER: /* TODO: Figure out a good way of checking this. */ + + ret = strlcpy(buf,"Unknown",buflen); + break; + + case SI_HW_SERIAL: + + #if defined(SOCKET_SUPPORT) + { + ret = snprintf(buf,buflen,"%u",gethostid()); + } + #else + { + ret = strlcpy(buf,"0",buflen); + } + #endif + + break; + + default: + + __set_errno(EINVAL); + goto out; + } + + out: + + RETURN(ret); + return(ret); +} diff --git a/library/ulimit_ulimit.c b/library/ulimit_ulimit.c new file mode 100644 index 0000000..6dd97ef --- /dev/null +++ b/library/ulimit_ulimit.c @@ -0,0 +1,90 @@ +/* + * $Id: ulimit_ulimit.c,v 1.1 2006-07-28 14:02:31 obarthel Exp $ + * + * :ts=4 + * + * Portable ISO 'C' (1994) runtime library for the Amiga computer + * Copyright (c) 2002-2006 by Olaf Barthel + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Neither the name of Olaf Barthel nor the names of contributors + * may be used to endorse or promote products derived from this + * software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include + +/****************************************************************************/ + +#ifndef _STDLIB_HEADERS_H +#include "stdlib_headers.h" +#endif /* _STDLIB_HEADERS_H */ + +/****************************************************************************/ + +long +ulimit(int cmd,long newlim) +{ + long ret = -1; + + switch(cmd) + { + case UL_GETFSIZE: + + /* Maximum number of 512-byte blocks in a file. Largefile aware programs should not use ulimit() anyway. */ + ret = (0x7fffffffL >> 9) - 1L; /* Max Filesize/512 - 1 */ + break; + + case UL_GMEMLIM: /* Which flags are appropriate for AvailMem()? */ + + #if defined(__amigaos4__) + { + ret = AvailMem(MEMF_TOTAL|MEMF_VIRTUAL); + } + #else + { + ret = AvailMem(MEMF_ANY|MEMF_LARGEST); /* Too conservative? */ + } + #endif + + break; + + case UL_GDESLIM: /* No limit, so we just return a reasonably large value. */ + + ret = 1024; + break; + + case UL_SETFSIZE: /* Not supported */ + + __set_errno(EPERM); + goto out; + + default: + + __set_errno(EINVAL); + goto out; + } + + out: + + return(ret); +}