123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- Unit sysctl;
- {
- This file is part of the Free Pascal run time library.
- (c) 2002 by Marco van de Voort
- member of the Free Pascal development team.
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- sysctl.h header conversion, taken from FreeBSD 4.6, mainly as base
- to implement UNAME on.
- This program 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.
- }
- Interface
- uses
- unixtype;
- {$ifndef FPC_USE_LIBC}
- {$define FPC_USE_SYSCALL}
- {$endif}
- {$Packrecords C}
- {
- * Copyright (c) 1989, 1993
- * The Regents of the University of California. All rights reserved.
- *
- * This code is derived from software contributed to Berkeley by
- * Mike Karels at Berkeley Software Design, Inc.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
- * may be used to endorse or promote products derived from this software
- * without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE REGENTS 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 REGENTS 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.
- *
- * @(#)sysctl.h 8.1 (Berkeley) 6/2/93
- * $FreeBSD: src/sys/sys/sysctl.h,v 1.81.2.8 2002/03/17 11:08:38 alfred Exp $
- }
- TYPE CtlNameRec = Record
- Name: ansistring; {String[LongestStringInCtlNames]}
- CtlType:cint;
- end;
- {$I sysctlh.inc}
- // sysctl only one that is tested. user_definable part of the sysctl
- // function is not implemented
- //
- {$ifdef FPC_USE_LIBC}
- function FPsysctl (Name: pchar; namelen:cuint; oldp:pointer;oldlenp:psize_t; newp:pointer;newlen:size_t):cint; cdecl; external name 'sysctl';
- function FPsysctlbyname (Name: pchar; oldp:pointer;oldlenp:psize_t; newp:pointer;newlen:size_t):cint; cdecl; external name 'sysctlbyname';
- function FPsysctlnametomib (Name: pchar;mibp:pcint;sizep:psize_t):cint; cdecl; external name 'sysctltomib';
- {$else}
- function FPsysctl (Name: pchar; namelen:cuint; oldp:pointer;oldlenp:psize_t; newp:pointer;newlen:size_t):cint;
- function FPsysctlbyname (Name: pchar; oldp:pointer;oldlenp:psize_t; newp:pointer;newlen:size_t):cint;
- function FPsysctlnametomib (Name: pchar; mibp:pcint;sizep:psize_t):cint;
- {$endif}
- Implementation
- {$ifndef FPC_USE_LIBC}
- Uses Syscall;
- {$ENDIF}
- {$ifndef FPC_USE_LIBC}
- {$ifdef FreeBSD}
- CONST syscall_nr___sysctl = 202;
- {$endif}
- function FPsysctl (Name: pchar; namelen:cuint; oldp:pointer;oldlenp:psize_t; newp:pointer;newlen:size_t):cint;
- Begin
- if (name[0] <> chr(CTL_USER)) Then
- exit(do_syscall(syscall_nr___sysctl,longint(name), namelen, longint(oldp), longint(oldlenp), longint(newp), longint(newlen)))
- else
- Exit(0);
- End;
- function FPsysctlbyname (Name: pchar; oldp:pointer;oldlenp:psize_t; newp:pointer;newlen:size_t):cint;
- Var
- name2oid_oid : array[0..1] of cint;
- real_oid : array[0..CTL_MAXNAME+1] of cint;
- error : cint;
- oidlen : size_t;
- Begin
- name2oid_oid[0] := 0; {This is magic & undocumented! }
- name2oid_oid[1] := 3;
- oidlen := sizeof(real_oid);
- error := FPsysctl(@name2oid_oid, 2, @real_oid, @oidlen, name,
- strlen(name));
- if (error < 0) Then
- Exit(error);
- oidlen := Oidlen DIV sizeof (cint);
- error := FPsysctl(@real_oid, oidlen, oldp, oldlenp, newp, newlen);
- exit(error);
- End;
- function FPsysctlnametomib (Name: pchar; mibp:pcint;sizep:psize_t):cint;
- Var oid : array[0..1] OF cint;
- error : cint;
- Begin
- oid[0] := 0;
- oid[1] := 3;
- sizep^:=sizep^*sizeof(cint);
- error := FPsysctl(@oid, 2, mibp, sizep, name, strlen(name));
- sizep^ := sizep^ div sizeof (cint);
- if (error < 0) Then
- Exit (error);
- FPsysctlnametomib:=0;
- End;
- {$endif}
- end.
|