* grp+pwd: freebsd+darwin compat. Attempt at fixing demoes unsuccesful.

git-svn-id: trunk@10163 -
This commit is contained in:
marco 2008-02-02 19:26:40 +00:00
parent 28ebe338c4
commit 70ebb49af5
9 changed files with 397 additions and 246 deletions

2
.gitattributes vendored
View File

@ -4266,8 +4266,10 @@ packages/unzip/src/ziptypes.pp svneol=native#text/plain
packages/users/Makefile svneol=native#text/plain
packages/users/Makefile.fpc svneol=native#text/plain
packages/users/examples/testpass.pp svneol=native#text/plain
packages/users/examples/testpass2.pp svneol=native#text/plain
packages/users/examples/testuser.pp svneol=native#text/plain
packages/users/fpmake.pp svneol=native#text/plain
packages/users/src/crypth.pp svneol=native#text/plain
packages/users/src/grp.pp svneol=native#text/plain
packages/users/src/pwd.pp svneol=native#text/plain
packages/users/src/shadow.pp svneol=native#text/plain

View File

@ -1,5 +1,5 @@
#
# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/01/26]
# Don't edit, this file is generated by FPCMake Version 2.0.0 [2008/02/02]
#
default: all
MAKEFILETARGETS=i386-linux i386-go32v2 i386-win32 i386-os2 i386-freebsd i386-beos i386-netbsd i386-solaris i386-qnx i386-netware i386-openbsd i386-wdosx i386-darwin i386-emx i386-watcom i386-netwlibc i386-wince i386-embedded i386-symbian m68k-linux m68k-freebsd m68k-netbsd m68k-amiga m68k-atari m68k-openbsd m68k-palmos m68k-embedded powerpc-linux powerpc-netbsd powerpc-amiga powerpc-macos powerpc-darwin powerpc-morphos powerpc-embedded sparc-linux sparc-netbsd sparc-solaris sparc-embedded x86_64-linux x86_64-freebsd x86_64-darwin x86_64-win64 x86_64-embedded arm-linux arm-palmos arm-wince arm-gba arm-nds arm-embedded arm-symbian powerpc64-linux powerpc64-darwin powerpc64-embedded
@ -243,322 +243,322 @@ PACKAGESDIR:=$(wildcard $(FPCDIR) $(FPCDIR)/packages $(FPCDIR)/packages/base $(F
override PACKAGE_NAME=users
override PACKAGE_VERSION=2.0.0
ifeq ($(FULL_TARGET),i386-linux)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users shadow crypth
endif
ifeq ($(FULL_TARGET),i386-go32v2)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-win32)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-os2)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-freebsd)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-beos)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-netbsd)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-solaris)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-qnx)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-netware)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-openbsd)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-wdosx)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-darwin)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-emx)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-watcom)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-netwlibc)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-wince)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-embedded)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-symbian)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),m68k-linux)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users shadow crypth
endif
ifeq ($(FULL_TARGET),m68k-freebsd)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),m68k-netbsd)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),m68k-amiga)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),m68k-atari)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),m68k-openbsd)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),m68k-palmos)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),m68k-embedded)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),powerpc-linux)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users shadow crypth
endif
ifeq ($(FULL_TARGET),powerpc-netbsd)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),powerpc-amiga)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),powerpc-macos)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),powerpc-darwin)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),powerpc-morphos)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),powerpc-embedded)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),sparc-linux)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users shadow crypth
endif
ifeq ($(FULL_TARGET),sparc-netbsd)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),sparc-solaris)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),sparc-embedded)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),x86_64-linux)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users shadow crypth
endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),x86_64-darwin)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),x86_64-win64)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),x86_64-embedded)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),arm-linux)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users shadow crypth
endif
ifeq ($(FULL_TARGET),arm-palmos)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),arm-wince)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),arm-gba)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),arm-nds)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),arm-embedded)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),arm-symbian)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),powerpc64-linux)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users shadow crypth
endif
ifeq ($(FULL_TARGET),powerpc64-darwin)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),powerpc64-embedded)
override TARGET_UNITS+=grp pwd shadow users
override TARGET_UNITS+=grp pwd users
endif
ifeq ($(FULL_TARGET),i386-linux)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2 testpass
endif
ifeq ($(FULL_TARGET),i386-go32v2)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-win32)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-os2)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-freebsd)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-beos)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-netbsd)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-solaris)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-qnx)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-netware)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-openbsd)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-wdosx)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-darwin)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-emx)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-watcom)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-netwlibc)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-wince)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-embedded)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),i386-symbian)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),m68k-linux)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2 testpass
endif
ifeq ($(FULL_TARGET),m68k-freebsd)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),m68k-netbsd)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),m68k-amiga)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),m68k-atari)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),m68k-openbsd)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),m68k-palmos)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),m68k-embedded)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),powerpc-linux)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2 testpass
endif
ifeq ($(FULL_TARGET),powerpc-netbsd)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),powerpc-amiga)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),powerpc-macos)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),powerpc-darwin)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),powerpc-morphos)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),powerpc-embedded)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),sparc-linux)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2 testpass
endif
ifeq ($(FULL_TARGET),sparc-netbsd)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),sparc-solaris)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),sparc-embedded)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),x86_64-linux)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2 testpass
endif
ifeq ($(FULL_TARGET),x86_64-freebsd)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),x86_64-darwin)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),x86_64-win64)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),x86_64-embedded)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),arm-linux)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2 testpass
endif
ifeq ($(FULL_TARGET),arm-palmos)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),arm-wince)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),arm-gba)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),arm-nds)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),arm-embedded)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),arm-symbian)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),powerpc64-linux)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2 testpass
endif
ifeq ($(FULL_TARGET),powerpc64-darwin)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
ifeq ($(FULL_TARGET),powerpc64-embedded)
override TARGET_EXAMPLES+=testuser testpass
override TARGET_EXAMPLES+=testuser testpass2
endif
override INSTALL_FPCPACKAGE=y
ifeq ($(FULL_TARGET),i386-linux)

