Преглед на файлове

* Unix RTL generic parts. Linux working, *BSD will follow shortly

marco преди 22 години
родител
ревизия
3e33642794
променени са 5 файла, в които са добавени 381 реда и са изтрити 243 реда
  1. 182 179
      rtl/unix/errno.inc
  2. 126 0
      rtl/unix/genfuncs.inc
  3. 23 20
      rtl/unix/gensigset.inc
  4. 30 27
      rtl/unix/linux.pp
  5. 20 17
      rtl/unix/unix.pp

+ 182 - 179
rtl/unix/errno.inc

@@ -19,205 +19,208 @@
 }
 Const
 
-Sys_EPERM       = 1;    { Operation not permitted }
-Sys_ENOENT      = 2;    { No such file or directory }
-Sys_ESRCH       = 3;    { No such process }
-Sys_EINTR       = 4;    { Interrupted system call }
-Sys_EIO = 5;    { I/O error }
-Sys_ENXIO       = 6;    { No such device or address }
-Sys_E2BIG       = 7;    { Arg list too long }
-Sys_ENOEXEC     = 8;    { Exec format error }
-Sys_EBADF       = 9;    { Bad file number }
-Sys_ECHILD      = 10;   { No child processes }
+ESysEPERM       = 1;    { Operation not permitted }
+ESysENOENT      = 2;    { No such file or directory }
+ESysESRCH       = 3;    { No such process }
+ESysEINTR       = 4;    { Interrupted system call }
+ESysEIO = 5;    { I/O error }
+ESysENXIO       = 6;    { No such device or address }
+ESysE2BIG       = 7;    { Arg list too long }
+ESysENOEXEC     = 8;    { Exec format error }
+ESysEBADF       = 9;    { Bad file number }
+ESysECHILD      = 10;   { No child processes }
 {$ifdef FreeBSD}
-Sys_EDEADLK     = 11;   { Deadlock avoided}
+ESysEDEADLK     = 11;   { Deadlock avoided}
 {$else}
-Sys_EAGAIN      = 11;   { Try again }
+ESysEAGAIN      = 11;   { Try again }
 {$endif}
-Sys_ENOMEM      = 12;   { Out of memory }
-Sys_EACCES      = 13;   { Permission denied }
-Sys_EFAULT      = 14;   { Bad address }
-Sys_ENOTBLK     = 15;   { Block device required, NOT POSIX! }
-Sys_EBUSY       = 16;   { Device or resource busy }
-Sys_EEXIST      = 17;   { File exists }
-Sys_EXDEV       = 18;   { Cross-device link }
-Sys_ENODEV      = 19;   { No such device }
-Sys_ENOTDIR     = 20;   { Not a directory }
-Sys_EISDIR      = 21;   { Is a directory }
-Sys_EINVAL      = 22;   { Invalid argument }
-Sys_ENFILE      = 23;   { File table overflow }
-Sys_EMFILE      = 24;   { Too many open files }
-Sys_ENOTTY      = 25;   { Not a typewriter }
-Sys_ETXTBSY     = 26;   { Text file busy }
-Sys_EFBIG       = 27;   { File too large }
-Sys_ENOSPC      = 28;   { No space left on device }
-Sys_ESPIPE      = 29;   { Illegal seek }
-Sys_EROFS       = 30;   { Read-only file system }
-Sys_EMLINK      = 31;   { Too many links }
-Sys_EPIPE       = 32;   { Broken pipe }
-Sys_EDOM        = 33;   { Math argument out of domain of func }
-Sys_ERANGE      = 34;   { Math result not representable }
+ESysENOMEM      = 12;   { Out of memory }
+ESysEACCES      = 13;   { Permission denied }
+ESysEFAULT      = 14;   { Bad address }
+ESysENOTBLK     = 15;   { Block device required, NOT POSIX! }
+ESysEBUSY       = 16;   { Device or resource busy }
+ESysEEXIST      = 17;   { File exists }
+ESysEXDEV       = 18;   { Cross-device link }
+ESysENODEV      = 19;   { No such device }
+ESysENOTDIR     = 20;   { Not a directory }
+ESysEISDIR      = 21;   { Is a directory }
+ESysEINVAL      = 22;   { Invalid argument }
+ESysENFILE      = 23;   { File table overflow }
+ESysEMFILE      = 24;   { Too many open files }
+ESysENOTTY      = 25;   { Not a typewriter }
+ESysETXTBSY     = 26;   { Text file busy }
+ESysEFBIG       = 27;   { File too large }
+ESysENOSPC      = 28;   { No space left on device }
+ESysESPIPE      = 29;   { Illegal seek }
+ESysEROFS       = 30;   { Read-only file system }
+ESysEMLINK      = 31;   { Too many links }
+ESysEPIPE       = 32;   { Broken pipe }
+ESysEDOM        = 33;   { Math argument out of domain of func }
+ESysERANGE      = 34;   { Math result not representable }
 {$ifdef FreeBSD}
 { non-blocking and interrupt i/o }
-Sys_EAGAIN      = 35;           { Resource temporarily unavailable }
+ESysEAGAIN      = 35;           { Resource temporarily unavailable }
 
 // non posix from here on.
 
-Sys_EWOULDBLOCK = SYS_EAGAIN;   { Operation would block }
-Sys_EINPROGRESS = 36;   { Operation now in progress }
-Sys_EALREADY    = 37;   { Operation already in progress }
+ESysEWOULDBLOCK = SYS_EAGAIN;   { Operation would block }
+ESysEINPROGRESS = 36;   { Operation now in progress }
+ESysEALREADY    = 37;   { Operation already in progress }
 
 { ipc/network software -- argument errors }
