unit pwd; interface uses initc,unixtype,baseunix,ctypes; {$IFDEF FPC} {$PACKRECORDS C} {$ENDIF} const External_library= clib; {Setup as you need} 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'; _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 { 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; {$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.