View File

@ -7,8 +7,10 @@ name=users
version=2.0.0
[target]
units=grp pwd shadow users
examples=testuser testpass
units=grp pwd users
units_linux=shadow crypth
examples=testuser testpass2
examples_linux=testpass
[require]
libc=y

View File

@ -1,9 +1,10 @@
Program TestPass;
{$mode delphi}
{Test the user's password}
{$DEFINE DEBUG}
uses shadow, pwd, strings, {crypt_h,} cmem;
// The funcs in shadow are linux only.
uses {$ifdef linux}shadow, {$endif} pwd ,crypth ;
Var
strUserName, Password : String;
@ -30,7 +31,7 @@ Begin
{$IFDEF DEBUG}
Writeln('No shadow entry');
{$ENDIF}
pEntry := getpwnam(A);
pEntry := fpgetpwnam(A);
If pEntry = nil then
Begin
{$IFDEF DEBUG}
@ -78,7 +79,7 @@ Begin
Writeln('Salt is : ',PCSalt);
{$ENDIF}
PCResult := crypt(PCPass, PCSalt);
ResultPass := StrPas(PCResult);
ResultPass := PCResult;
{$IFDEF DEBUG}
Writeln('From passwd/shadow : ',EncPass);
Writeln('From crypt : ',ResultPass);

View File

@ -0,0 +1,56 @@
Program TestPass2;
Uses pwd,grp,baseunix;
Procedure printpchar(fieldname:String;p:pchar);
Begin
If assigned(p) Then
Begin
write(fieldname);
write(':',' ':15-length(fieldname));
writeln(p);
End;
End;
Var p : PPasswd;
supplementary_gids : array[0..99] Of gid_t;
i,nrgids: cint;
pgrp: PGroup;
Begin
p := fpgetpwnam('marcov');
If assigned(p) Then
Begin
printpchar('pw_name',p^.pw_name);
printpchar('pw_passwd',p^.pw_passwd);
writeln('pw_uid:',' ':9,p^.pw_uid);
writeln('pw_gid:',' ':9,p^.pw_gid);
{$ifdef BSD}
printpchar('pw_change',p^.pw_change);
printpchar('pw_class',p^.pw_class);
{$endif}
printpchar('pw_gecos',p^.pw_gecos);
printpchar('pw_dir',p^.pw_dir);
printpchar('pw_shell',p^.pw_shell);
{$ifdef BSD}
printpchar('pw_expire',p^.pw_expire);
printpchar('pw_fields',p^.pw_fields);
{$endif}
End;
nrgids := 100;
If fpgetgrouplist(p^.pw_name,p^.pw_gid,@supplementary_gids,@nrgids)<>-1 Then
Begin
Write ('Supplementary groups:');
For i:=0 To nrgids-1 Do
Begin
pgrp := fpgetgrgid(supplementary_gids[i]);
If assigned(pgrp) Then
write(pgrp^.gr_name,' (',supplementary_gids[i],') ')
Else
write(' ???? (',supplementary_gids[i],') ')
End;
writeln;
End;
writeln;
End.

View File

@ -0,0 +1,14 @@
unit crypth;
interface
uses BaseUnix,initc;
{$ifdef Linux}{$linklib crypt}{$endif}
Const libname ={$ifdef Linux}'crypt'{$else}clib{$endif};
function crypt(key,salt:pchar):pchar;cdecl; external libname name 'crypt';
implementation
end.

View File

@ -1,64 +1,59 @@
unit grp;
interface
{
Automatically converted by H2Pas 0.99.15 from grp.h
The following command line parameters were used:
-D
-l
c
-p
-s
-u
grp
-v
grp.h
}
const
External_library='c'; {Setup as you need}
{ Pointers to basic pascal types, inserted by h2pas conversion program.}
Type
PLongint = ^Longint;
PSmallInt = ^SmallInt;
PByte = ^Byte;
PWord = ^Word;
PDWord = ^DWord;
PDouble = ^Double;
uses
initc,baseunix,ctypes;
{$IFDEF FPC}
{$PACKRECORDS C}
{$ENDIF}
const
External_library= clib; {Setup as you need}
_PATH_GROUP = '/etc/group';
Type
PGroup = ^TGroup;
PPGroup = ^PGroup;
TGroup = record
gr_name : pchar; { group name }
gr_passwd : pchar; { group password }
gr_gid : gid_t; { group id }
gr_mem : ppchar; { group members }
end;
type
PFILE = Pointer;
__gid_t = Longint;
P__gid_t = ^__gid_t;
size_t = longint;
procedure fpendgrent; cdecl;external External_library name 'endgrent';
function fpgetgrent:pgroup; cdecl;external External_library name 'getgrent';
function fpgetgrgid (id:gid_t):pgroup; cdecl;external External_library name 'getgrgid';
function fpgetgrnam (name:pchar):pgroup; cdecl;external External_library name 'getgrnam';
{$ifdef BSD}
function fpgroup_from_gid (gid:gid_t; nogrup:cint):pchar; cdecl;external External_library name 'group_from_gid';
{$endif}
PGroup = ^group;
group = record
gr_name : Pchar;
gr_passwd : Pchar;
gr_gid : __gid_t;
gr_mem : ^Pchar;
end;
TGroup = Group;
PPGROUP = ^PGroup;
function fpsetgrent:cint;cdecl;external External_library name 'setgrent';
procedure setgrent;cdecl;external External_library name 'setgrent';
procedure endgrent;cdecl;external External_library name 'endgrent';
function getgrent:Pgroup;cdecl;external External_library name 'getgrent';
function fgetgrent(__stream:PFILE):Pgroup;cdecl;external External_library name 'fgetgrent';
function getgrgid(__gid:__gid_t):Pgroup;cdecl;external External_library name 'getgrgid';
function getgrnam(__name:Pchar):Pgroup;cdecl;external External_library name 'getgrnam';
function getgrgid_r(__gid:__gid_t; __resultbuf:Pgroup; __buffer:Pchar; __buflen:size_t; __result:PPgroup):longint;cdecl;external External_library name 'getgrgid_r';
function getgrnam_r(__name:Pchar; __resultbuf:Pgroup; __buffer:Pchar; __buflen:size_t; __result:PPgroup):longint;cdecl;external External_library name 'getgrnam_r';
function fgetgrent_r(__stream:PFILE; __resultbuf:Pgroup; __buffer:Pchar; __buflen:size_t; __result:PPgroup):longint;cdecl;external External_library name 'fgetgrent_r';
function setgroups(__n:size_t; __groups:P__gid_t):longint;cdecl;external External_library name 'setgroups';
function getgrouplist(__user:Pchar; __group:__gid_t; __groups:P__gid_t; __ngroups:Plongint):longint;cdecl;external External_library name 'getgrouplist';
function initgroups(__user:Pchar; __group:__gid_t):longint;cdecl;external External_library name 'initgroups';
function fpgetgrgid_r (id:gid_t; grp:Pgroup; buffer:pchar; buffersize:size_t; grresult:PPgroup):cint;cdecl;external External_library name 'getgrgid_r';
function fpgetgrnam_r (nam:pchar; grp:Pgroup; buffer:pchar; buffersize:size_t; grresult:PPgroup):cint;cdecl;external External_library name 'getgrnam_r';
{$ifndef Darwin}
function fpgetgrent_r (grp:Pgroup; buffer:pchar; buffersize:size_t; grresult:PPgroup):cint;cdecl;external External_library name 'getgrent_r';
{$endif}
function fpsetgroupent (stayopen:cint):cint;cdecl;external External_library name 'setgroupent';
{$ifdef Darwin}
procedure fpsetgrfile(name:pchar); cdecl; external external_library name 'setgrfile';
{$endif}
// FreeBSD has these, Linux too if USE_BSD is defined. Darwin too.
// Darwin uses ints instead of gid's though, except for setgroups.
function fpsetgroups(n:size_t;groups:pgid):cint; cdecl; external External_Library name 'setgroups';
function fpgetgrouplist(user:pchar;group:tgid;groups:pgid;ngroups:pcint):cint; cdecl; external External_Library name 'getgrouplist';
function fpinitgroups(user:pchar;group:tgid):cint;cdecl; external External_Library name 'initgroups';
implementation

View File

@ -1,64 +1,139 @@
unit pwd;
interface
{
Automatically converted by H2Pas 0.99.15 from pwd.H
The following command line parameters were used:
-D
-l
c
-p
-s
-u
pwd
-v
pwd.H
}
uses
initc,baseunix,ctypes;
{$IFDEF FPC}
{$PACKRECORDS C}
{$ENDIF}
const
External_library='c'; {Setup as you need}
External_library= clib; {Setup as you need}
{ Pointers to basic pascal types, inserted by h2pas conversion program.}
Type
PLongint = ^Longint;
PSmallInt = ^SmallInt;
PByte = ^Byte;
PWord = ^Word;
PDWord = ^DWord;
PDouble = ^Double;
const
_PATH_PWD = '/etc';
_PATH_PASSWD = '/etc/passwd';
_PASSWD = 'passwd';
_PATH_MASTERPASSWD = '/etc/master.passwd';
{$ifdef Darwin}
_PATH_MASTERPASSWD_LOCK = '/etc/ptmp';
{$endif}
_MASTERPASSWD = 'master.passwd';
{$PACKRECORDS C}
_PATH_MP_DB = '/etc/pwd.db';
_MP_DB = 'pwd.db';
_PATH_SMP_DB = '/etc/spwd.db';
_SMP_DB = 'spwd.db';
_PATH_PWD_MKDB = '/usr/sbin/pwd_mkdb';
{$ifdef BSD}
_PW_VERSION_MASK = #$F0;
function _PW_VERSIONED(x,v : longint) : cuchar; inline;
const
_PW_KEYBYNAME = #$31; { stored by name }
_PW_KEYBYNUM = #$32; { stored by entry in the "file"}
_PW_KEYBYUID = #$33; { stored by uid }
{$ifdef FreeBSD}
_PW_KEYYPENABLED = #$34; { YP is enabled }
_PW_KEYYPBYNUM = #$35; { special +@netgroup entries }
{$endif}
{ The database also contains a key to indicate the format version of
* the entries therein. There may be other, older versioned entries
* as well. }
const
{$ifdef FreeBSD}
_PWD_VERSION_KEY = #$FF+'VERSION';
_PWD_CURRENT_VERSION = #$4;
{$endif}
_PASSWORD_EFMT1 = '_'; { extended encryption format }
_PASSWORD_LEN = 128; { max length, not counting NULL }
{$ifdef Darwin}
_PASSWORD_NOUID = $01; (* flag for no specified uid. *)
_PASSWORD_NOGID = $02; (* flag for no specified gid. *)
_PASSWORD_NOCHG = $04; (* flag for no specified change. *)
_PASSWORD_NOEXP =$08; (* flag for no specified expire. *)
_PASSWORD_WARNDAYS = 14; (* days to warn about expiry *)
_PASSWORD_CHGNOW = -1; (* special day to force password
* change at next login *)
{$endif}
{$endif}
type
PFile = Pointer;
__uid_t = longint;
__gid_t = longint;
{ Darwin uses __darwin_time_t, but that is an alias for time_t }
PPasswd = ^TPasswd;
PPPasswd = ^PPasswd;
Passwd = record
pw_name : pchar; { user name }
pw_passwd : pchar; { encrypted password }
pw_uid : Tuid; { user uid }
pw_gid : Tgid; { user gid }
{$ifdef bsd}
pw_change : Ttime platform; { password change time }
pw_class : pchar platform; { user access class }
{$endif}
pw_gecos : pchar; { Honeywell login info }
pw_dir : pchar; { home directory }
pw_shell : pchar; { default shell }
{$ifdef bsd}
pw_expire : Ttime platform; { account expiration }
{$ifdef FreeBSD}
pw_fields : cint platform; { internal: fields filled in }
{$endif}
{$endif}
end;
TPasswd = Passwd;
Ppasswd = ^passwd;
passwd = record
pw_name : Pchar;
pw_passwd : Pchar;
pw_uid : __uid_t;
pw_gid : __gid_t;
pw_gecos : Pchar;
pw_dir : Pchar;
pw_shell : Pchar;
end;
TPasswordRecord = passwd;
PPasswordRecord = ^TPasswordRecord;
procedure setpwent;cdecl; external External_library name 'setpwent';
procedure endpwent;cdecl; external External_library name 'endpwent';
function getpwent:Ppasswd;cdecl;external External_library name 'getpwent';
function fgetpwent(__stream:PFILE):Ppasswd;cdecl;external External_library name 'fgetpwent';
function putpwent(__p:Ppasswd; __f:PFILE):longint;cdecl;external External_library name 'putpwent';
function getpwuid(__uid:__uid_t):Ppasswd;cdecl;external External_library name 'getpwuid';
function getpwnam(__name:Pchar):Ppasswd;cdecl;external External_library name 'getpwnam';
function getpw(__uid:__uid_t; __buffer:Pchar):longint;cdecl;external External_library name 'getpw';
{$ifdef FreeBSD}
const
_PWF_NAME = 1;
_PWF_PASSWD = 2;
_PWF_UID = 4;
_PWF_GID = 8;
_PWF_CHANGE = $10;
_PWF_CLASS = $20;
_PWF_GECOS = $40;
_PWF_DIR = $80;
_PWF_SHELL = $100;
_PWF_EXPIRE = $200;
_PWF_SOURCE = $3000;
_PWF_FILES = $1000;
_PWF_NIS = $2000;
_PWF_HESIOD = $3000;
{$endif}
function fpgetpwnam (name:pchar):PPasswd; cdecl;external External_library name 'getpwnam';
function fpgetpwuid (id:tuid):PPasswd;cdecl;external External_library name 'getpwuid';
procedure fpendpwent;cdecl;external External_library name 'endpwent';
function fpgetpwent:ppasswd;cdecl;external External_library name 'getpwent';
procedure fpsetpwent;cdecl;external External_library name 'setpwent';
function fpgetpwnam_r (namepara1:pchar; pwd:Ppasswd; buffer:pchar; bufsize:size_t; pwresult:PPpasswd):cint;cdecl;external External_library name 'getpwnam_r';
function fpgetpwuid_r (uid:uid_t; pwd:Ppasswd; buffer:pchar; buffersize:size_t; pwresult:PPpasswd):cint;cdecl;external External_library name 'getpwuid_r';
{$ifndef Darwin}
function fpgetpwent_r (pwd:Ppasswd; buffer:pchar; buffersize:size_t; pwresult:PPpasswd):cint;cdecl;external External_library name 'getpwent_r';
{$endif}
implementation
{$ifdef BSD}
function _PW_VERSIONED (x,v : longint) : cuchar; inline;
begin
_PW_VERSIONED:= (x and $CF) or (v shl 4);
end;
{$endif}
end.

View File

@ -2,21 +2,23 @@ unit users;
Interface
{$mode delphi}
uses baseunix,pwd,shadow,grp,SysUtils,Classes;
uses BaseUnix,pwd,grp, {$ifdef Linux} shadow{$endif},SysUtils,Classes;
Type
EUserLookupError = Class(Exception);
EGroupLookupError = Class(Exception);
EShadowLookupError = Class(Exception);
TPasswordRecord = Tpasswd;
PPasswordRecord = ^TPasswordRecord;
{ User functions }
Function getpwnam(Const UserName: String) : PPasswordRecord;
Procedure GetUserData(Const UserName : String; Var Data : TPasswordRecord); overload;
Procedure GetUserData(Uid : Integer; Var Data : TPasswordRecord); overload;
function GetUserName(UID : Integer) : String;
function GetUserId(Const UserName : String) : Integer;
function GetUserGid(Const UserName : String) : Integer;
Procedure GetUserData(Uid : TUID; Var Data : TPasswordRecord); overload;
function GetUserName(UID : TUID) : String;
function GetUserId(Const UserName : String) : TUID;
function GetUserGid(Const UserName : String) : TGID;
function GetUserDir(Const UserName : String): String;
function GetUserDescription(Const UserName : String): String;
Procedure GetUserList(List : Tstrings);overload;
@ -26,20 +28,23 @@ Procedure GetUserList(List : TStrings; WithIDs : Boolean);overload;
Function getgrnam(Const GroupName: String) : PGroup;
Procedure GetGroupData(Const GroupName : String; Var Data : TGroup); overload;
Procedure GetGroupData(Gid : Integer; Var Data : TGroup); overload;
function GetGroupName(GID : Integer) : String;
function GetGroupId(Const GroupName : String) : Integer;
Procedure GetGroupData(Gid : TGID; Var Data : TGroup); overload;
function GetGroupName(GID : TGID) : String;
function GetGroupId(Const GroupName : String) : TGID;
Procedure GetGroupList(List : Tstrings);overload;
Procedure GetGroupList(List : TStrings; WithIDs : Boolean);overload;
Procedure GetGroupMembers(GID : Integer;List : TStrings);overload;
Procedure GetGroupMembers(GID : TGID;List : TStrings);overload;
Procedure GetGroupMembers(Const GroupName : String;List : TStrings);overload;
{ Shadow password functions }
{$ifdef Linux}
function getspnam(UserName : String): PPasswordFileEntry;
function sgetspent(Line : String): PPasswordFileEntry;
Procedure GetUserShadowData(Const UserName : String; Var Data : TPasswordFileEntry);overload;
Procedure GetUserShadowData(UID : Integer; Var Data : TPasswordFileEntry);overload;
Procedure GetUserShadowData(UID : TUID; Var Data : TPasswordFileEntry);overload;
{$endif}
{ Extra functions }
@ -59,7 +64,7 @@ EShadowNotPermitted = 'Not enough permissions to access shadow password file';
Function getpwnam(Const UserName: String) : PPasswordRecord;
begin
Result:=pwd.getpwnam(Pchar(UserName));
Result:=pwd.fpgetpwnam(Pchar(UserName));
end;
Procedure GetUserData(Const UserName : String; Var Data : TPasswordRecord);
@ -67,36 +72,36 @@ Procedure GetUserData(Const UserName : String; Var Data : TPasswordRecord);
Var P : PPasswordRecord;
begin
P:=Getpwnam(UserName);
P:=fpGetpwnam(pchar(UserName));
If P<>Nil then
Data:=P^
else
Raise EUserLookupError.CreateFmt(ENoSuchUserName,[UserName]);
end;
Procedure GetUserData(Uid : Integer; Var Data : TPasswordRecord);
Procedure GetUserData(Uid : tuid; Var Data : TPasswordRecord);
Var P : PPasswordRecord;
begin
P:=Getpwuid(Uid);
P:=fpGetpwuid(Uid);
If P<>Nil then
Data:=P^
else
Raise EUserLookupError.CreateFmt(ENoSuchUserID,[Uid]);
end;
function GetUserName(UID : Integer) : String;
function GetUserName(UID : TUID) : String;
Var
UserData : TPasswordRecord;
begin
GetuserData(UID,UserData);
Result:=strpas(UserData.pw_Name);
Result:=UserData.pw_Name;
end;
function GetUserId(Const UserName : String) : Integer;
function GetUserId(Const UserName : String) : TUID;
Var
UserData : TPasswordRecord;
@ -106,7 +111,7 @@ begin
Result:=UserData.pw_uid;
end;
function GetUserGId(Const UserName : String) : Integer;
function GetUserGId(Const UserName : String) : TGID;
Var
UserData : TPasswordRecord;
@ -123,7 +128,7 @@ Var
begin
GetUserData(UserName,UserData);
Result:=strpas(UserData.pw_dir);
Result:=UserData.pw_dir;
end;
function GetUserDescription(Const UserName : String): String;
@ -149,10 +154,10 @@ Var
begin
List.Clear;
setpwent;
fpsetpwent;
try
Repeat
P:=getpwent;
P:=fpgetpwent;
If P<>Nil then
begin
If WithIDs then
@ -162,7 +167,7 @@ begin
end;
until (P=Nil);
finally
endpwent;
fpendpwent;
end;
end;
@ -174,7 +179,7 @@ end;
Function getgrnam(Const GroupName: String) : PGroup;
begin
Result:=grp.getgrnam(Pchar(GroupName));
Result:=grp.fpgetgrnam(Pchar(GroupName));
end;
Procedure GetGroupData(Const GroupName : String; Var Data : TGroup); overload;
@ -182,36 +187,36 @@ Procedure GetGroupData(Const GroupName : String; Var Data : TGroup); overload;
Var P : PGroup;
begin
P:=Getgrnam(GroupName);
P:=fpGetgrnam(pchar(GroupName));
If P<>Nil then
Data:=P^
else
Raise EGroupLookupError.CreateFmt(ENoSuchGroupName,[GroupName]);
end;
Procedure GetGroupData(Gid : Integer; Var Data : TGroup); overload;
Procedure GetGroupData(Gid : TGID; Var Data : TGroup); overload;
Var P : PGroup;
begin
P:=Getgrgid(gid);
P:=fpGetgrgid(gid);
If P<>Nil then
Data:=P^
else
Raise EGroupLookupError.CreateFmt(ENoSuchGroupID,[Gid]);
end;
function GetGroupName(GID : Integer) : String;
function GetGroupName(GID : TGID) : String;
Var
G : TGroup;
begin
GetGroupData(Gid,G);
Result:=StrPas(G.gr_name);
Result:=G.gr_name;
end;
function GetGroupId(Const GroupName : String) : Integer;
function GetGroupId(Const GroupName : String) : TGID;
Var
G : TGroup;
@ -234,10 +239,10 @@ Var
begin
List.Clear;
setgrent;
fpsetgrent;
try
Repeat
G:=getgrent;
G:=fpgetgrent;
If G<>Nil then
begin
If WithIDs then
@ -247,7 +252,7 @@ begin
end;
until (G=Nil);
finally
endgrent;
fpendgrent;
end;
end;
@ -264,7 +269,7 @@ begin
end;
Procedure GetGroupMembers(GID : Integer;List : TStrings);
Procedure GetGroupMembers(GID : TGID;List : TStrings);
Var
G : TGroup;
@ -285,7 +290,7 @@ begin
end;
{ Shadow password functions }
{$ifdef linux}
function getspnam(UserName : String): PPasswordFileEntry;
begin
@ -314,12 +319,13 @@ begin
Data:=P^;
end;
Procedure GetUserShadowData(UID : Integer; Var Data : TPasswordFileEntry);
Procedure GetUserShadowData(UID : TUID; Var Data : TPasswordFileEntry);
begin
GetUserShadowData(GetUserName(UID),Data);
end;
{$endif}
{ Extra functions }
Function GetUserGroup(Const UserName : String) : String;