-Sys_ENOTSOCK    = 38;   { Socket operation on non-socket }
-Sys_EDESTADDRREQ= 39;   { Destination address required }
-Sys_EMSGSIZE    = 40;   { Message too long }
-Sys_EPROTOTYPE  = 41;   { Protocol wrong type for socket }
-Sys_ENOPROTOOPT = 42;   { Protocol not available }
-Sys_EPROTONOSUPPORT= 43;{ Protocol not supported }
-Sys_ESOCKTNOSUPPORT= 44;{ Socket type not supported }
-Sys_EOPNOTSUPP  = 45;   { Operation not supported }
-Sys_ENOTSUP     = SYS_EOPNOTSUPP;       { Operation not supported }
-Sys_EPFNOSUPPORT= 46;   { Protocol family not supported }
-Sys_EAFNOSUPPORT= 47;   { Address family not supported by protocol family }
-Sys_EADDRINUSE  = 48;   { Address already in use }
-Sys_EADDRNOTAVAIL= 49;  { Can't assign requested address }
+ESysENOTSOCK    = 38;   { Socket operation on non-socket }
+ESysEDESTADDRREQ= 39;   { Destination address required }
+ESysEMSGSIZE    = 40;   { Message too long }
+ESysEPROTOTYPE  = 41;   { Protocol wrong type for socket }
+ESysENOPROTOOPT = 42;   { Protocol not available }
+ESysEPROTONOSUPPORT= 43;{ Protocol not supported }
+ESysESOCKTNOSUPPORT= 44;{ Socket type not supported }
+ESysEOPNOTSUPP  = 45;   { Operation not supported }
+ESysENOTSUP     = SYS_EOPNOTSUPP;       { Operation not supported }
+ESysEPFNOSUPPORT= 46;   { Protocol family not supported }
+ESysEAFNOSUPPORT= 47;   { Address family not supported by protocol family }
+ESysEADDRINUSE  = 48;   { Address already in use }
+ESysEADDRNOTAVAIL= 49;  { Can't assign requested address }
 
 { ipc/network software -- operational errors }
-Sys_ENETDOWN    = 50;   { Network is down }
-Sys_ENETUNREACH = 51;   { Network is unreachable }
-Sys_ENETRESET   = 52;   { Network dropped connection on reset }
-Sys_ECONNABORTED= 53;   { Software caused connection abort }
-Sys_ECONNRESET  = 54;   { Connection reset by peer }
-Sys_ENOBUFS     = 55;   { No buffer space available }
-Sys_EISCONN     = 56;   { Socket is already connected }
-Sys_ENOTCONN    = 57;   { Socket is not connected }
-Sys_ESHUTDOWN   = 58;   { Can't send after socket shutdown }
-Sys_ETOOMANYREFS= 59;   { Too many references: can't splice }
-Sys_ETIMEDOUT   = 60;   { Operation timed out }
-Sys_ECONNREFUSED= 61;   { Connection refused }
-Sys_ELOOP       = 62;   { Too many levels of symbolic links }
-Sys_ENAMETOOLONG= 63;   { File name too long }
-Sys_EHOSTDOWN   = 64;   { Host is down }
-Sys_EHOSTUNREACH= 65;   { No route to host }
-Sys_ENOTEMPTY   = 66;   { Directory not empty }
+ESysENETDOWN    = 50;   { Network is down }
+ESysENETUNREACH = 51;   { Network is unreachable }
+ESysENETRESET   = 52;   { Network dropped connection on reset }
+ESysECONNABORTED= 53;   { Software caused connection abort }
+ESysECONNRESET  = 54;   { Connection reset by peer }
+ESysENOBUFS     = 55;   { No buffer space available }
+ESysEISCONN     = 56;   { Socket is already connected }
+ESysENOTCONN    = 57;   { Socket is not connected }
+ESysESHUTDOWN   = 58;   { Can't send after socket shutdown }
+ESysETOOMANYREFS= 59;   { Too many references: can't splice }
+ESysETIMEDOUT   = 60;   { Operation timed out }
+ESysECONNREFUSED= 61;   { Connection refused }
+ESysELOOP       = 62;   { Too many levels of symbolic links }
+ESysENAMETOOLONG= 63;   { File name too long }
+ESysEHOSTDOWN   = 64;   { Host is down }
+ESysEHOSTUNREACH= 65;   { No route to host }
+ESysENOTEMPTY   = 66;   { Directory not empty }
 { quotas & mush }
-Sys_EPROCLIM    = 67;   { Too many processes }
-Sys_EUSERS      = 68;   { Too many users }
-Sys_EDQUOT      = 69;   { Disc quota exceeded }
+ESysEPROCLIM    = 67;   { Too many processes }
+ESysEUSERS      = 68;   { Too many users }
+ESysEDQUOT      = 69;   { Disc quota exceeded }
 { Network File System }
-Sys_ESTALE      = 70;   { Stale NFS file handle }
-Sys_EREMOTE     = 71;   { Too many levels of remote in path }
-Sys_EBADRPC     = 72;   { RPC struct is bad }
-Sys_ERPCMISMATCH= 73;   { RPC version wrong }
-Sys_EPROGUNAVAIL= 74;   { RPC prog. not avail }
-Sys_EPROGMISMATCH= 75;  { Program version wrong }
-Sys_EPROCUNAVAIL= 76;   { Bad procedure for program }
-Sys_ENOLCK      = 77;   { No locks available }
-Sys_ENOSYS      = 78;   { Function not implemented }
-Sys_EFTYPE      = 79;   { Inappropriate file type or format }
-Sys_EAUTH       = 80;   { Authentication error }
-Sys_ENEEDAUTH   = 81;   { Need authenticator }
-Sys_EIDRM       = 82;   { Identifier removed }
-Sys_ENOMSG      = 83;   { No message of desired type }
-Sys_EOVERFLOW   = 84;   { Value too large to be stored in data type }
-Sys_ECANCELED   = 85;   { Operation canceled }
-Sys_EILSEQ      = 86;   { Illegal byte sequence }
-Sys_ELAST       = 86;   { Must be equal largest errno }
+ESysESTALE      = 70;   { Stale NFS file handle }
+ESysEREMOTE     = 71;   { Too many levels of remote in path }
+ESysEBADRPC     = 72;   { RPC struct is bad }
+ESysERPCMISMATCH= 73;   { RPC version wrong }
+ESysEPROGUNAVAIL= 74;   { RPC prog. not avail }
+ESysEPROGMISMATCH= 75;  { Program version wrong }
+ESysEPROCUNAVAIL= 76;   { Bad procedure for program }
+ESysENOLCK      = 77;   { No locks available }
+ESysENOSYS      = 78;   { Function not implemented }
+ESysEFTYPE      = 79;   { Inappropriate file type or format }
+ESysEAUTH       = 80;   { Authentication error }
+ESysENEEDAUTH   = 81;   { Need authenticator }
+ESysEIDRM       = 82;   { Identifier removed }
+ESysENOMSG      = 83;   { No message of desired type }
+ESysEOVERFLOW   = 84;   { Value too large to be stored in data type }
+ESysECANCELED   = 85;   { Operation canceled }
+ESysEILSEQ      = 86;   { Illegal byte sequence }
+ESysELAST       = 86;   { Must be equal largest errno }
 
 {$else}
-Sys_EDEADLK     = 35;   { Resource deadlock would occur }
-Sys_ENAMETOOLONG= 36;   { File name too long }
-Sys_ENOLCK      = 37;   { No record locks available }
-Sys_ENOSYS      = 38;   { Function not implemented }
-Sys_ENOTEMPTY= 39;      { Directory not empty }
-Sys_ELOOP       = 40;   { Too many symbolic links encountered }
-Sys_EWOULDBLOCK = Sys_EAGAIN;   { Operation would block }
-Sys_ENOMSG      = 42;   { No message of desired type }
-Sys_EIDRM       = 43;   { Identifier removed }
-Sys_ECHRNG      = 44;   { Channel number out of range }
-Sys_EL2NSYNC= 45;       { Level 2 not synchronized }
-Sys_EL3HLT      = 46;   { Level 3 halted }
-Sys_EL3RST      = 47;   { Level 3 reset }
-Sys_ELNRNG      = 48;   { Link number out of range }
-Sys_EUNATCH     = 49;   { Protocol driver not attached }
-Sys_ENOCSI      = 50;   { No CSI structure available }
-Sys_EL2HLT      = 51;   { Level 2 halted }
-Sys_EBADE       = 52;   { Invalid exchange }
-Sys_EBADR       = 53;   { Invalid request descriptor }
-Sys_EXFULL      = 54;   { Exchange full }
-Sys_ENOANO      = 55;   { No anode }
-Sys_EBADRQC     = 56;   { Invalid request code }
-Sys_EBADSLT     = 57;   { Invalid slot }
-Sys_EDEADLOCK= 58;      { File locking deadlock error }
-Sys_EBFONT      = 59;   { Bad font file format }
-Sys_ENOSTR      = 60;   { Device not a stream }
-Sys_ENODATA     = 61;   { No data available }
-Sys_ETIME       = 62;   { Timer expired }
-Sys_ENOSR       = 63;   { Out of streams resources }
-Sys_ENONET      = 64;   { Machine is not on the network }
-Sys_ENOPKG      = 65;   { Package not installed }
-Sys_EREMOTE     = 66;   { Object is remote }
-Sys_ENOLINK     = 67;   { Link has been severed }
-Sys_EADV        = 68;   { Advertise error }
-Sys_ESRMNT      = 69;   { Srmount error }
-Sys_ECOMM       = 70;   { Communication error on send }
-Sys_EPROTO      = 71;   { Protocol error }
-Sys_EMULTIHOP= 72;      { Multihop attempted }
-Sys_EDOTDOT     = 73;   { RFS specific error }
-Sys_EBADMSG     = 74;   { Not a data message }
-Sys_EOVERFLOW= 75;      { Value too large for defined data type }
-Sys_ENOTUNIQ= 76;       { Name not unique on network }
-Sys_EBADFD      = 77;   { File descriptor in bad state }
-Sys_EREMCHG     = 78;   { Remote address changed }
-Sys_ELIBACC     = 79;   { Can not access a needed shared library }
-Sys_ELIBBAD     = 80;   { Accessing a corrupted shared library }
-Sys_ELIBSCN     = 81;   { .lib section in a.out corrupted }
-Sys_ELIBMAX     = 82;   { Attempting to link in too many shared libraries }
-Sys_ELIBEXEC= 83;       { Cannot exec a shared library directly }
-Sys_EILSEQ      = 84;   { Illegal byte sequence }
-Sys_ERESTART= 85;       { Interrupted system call should be restarted }
-Sys_ESTRPIPE= 86;       { Streams pipe error }
-Sys_EUSERS      = 87;   { Too many users }
-Sys_ENOTSOCK= 88;       { Socket operation on non-socket }
-Sys_EDESTADDRREQ= 89;   { Destination address required }
-Sys_EMSGSIZE= 90;       { Message too long }
-Sys_EPROTOTYPE= 91;     { Protocol wrong type for socket }
-Sys_ENOPROTOOPT= 92;    { Protocol not available }
-Sys_EPROTONOSUPPORT= 93;        { Protocol not supported }
-Sys_ESOCKTNOSUPPORT= 94;        { Socket type not supported }
-Sys_EOPNOTSUPP= 95;     { Operation not supported on transport endpoint }
-Sys_EPFNOSUPPORT= 96;   { Protocol family not supported }
-Sys_EAFNOSUPPORT= 97;   { Address family not supported by protocol }
-Sys_EADDRINUSE= 98;     { Address already in use }
-Sys_EADDRNOTAVAIL= 99;  { Cannot assign requested address }
-Sys_ENETDOWN= 100;      { Network is down }
-Sys_ENETUNREACH= 101;   { Network is unreachable }
-Sys_ENETRESET= 102;     { Network dropped connection because of reset }
-Sys_ECONNABORTED= 103;  { Software caused connection abort }
-Sys_ECONNRESET= 104;    { Connection reset by peer }
-Sys_ENOBUFS     = 105;  { No buffer space available }
-Sys_EISCONN     = 106;  { Transport endpoint is already connected }
-Sys_ENOTCONN= 107;      { Transport endpoint is not connected }
-Sys_ESHUTDOWN= 108;     { Cannot send after transport endpoint shutdown }
-Sys_ETOOMANYREFS= 109;  { Too many references: cannot splice }
-Sys_ETIMEDOUT= 110;     { Connection timed out }
-Sys_ECONNREFUSED= 111;  { Connection refused }
-Sys_EHOSTDOWN= 112;     { Host is down }
-Sys_EHOSTUNREACH= 113;  { No route to host }
-Sys_EALREADY= 114;      { Operation already in progress }
-Sys_EINPROGRESS= 115;   { Operation now in progress }
-Sys_ESTALE      = 116;  { Stale NFS file handle }
-Sys_EUCLEAN     = 117;  { Structure needs cleaning }
-Sys_ENOTNAM     = 118;  { Not a XENIX named type file }
-Sys_ENAVAIL     = 119;  { No XENIX semaphores available }
-Sys_EISNAM      = 120;  { Is a named type file }
-Sys_EREMOTEIO= 121;     { Remote I/O error }
-Sys_EDQUOT      = 122;  { Quota exceeded }
+ESysEDEADLK     = 35;   { Resource deadlock would occur }
+ESysENAMETOOLONG= 36;   { File name too long }
+ESysENOLCK      = 37;   { No record locks available }
+ESysENOSYS      = 38;   { Function not implemented }
+ESysENOTEMPTY= 39;      { Directory not empty }
+ESysELOOP       = 40;   { Too many symbolic links encountered }
+ESysEWOULDBLOCK = ESysEAGAIN;   { Operation would block }
+ESysENOMSG      = 42;   { No message of desired type }
+ESysEIDRM       = 43;   { Identifier removed }
+ESysECHRNG      = 44;   { Channel number out of range }
+ESysEL2NSYNC= 45;       { Level 2 not synchronized }
+ESysEL3HLT      = 46;   { Level 3 halted }
+ESysEL3RST      = 47;   { Level 3 reset }
+ESysELNRNG      = 48;   { Link number out of range }
+ESysEUNATCH     = 49;   { Protocol driver not attached }
+ESysENOCSI      = 50;   { No CSI structure available }
+ESysEL2HLT      = 51;   { Level 2 halted }
+ESysEBADE       = 52;   { Invalid exchange }
+ESysEBADR       = 53;   { Invalid request descriptor }
+ESysEXFULL      = 54;   { Exchange full }
+ESysENOANO      = 55;   { No anode }
+ESysEBADRQC     = 56;   { Invalid request code }
+ESysEBADSLT     = 57;   { Invalid slot }
+ESysEDEADLOCK= 58;      { File locking deadlock error }
+ESysEBFONT      = 59;   { Bad font file format }
+ESysENOSTR      = 60;   { Device not a stream }
+ESysENODATA     = 61;   { No data available }
+ESysETIME       = 62;   { Timer expired }
+ESysENOSR       = 63;   { Out of streams resources }
+ESysENONET      = 64;   { Machine is not on the network }
+ESysENOPKG      = 65;   { Package not installed }
+ESysEREMOTE     = 66;   { Object is remote }
+ESysENOLINK     = 67;   { Link has been severed }
+ESysEADV        = 68;   { Advertise error }
+ESysESRMNT      = 69;   { Srmount error }
+ESysECOMM       = 70;   { Communication error on send }
+ESysEPROTO      = 71;   { Protocol error }
+ESysEMULTIHOP= 72;      { Multihop attempted }
+ESysEDOTDOT     = 73;   { RFS specific error }
+ESysEBADMSG     = 74;   { Not a data message }
+ESysEOVERFLOW= 75;      { Value too large for defined data type }
+ESysENOTUNIQ= 76;       { Name not unique on network }
+ESysEBADFD      = 77;   { File descriptor in bad state }
+ESysEREMCHG     = 78;   { Remote address changed }
+ESysELIBACC     = 79;   { Can not access a needed shared library }
+ESysELIBBAD     = 80;   { Accessing a corrupted shared library }
+ESysELIBSCN     = 81;   { .lib section in a.out corrupted }
+ESysELIBMAX     = 82;   { Attempting to link in too many shared libraries }
+ESysELIBEXEC= 83;       { Cannot exec a shared library directly }
+ESysEILSEQ      = 84;   { Illegal byte sequence }
+ESysERESTART= 85;       { Interrupted system call should be restarted }
+ESysESTRPIPE= 86;       { Streams pipe error }
+ESysEUSERS      = 87;   { Too many users }
+ESysENOTSOCK= 88;       { Socket operation on non-socket }
+ESysEDESTADDRREQ= 89;   { Destination address required }
+ESysEMSGSIZE= 90;       { Message too long }
+ESysEPROTOTYPE= 91;     { Protocol wrong type for socket }
+ESysENOPROTOOPT= 92;    { Protocol not available }
+ESysEPROTONOSUPPORT= 93;        { Protocol not supported }
+ESysESOCKTNOSUPPORT= 94;        { Socket type not supported }
+ESysEOPNOTSUPP= 95;     { Operation not supported on transport endpoint }
+ESysEPFNOSUPPORT= 96;   { Protocol family not supported }
+ESysEAFNOSUPPORT= 97;   { Address family not supported by protocol }
+ESysEADDRINUSE= 98;     { Address already in use }
+ESysEADDRNOTAVAIL= 99;  { Cannot assign requested address }
+ESysENETDOWN= 100;      { Network is down }
+ESysENETUNREACH= 101;   { Network is unreachable }
+ESysENETRESET= 102;     { Network dropped connection because of reset }
+ESysECONNABORTED= 103;  { Software caused connection abort }
+ESysECONNRESET= 104;    { Connection reset by peer }
+ESysENOBUFS     = 105;  { No buffer space available }
+ESysEISCONN     = 106;  { Transport endpoint is already connected }
+ESysENOTCONN= 107;      { Transport endpoint is not connected }
+ESysESHUTDOWN= 108;     { Cannot send after transport endpoint shutdown }
+ESysETOOMANYREFS= 109;  { Too many references: cannot splice }
+ESysETIMEDOUT= 110;     { Connection timed out }
+ESysECONNREFUSED= 111;  { Connection refused }
+ESysEHOSTDOWN= 112;     { Host is down }
+ESysEHOSTUNREACH= 113;  { No route to host }
+ESysEALREADY= 114;      { Operation already in progress }
+ESysEINPROGRESS= 115;   { Operation now in progress }
+ESysESTALE      = 116;  { Stale NFS file handle }
+ESysEUCLEAN     = 117;  { Structure needs cleaning }
+ESysENOTNAM     = 118;  { Not a XENIX named type file }
+ESysENAVAIL     = 119;  { No XENIX semaphores available }
+ESysEISNAM      = 120;  { Is a named type file }
+ESysEREMOTEIO= 121;     { Remote I/O error }
+ESysEDQUOT      = 122;  { Quota exceeded }
 {$endif}
 
 {
   $Log$
-  Revision 1.4  2002-09-07 16:01:27  peter
+  Revision 1.5  2002-12-18 16:50:39  marco
+   * Unix RTL generic parts. Linux working, *BSD will follow shortly
+
+  Revision 1.4  2002/09/07 16:01:27  peter
     * old logs removed and tabs fixed
 
   Revision 1.3  2002/03/11 19:10:33  peter

+ 126 - 0
rtl/unix/genfuncs.inc

@@ -0,0 +1,126 @@
+{
+    $Id$
+    This file is part of the Free Pascal run time library.
+    Copyright (c) 2002 by Marco van de Voort.
+
+    A few general purpose routines. General purpose enough for *BSD
+     and Linux at least.
+
+    See the file COPYING.FPC, included in this distribution,
+    for details about the copyright.
+
+    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.
+
+ **********************************************************************}
+
+function InternalCreateShellArgV(cmd:pChar; len:longint):ppchar;
+{
+  Create an argv which executes a command in a shell using /bin/sh -c
+}
+const   Shell   = '/bin/sh'#0'-c'#0;
+var
+  pp,p : ppchar;
+//  temp : string; !! Never pass a local var back!!
+begin
+  getmem(pp,4*4);
+  p:=pp;
+  p^:=@Shell[1];
+  inc(p);
+  p^:=@Shell[9];
+  inc(p);
+  getmem(p^,len+1);
+  move(cmd^,p^^,len);
+  pchar(p^)[len]:=#0;
+  inc(p);
+  p^:=Nil;
+  InternalCreateShellArgV:=pp;
+end;
+
+function CreateShellArgV(const prog:string):ppchar;
+begin
+  CreateShellArgV:=InternalCreateShellArgV(@prog[1],length(prog));
+end;
+
+function CreateShellArgV(const prog:Ansistring):ppchar;
+{
+  Create an argv which executes a command in a shell using /bin/sh -c
+  using a AnsiString;
+}
+begin
+  CreateShellArgV:=InternalCreateShellArgV(@prog[1],length(prog)); // if ppc works like delphi this also work when @prog[1] is invalid (len=0)
+end;
+
+
+procedure FreeShellArgV(p:ppchar);
+begin
+  if (p<>nil) then begin
+    freemem(p[2]);
+    freemem(p);
+   end;
+end;
+
+
+Function fpgetenv(name:pchar):pchar;
+
+var
+  p     : ppchar;
+  found : boolean;
+  np,cp : pchar;
+  len,i : longint;
+Begin
+  if (name=nil) or (envp=NIL) Then
+   exit(NIL);
+  np:=name;
+  while (np^<>#0) and (np^<>'=') DO
+   inc(np);
+  len:=np-name;
+  p:=envp;
+  while (p^<>NIL) DO
+   Begin
+    cp:=p^;
+    np:=name;
+    i:=len;
+    while (i<>0) and (cp^<>#0) DO
+      Begin
+        if cp^<>np^ Then
+	  Begin
+ 	   inc(cp); inc(np);
+	   break;
+         End;
+        inc(cp); inc(np);
+	dec(i)
+      End;  
+    if (i=0) and (cp^='=') Then
+	exit(cp+1);
+   inc(p);
+  end;
+End;
+
+Function fpgetenv(name:string):Pchar;
+{
+  Searches the environment for a string with name p and
+  returns a pchar to it's value.
+  A pchar is used to accomodate for strings of length > 255
+}
+
+
+Begin
+  name:=name+'=';            {Else HOST will also find HOSTNAME, etc}
+  fpgetenv:=fpgetenv(@name[1]);
+end;
+
+{
+  $Log$
+  Revision 1.1  2002-12-18 16:50:39  marco
+   * Unix RTL generic parts. Linux working, *BSD will follow shortly
+
+  Revision 1.2  2002/10/27 17:21:30  marco
+   * Only "difficult" functions + execvp + termios + rewinddir left to do
+
+  Revision 1.1  2002/10/27 13:16:54  marco
+   * Routines that certainly will be shared between Linux and *BSD
+
+
+}

+ 23 - 20
rtl/unix/gensigset.inc

@@ -15,65 +15,68 @@
 
 **********************************************************************}
 
-function sys_sigaddset(var _set : sigset_t;signo:cint): cint;
+function fpsigaddset(var nset : sigset_t;signo:cint): cint;
 
 Begin
    if (signo<=0) or (signo > SIG_MAXSIG) Then
      Begin
-       seterrno(sys_EINVAL);
+       seterrno(ESysEINVAL);
        exit(-1);
      End;
-   _set[(signo-1) shr ln2bitsinword]:=_set[(signo-1) shr ln2bitsinword] OR (1 shl ((signo-1) and ln2bitmask));
-   sys_sigaddset:=0;
+   nset[(signo-1) shr ln2bitsinword]:=nset[(signo-1) shr ln2bitsinword] OR (1 shl ((signo-1) and ln2bitmask));
+   fpsigaddset:=0;
 End;   
 
-function sys_sigdelset(var _set : sigset_t;signo:cint): cint;
+function fpsigdelset(var nset : sigset_t;signo:cint): cint;
 
 Begin
    if (signo<=0) or (signo > SIG_MAXSIG) Then
      Begin
-       seterrno(sys_EINVAL);
+       seterrno(ESysEINVAL);
        exit(-1);
      End;
-   _set[(signo-1) shr ln2bitsinword]:=_set[(signo-1) shr ln2bitsinword] AND NOT (1 shl ((signo-1) and ln2bitmask));
-   sys_sigdelset:=0;
+   nset[(signo-1) shr ln2bitsinword]:=nset[(signo-1) shr ln2bitsinword] AND NOT (1 shl ((signo-1) and ln2bitmask));
+   fpsigdelset:=0;
 End;
 
-function sys_sigemptyset(var _set : sigset_t):cint;
+function fpsigemptyset(var nset : sigset_t):cint;
 
 var i :longint;
 
 Begin
-  for i:=0 to wordsinsigset-1 DO _set[i]:=0;
-  sys_sigemptyset:=0;
+  for i:=0 to wordsinsigset-1 DO nset[i]:=0;
+  fpsigemptyset:=0;
 End;
 
-function sys_sigfillset(var _set : sigset_t):cint;
+function fpsigfillset(var nset : sigset_t):cint;
 
 var i :longint;
 
 Begin
-  for i:=0 to wordsinsigset DO _set[i]:=NOT 0;
-  sys_sigfillset:=0;
+  for i:=0 to wordsinsigset DO nset[i]:=NOT 0;
+  fpsigfillset:=0;
 End;
 
-function sys_sigismember(const _set : sigset_t;signo:cint): cint;
+function fpsigismember(const nset : sigset_t;signo:cint): cint;
 
 Begin
    if (signo<=0) or (signo > SIG_MAXSIG) Then
      Begin
-       seterrno(sys_EINVAL);
+       seterrno(ESysEINVAL);
        exit(-1);
      End;
-    if ((_set[(signo-1) shr ln2bitsinword]) and (1 shl ((signo-1) and ln2bitmask)))>0 Then
-     sys_sigismember:=1
+    if ((nset[(signo-1) shr ln2bitsinword]) and (1 shl ((signo-1) and ln2bitmask)))>0 Then
+     fpsigismember:=1
     else 
-     sys_sigismember:=0;
+     fpsigismember:=0;
 End;      
 
 {
    $Log$
-   Revision 1.1  2002-11-14 12:20:30  marco
+   Revision 1.2  2002-12-18 16:50:39  marco
+    * Unix RTL generic parts. Linux working, *BSD will follow shortly
+
+   Revision 1.1  2002/11/14 12:20:30  marco
     * initial version, taken from bsdfunc.inc, since both linux and bsd use it
 
 

+ 30 - 27
rtl/unix/linux.pp

@@ -497,7 +497,7 @@ Function S_ISSOCK(m:word):boolean;
 
 Implementation
 
-Uses Strings;
+Uses Strings,baseunix;
 
 
 { Get the definitions of textrec and filerec }
@@ -521,7 +521,7 @@ begin
   repeat
     s:=$7F00;
     r:=WaitPid(Pid,@s,0);
-  until (r<>-1) or (LinuxError<>Sys_EINTR);
+  until (r<>-1) or (LinuxError<>ESysEINTR);
   if (r=-1) or (r=0) then // 0 is not a valid return and should never occur (it means status invalid when using WNOHANG)
     WaitProcess:=-1 // return -1 to indicate an error
   else
@@ -619,7 +619,7 @@ begin
   else
    Path:='';
   if Path='' then
-   linuxerror:=Sys_enoent
+   linuxerror:=ESysenoent
   else
    Execve(Path,args,ep);{On error linuxerror will get set there}
 end;
@@ -654,7 +654,7 @@ begin
   else
    Path:='';
   if Path='' then
-   linuxerror:=Sys_enoent
+   linuxerror:=ESysenoent
   else
    Execve(Path,args,ep);{On error linuxerror will get set there}
 end;
@@ -1012,7 +1012,7 @@ end;
 Function fdOpen(pathname:string;flags:longint):longint;
 begin
   pathname:=pathname+#0;
-  fdOpen:=Sys_Open(@pathname[1],flags,438);
+  fdOpen:=FpOpen(@pathname[1],flags,438);
   LinuxError:=Errno;
 end;
 
@@ -1020,7 +1020,7 @@ end;
 Function fdOpen(pathname:string;flags,mode:longint):longint;
 begin
   pathname:=pathname+#0;
-  fdOpen:=Sys_Open(@pathname[1],flags,mode);
+  fdOpen:=FpOpen(@pathname[1],flags,mode);
   LinuxError:=Errno;
 end;
 
@@ -1028,7 +1028,7 @@ end;
 
 Function  fdOpen(pathname:pchar;flags:longint):longint;
 begin
-  fdOpen:=Sys_Open(pathname,flags,0);
+  fdOpen:=FpOpen(pathname,flags,0);
   LinuxError:=Errno;
 end;
 
@@ -1036,7 +1036,7 @@ end;
 
 Function  fdOpen(pathname:pchar;flags,mode:longint):longint;
 begin
-  fdOpen:=Sys_Open(pathname,flags,mode);
+  fdOpen:=FpOpen(pathname,flags,mode);
   LinuxError:=Errno;
 end;
 
@@ -1044,7 +1044,7 @@ end;
 
 Function fdClose(fd:longint):boolean;
 begin
-  fdClose:=(Sys_Close(fd)=0);
+  fdClose:=(FpClose(fd)=0);
   LinuxError:=Errno;
 end;
 
@@ -1052,7 +1052,7 @@ end;
 
 Function fdRead(fd:longint;var buf;size:longint):longint;
 begin
-  fdRead:=Sys_Read(fd,pchar(@buf),size);
+  fdRead:=FpRead(fd,pchar(@buf),size);
   LinuxError:=Errno;
 end;
 
@@ -1060,7 +1060,7 @@ end;
 
 Function fdWrite(fd:longint;const buf;size:longint):longint;
 begin
-  fdWrite:=Sys_Write(fd,pchar(@buf),size);
+  fdWrite:=FpWrite(fd,pchar(@buf),size);
   LinuxError:=Errno;
 end;
 
@@ -1073,7 +1073,7 @@ Function  fdSeek (fd,pos,seektype :longint): longint;
 
 }
 begin
-   fdseek:=Sys_LSeek (fd,pos,seektype);
+   fdseek:=FpLSeek (fd,pos,seektype);
    LinuxError:=Errno;
 end;
 
@@ -1084,13 +1084,13 @@ Function Fcntl(Fd:longint;Cmd:longint):longint;
   Possible values for Cmd are :
     F_GetFd,F_GetFl,F_GetOwn
   Errors are reported in Linuxerror;
-  If Cmd is different from the allowed values, linuxerror=Sys_eninval.
+  If Cmd is different from the allowed values, linuxerror=ESyseninval.
 }
 
 begin
   if (cmd in [F_GetFd,F_GetFl,F_GetOwn]) then
    begin
-     Linuxerror:=sys_fcntl(fd,cmd,0);
+     Linuxerror:=fdfcntl(fd,cmd,0);
      if linuxerror=-1 then
       begin
         linuxerror:=errno;
@@ -1104,7 +1104,7 @@ begin
    end
   else
    begin
-     linuxerror:=Sys_einval;
+     linuxerror:=ESyseinval;
      Fcntl:=0;
    end;
 end;
@@ -1122,11 +1122,11 @@ Procedure Fcntl(Fd:longint;Cmd:longint;Arg:Longint);
 begin
   if (cmd in [F_SetFd,F_SetFl,F_GetLk,F_SetLk,F_SetLkw,F_SetOwn]) then
    begin
-     sys_fcntl(fd,cmd,arg);
+     fpfcntl(fd,cmd,arg);
      LinuxError:=ErrNo;
    end
   else
-   linuxerror:=Sys_einval;
+   linuxerror:=ESyseinval;
 end;
 {$endif}
 
@@ -1361,7 +1361,7 @@ Var
 begin
   if textrec(t).mode=fmclosed then
    begin
-     LinuxError:=Sys_EBADF;
+     LinuxError:=ESysEBadf;
      exit(-1);
    end;
   FD_Zero(f);
@@ -1406,7 +1406,7 @@ procedure SeekDir(p:pdir;off:longint);
 begin
   if p=nil then
    begin
-     errno:=Sys_EBADF;
+     errno:=ESysEBadf;
      exit;
    end;
  {$ifndef bsd}                          {Should be ifdef Linux, but can't because
@@ -1424,7 +1424,7 @@ function TellDir(p:pdir):longint;
 begin
   if p=nil then
    begin
-     errno:=Sys_EBADF;
+     errno:=ESysEBadf;
      telldir:=-1;
      exit;
    end;
@@ -1590,7 +1590,7 @@ begin
   rw:=upcase(rw);
   if not (rw in ['R','W']) then
    begin
-     LinuxError:=Sys_enoent;
+     LinuxError:=ESysENOENT;
      exit;
    end;
   AssignPipe(pipi,pipo);
@@ -1669,7 +1669,7 @@ begin
   rw:=upcase(rw);
   if not (rw in ['R','W']) then
    begin
-     LinuxError:=Sys_enoent;
+     LinuxError:=ESysENOENT;
      exit;
    end;
   AssignPipe(pipi,pipo);
@@ -2011,7 +2011,7 @@ begin
   {$endif}
   else
    begin
-     ErrNo:=Sys_EINVAL;
+     ErrNo:=ESysEINVAL;
      TCSetAttr:=false;
      exit;
    end;
@@ -2275,7 +2275,7 @@ begin
   StringToPPChar:=p;
   if p=nil then
    begin
-     LinuxError:=sys_enomem;
+     LinuxError:=ESysENOMEM;
      exit;
    end;
   buf:=s;
@@ -2586,7 +2586,7 @@ begin
         end;
        if current=nil then
         begin
-          linuxerror:=Sys_ENOMEM;
+          linuxerror:=ESysENOMEM;
           globfree(root);
           break;
         end;
@@ -2594,7 +2594,7 @@ begin
        getmem(current^.name,length(temp2)+1);
        if current^.name=nil then
         begin
-          linuxerror:=Sys_ENOMEM;
+          linuxerror:=ESysENOMEM;
           globfree(root);
           break;
         end;
@@ -3032,7 +3032,10 @@ End.
 
 {
   $Log$
-  Revision 1.24  2002-09-13 13:03:27  jonas
+  Revision 1.25  2002-12-18 16:50:39  marco
+   * Unix RTL generic parts. Linux working, *BSD will follow shortly
+
+  Revision 1.24  2002/09/13 13:03:27  jonas
     * fixed buffer overflow error in StringToPPChar(), detected using
       DIOTA (http://www.elis/rug.ac.be/~ronsse/diota) (which I also work on :)
       (merged)

+ 20 - 17
rtl/unix/unix.pp

@@ -515,7 +515,7 @@ begin
   repeat
     s:=$7F00;
     r:=WaitPid(Pid,@s,0);
-  until (r<>-1) or (LinuxError<>Sys_EINTR);
+  until (r<>-1) or (LinuxError<>ESysEINTR);
   if (r=-1) or (r=0) then // 0 is not a valid return and should never occur (it means status invalid when using WNOHANG)
     WaitProcess:=-1 // return -1 to indicate an error
   else
@@ -613,7 +613,7 @@ begin
   else
    Path:='';
   if Path='' then
-   linuxerror:=Sys_enoent
+   linuxerror:=ESysEnoent
   else
    Execve(Path,args,ep);{On error linuxerror will get set there}
 end;
@@ -648,7 +648,7 @@ begin
   else
    Path:='';
   if Path='' then
-   linuxerror:=Sys_enoent
+   linuxerror:=ESysEnoent
   else
    Execve(Path,args,ep);{On error linuxerror will get set there}
 end;
@@ -1116,7 +1116,7 @@ Function Fcntl(Fd:longint;Cmd:longint):longint;
   Possible values for Cmd are :
     F_GetFd,F_GetFl,F_GetOwn
   Errors are reported in Linuxerror;
-  If Cmd is different from the allowed values, linuxerror=Sys_eninval.
+  If Cmd is different from the allowed values, linuxerror=ESysEninval.
 }
 
 begin
@@ -1136,7 +1136,7 @@ begin
    end
   else
    begin
-     linuxerror:=Sys_einval;
+     linuxerror:=ESysEinval;
      Fcntl:=0;
    end;
 end;
@@ -1148,7 +1148,7 @@ Procedure Fcntl(Fd:longint;Cmd:longint;Arg:Longint);
   Possible values for Cmd are :
     F_setFd,F_SetFl,F_GetLk,F_SetLk,F_SetLkW,F_SetOwn;
   Errors are reported in Linuxerror;
-  If Cmd is different from the allowed values, linuxerror=Sys_eninval.
+  If Cmd is different from the allowed values, linuxerror=ESysEninval.
   F_DupFD is not allowed, due to the structure of Files in Pascal.
 }
 begin
@@ -1158,7 +1158,7 @@ begin
      LinuxError:=ErrNo;
    end
   else
-   linuxerror:=Sys_einval;
+   linuxerror:=ESysEinval;
 end;
 {$endif}
 
@@ -1394,7 +1394,7 @@ Var
 begin
   if textrec(t).mode=fmclosed then
    begin
-     LinuxError:=Sys_EBADF;
+     LinuxError:=ESysEBADF;
      exit(-1);
    end;
   FD_Zero(f);
@@ -1439,7 +1439,7 @@ procedure SeekDir(p:pdir;off:longint);
 begin
   if p=nil then
    begin
-     errno:=Sys_EBADF;
+     errno:=ESysEBADF;
      exit;
    end;
  {$ifndef bsd}
@@ -1454,7 +1454,7 @@ function TellDir(p:pdir):longint;
 begin
   if p=nil then
    begin
-     errno:=Sys_EBADF;
+     errno:=ESysEBADF;
      telldir:=-1;
      exit;
    end;
@@ -1620,7 +1620,7 @@ begin
   rw:=upcase(rw);
   if not (rw in ['R','W']) then
    begin
-     LinuxError:=Sys_enoent;
+     LinuxError:=ESysEnoent;
      exit;
    end;
   AssignPipe(pipi,pipo);
@@ -1699,7 +1699,7 @@ begin
   rw:=upcase(rw);
   if not (rw in ['R','W']) then
    begin
-     LinuxError:=Sys_enoent;
+     LinuxError:=ESysEnoent;
      exit;
    end;
   AssignPipe(pipi,pipo);
@@ -2041,7 +2041,7 @@ begin
   {$endif}
   else
    begin
-     ErrNo:=Sys_EINVAL;
+     ErrNo:=ESysEINVAL;
      TCSetAttr:=false;
      exit;
    end;
@@ -2305,7 +2305,7 @@ begin
   StringToPPChar:=p;
   if p=nil then
    begin
-     LinuxError:=sys_enomem;
+     LinuxError:=ESysEnomem;
      exit;
    end;
   buf:=s;
@@ -2612,7 +2612,7 @@ begin
         end;
        if current=nil then
         begin
-          linuxerror:=Sys_ENOMEM;
+          linuxerror:=ESysENOMEM;
           globfree(root);
           break;
         end;
@@ -2620,7 +2620,7 @@ begin
        getmem(current^.name,length(temp2)+1);
        if current^.name=nil then
         begin
-          linuxerror:=Sys_ENOMEM;
+          linuxerror:=ESysENOMEM;
           globfree(root);
           break;
         end;
@@ -3058,7 +3058,10 @@ End.
 
 {
   $Log$
-  Revision 1.24  2002-09-07 16:01:28  peter
+  Revision 1.25  2002-12-18 16:50:39  marco
+   * Unix RTL generic parts. Linux working, *BSD will follow shortly
+
+  Revision 1.24  2002/09/07 16:01:28  peter
     * old logs removed and tabs fixed
 
   Revision 1.23  2002/08/06 13:30:46  sg