home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / m2posx14 / src / file.dpp < prev    next >
Encoding:
Modula Definition  |  1994-04-18  |  35.0 KB  |  684 lines

  1. DEFINITION MODULE file;
  2. __DEF_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (*****************************************************************************)
  13. (* Funktionen, die ``normale'' Dateien bearbeiten.                           *)
  14. (*                                                                           *)
  15. (* Ein Fehler ist immer dann aufgetreten, wenn bei Funktionen mit Typ INTEGER*)
  16. (* ein negativer Wert zurueckgegeben wird.                                   *)
  17. (* Die genaue Fehlerursache kann bei Bedarf ueber "err.errno" und die ent-   *)
  18. (* sprechenden Konstanten ermittelt werden. Die Funktionen veraendern "errno"*)
  19. (* nur dann, wenn ein Fehler aufgetreten ist, bei erfolgreicher Ausfuehrung  *)
  20. (* wird "errno" nicht veraendert.                                            *)
  21. (*                                                                           *)
  22. (* GEMDOS:                                                                   *)
  23. (* Die Eigenschaften der Funktionen unter dem ``blanken'' GEMDOS sind z.T.   *)
  24. (* stark eingeschraenkt; unter dem Stichwort GEMDOS ist deswegen immer       *)
  25. (* angegeben, in wieweit die Funktion emuliert werden kann. Ist MiNT-Unter-  *)
  26. (* stuetzung angegeben, so ist unter der Betriebssystemerweiterung MiNT      *)
  27. (* eine bessere Unterstuetzung der Funktionen zu erwarten; wie weit diese    *)
  28. (* geht, ist unter dem Stichwort MiNT angegeben.                             *)
  29. (* --------------------------------------------------------------------------*)
  30. (* 18-Apr-94, Holger Kleinschmidt                                            *)
  31. (*****************************************************************************)
  32.  
  33. FROM SYSTEM IMPORT
  34. (* TYPE *) ADDRESS;
  35.  
  36. FROM types IMPORT
  37. (* TYPE *) int, uidT, gidT, inoT, timeT, offT, sizeT, ssizeT, devT, nlinkT,
  38.            pidT;
  39.  
  40. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  41.  
  42. (*======= "stat()", "open()", "creat()", "umask()", "chmod()" ===============*)
  43.  
  44. TYPE
  45. #if reverse_set
  46.   FileModes = (
  47.     Type15,   (* = 100000B *)
  48.     Type14,   (* = 040000B *)
  49.     Type13,   (* = 020000B *)
  50.     Type12,   (* = 010000B *)
  51.  
  52.     sISUID,   (* = 004000B, Effektive Benutzer-ID bei Ausfuehrung setzen *)
  53.     sISGID,   (* = 002000B, Effektive Gruppen-ID bei Ausfuehrung setzen *)
  54.     sISVTX,   (* = 001000B  Reserviert, nicht POSIX *)
  55.  
  56.     sIRUSR,   (* = 000400B, Besitzer: Leseberechtigung *)
  57.     sIWUSR,   (* = 000200B, Besitzer: Schreibberechtigung *)
  58.     sIXUSR,   (* = 000100B, Besitzer: Ausfuehr/Suchberechtigung *)
  59.     sIRGRP,   (* = 000040B, Gruppe  : Leseberechtigung *)
  60.     sIWGRP,   (* = 000020B, Gruppe  : Schreibberechtigung *)
  61.     sIXGRP,   (* = 000010B, Gruppe  : Ausfuehr/Suchberechtigung *)
  62.     sIROTH,   (* = 000004B, Andere  : Leseberechtigung *)
  63.     sIWOTH,   (* = 000002B, Andere  : Schreibberechtigung *)
  64.     sIXOTH    (* = 000001B, Andere  : Ausfuehr/Suchberechtigung *)
  65.   );
  66. #else
  67.   FileModes = (
  68.     sIXOTH,   (* = 000001B, Andere  : Ausfuehr/Suchberechtigung *)
  69.     sIWOTH,   (* = 000002B, Andere  : Schreibberechtigung *)
  70.     sIROTH,   (* = 000004B, Andere  : Leseberechtigung *)
  71.     sIXGRP,   (* = 000010B, Gruppe  : Ausfuehr/Suchberechtigung *)
  72.     sIWGRP,   (* = 000020B, Gruppe  : Schreibberechtigung *)
  73.     sIRGRP,   (* = 000040B, Gruppe  : Leseberechtigung *)
  74.     sIXUSR,   (* = 000100B, Besitzer: Ausfuehr/Suchberechtigung *)
  75.     sIWUSR,   (* = 000200B, Besitzer: Schreibberechtigung *)
  76.     sIRUSR,   (* = 000400B, Besitzer: Leseberechtigung *)
  77.  
  78.     sISVTX,   (* = 001000B  Reserviert, nicht POSIX *)
  79.     sISGID,   (* = 002000B, Effektive Gruppen-ID bei Ausfuehrung setzen *)
  80.     sISUID,   (* = 004000B, Effektive Benutzer-ID bei Ausfuehrung setzen *)
  81.  
  82.     Type12,   (* = 010000B *)
  83.     Type13,   (* = 020000B *)
  84.     Type14,   (* = 040000B *)
  85.     Type15    (* = 100000B *)
  86.   );
  87. #endif
  88.   modeT = PACKEDSET OF FileModes;
  89.  
  90.  
  91. CONST
  92.   sIRWXU = modeT{sIRUSR, sIWUSR, sIXUSR};
  93.   sIRWXG = modeT{sIRGRP, sIWGRP, sIXGRP};
  94.   sIRWXO = modeT{sIROTH, sIWOTH, sIXOTH};
  95.  
  96. (* Die folgenden Konstanten sind nicht POSIX: *)
  97. CONST
  98. #if reverse_set
  99.   sIFMT  = modeT{Type15..Type12};         (* 170000B, Maske fuer Dateityp *)
  100. #else
  101.   sIFMT  = modeT{Type12..Type15};         (* 170000B, Maske fuer Dateityp *)
  102. #endif
  103.   sIFCHR = modeT{Type13};                 (* 020000B, Zeichenor. Geraet *)
  104.   sIFDIR = modeT{Type14};                 (* 040000B, Verzeichnis *)
  105.   sIFBLK = modeT{Type13, Type14};         (* 060000B, Blockor. Geraet *)
  106.   sIFREG = modeT{Type15};                 (* 100000B, Normale Datei *)
  107.   sIFIFO = modeT{Type13, Type15};         (* 120000B, Pipe *)
  108.   sIFLNK = modeT{Type13, Type14, Type15}; (* 160000B, Symb. Link, *)
  109.  
  110. (* IF st.stMode * sIFMT = sIFCHR THEN
  111.  *           ...
  112.  *)
  113.  
  114.  
  115. TYPE
  116.   StatRec = RECORD
  117.     stMode    : modeT; (* Dateityp & Zugriffsberechtigung *)
  118.     stIno     : inoT;  (* Inode, zus. mit 'stDev' eindeutiger Index *)
  119.     stDev     : devT;  (* Geraet, auf dem die Datei liegt *)
  120.     stRdev    : devT;  (* Nicht POSIX: Typ des Geraets *)
  121.     stNlink   : nlinkT;(* Anzahl der Links *)
  122.     stUid     : uidT;  (* Benutzerkennung des Besitzers *)
  123.     stGid     : gidT;  (* Gruppenkennung des Besitzers *)
  124.     stSize    : offT;  (* Dateilaenge in Bytes *)
  125.     stBlksize : offT;  (* Nicht POSIX: Optimale Blockgroesse fuer I/O *)
  126.     stBlocks  : offT;  (* Nicht POSIX: Von Datei belegte (512 Byte)-Bloecke *)
  127.     stAtime   : timeT; (* Datum/Zeit des letzten Dateizugriffs *)
  128.     stMtime   : timeT; (* Datum/Zeit der letzten Dateiveraenderung *)
  129.     stCtime   : timeT; (* Datum/Zeit der letzten INODE-Aenderung *)
  130.   END;
  131.  
  132. (*======================= "access()" ========================================*)
  133.  
  134. TYPE
  135. #if reverse_set
  136.   AccessModes = (
  137.     Access15,Access14,Access13,Access12,Access11, (* --> keine 8-Bit-Menge *)
  138.     Access10,Access9, Access8, Access7,
  139.     Access6, Access5, Access4, Access3,
  140.     rOK,        (* = 0004H, Leseberechtigung *)
  141.     wOK,        (* = 0002H, Schreibberechtigung *)
  142.     xOK         (* = 0001H, Ausfuehr/Suchberechtigung *)
  143.   );
  144. #else
  145.   AccessModes = (
  146.     xOK,        (* = 0001H, Ausfuehr/Suchberechtigung *)
  147.     wOK,        (* = 0002H, Schreibberechtigung *)
  148.     rOK,        (* = 0004H, Leseberechtigung *)
  149.     Access3, Access4, Access5, Access6,
  150.     Access7, Access8, Access9, Access10,
  151.     Access11,Access12,Access13,Access14,Access15  (* --> Keine 8-Bit-Menge *)
  152.   );
  153. #endif
  154.  
  155.   AccessMode = PACKEDSET OF AccessModes;
  156.  
  157. CONST
  158.   fOK = AccessMode{}; (* = 0000H, Existenz *)
  159.  
  160.  
  161. (*======================= "utime()" =========================================*)
  162.  
  163. TYPE
  164.   UTimBuf = RECORD
  165.     actime  : timeT;
  166.     modtime : timeT;
  167.   END;
  168.  
  169.   UTimPtr = POINTER TO UTimBuf;
  170.  
  171. (*======================= "open()" ==========================================*)
  172.  
  173. TYPE
  174. #if reverse_set
  175.   OpenModes = (
  176.     Open15, Open14, Open13,
  177.     oNOCTTY,    (* Falls die zu oeffnende Datei ein (Pseudo)Terminal ist,
  178.                    wird es nicht zum Kontroll-Terminal, wenn der Prozess
  179.                    im Moment kein Kontrollterminal hat. *)
  180.     oEXCL,      (* Neu Anlegen nicht erlaubt, falls schon vorhanden *)
  181.     oTRUNC,     (* Vorhandene Datei auf Laenge 0 kuerzen *)
  182.     oCREAT,     (* Datei anlegen, falls nicht vorhanden *)
  183.     oNONBLOCK,  (* Nicht blockieren beim Lesen/Schreiben/Oeffnen *)
  184.     Open7, Open6, Open5, Open4,
  185.     oAPPEND,    (* Schreiben immer ans Ende des Files *)
  186.     Open2,
  187.     rw1,
  188.     rw0
  189.   );
  190. #else
  191.   OpenModes = (
  192.     rw0,
  193.     rw1,
  194.     Open2,
  195.     oAPPEND,    (* Schreiben immer ans Ende des Files *)
  196.     Open4, Open5, Open6, Open7,
  197.     oNONBLOCK,  (* Nicht blockieren beim Lesen/Schreiben/Oeffnen *)
  198.     oCREAT,     (* Datei anlegen, falls nicht vorhanden *)
  199.     oTRUNC,     (* Vorhandene Datei auf Laenge 0 kuerzen *)
  200.     oEXCL,      (* Neu Anlegen nicht erlaubt, falls schon vorhanden *)
  201.     oNOCTTY,    (* Falls die zu oeffnende Datei ein (Pseudo)Terminal ist,
  202.                    wird es nicht zum Kontroll-Terminal, wenn der Prozess
  203.                    im Moment kein Kontrollterminal hat. *)
  204.     Open13, Open14, Open15
  205.   );
  206. #endif
  207.  
  208.   OpenMode = PACKEDSET OF OpenModes;
  209.  
  210. CONST
  211.   oACCMODE = OpenMode{rw0, rw1}; (* Maske fuer erlaubte Operationen *)
  212.  
  213.   oRDONLY  = OpenMode{ };   (* 0000H, Nur Lesen erlaubt *)
  214.   oWRONLY  = OpenMode{rw0}; (* 0001H, Nur Schreiben erlaubt *)
  215.   oRDWR    = OpenMode{rw1}; (* 0002H, Lesen und Schreiben erlaubt *)
  216.  
  217. (*======================= "lseek()" =========================================*)
  218.  
  219. TYPE
  220.   SeekMode = (
  221.     SeekSet, (* = 0, Absolute Positionsangabe *)
  222.     SeekCur, (* = 1, Positionsangabe relativ zur augenblicklichen Position *)
  223.     SeekEnd  (* = 2, Positionsangabe relativ zum Dateiende *)
  224.   );
  225.  
  226. (*======================== "fcntl()" ========================================*)
  227.  
  228. TYPE
  229. #if reverse_set
  230.   FDFlags = (
  231.     FD15, FD14, FD13, FD12, FD11, FD10, FD9,
  232.     FD8,  FD7,  FD6,  FD5,  FD4,  FD3,  FD2, FD1,
  233.     FdCloExec  (* Bei "exec*()" Dateikennung schliessen *)
  234.   );
  235. #else
  236.   FDFlags = (
  237.     FdCloExec, (* Bei "exec*()" Dateikennung schliessen *)
  238.     FD1,  FD2,  FD3,  FD4,  FD5,  FD6,  FD7, FD8,
  239.     FD9,  FD10, FD11, FD12, FD13, FD14, FD15
  240.   );
  241. #endif
  242.   FDFlag = PACKEDSET OF FDFlags;
  243.  
  244. TYPE
  245.   FcntlCmd = (
  246.     fDUPFD, (* Neue Dateikennung liefern (-> "dup()") *)
  247.     fGETFD, (* Flags der Dateikennung ermitteln (-> FDFlags) *)
  248.     fSETFD, (* Flags der Dateikennung setzen (-> FDFlags ) *)
  249.     fGETFL, (* Flags des Dateibeschreibungsblocks liefern *)
  250.     fSETFL, (* Flags des Beschreibungsblocks setzen,ausser Lese/Schreibmodus *)
  251.     fGETLK, (* Informationen ueber einen ``Lock'' liefern *)
  252.     fSETLK, (* ``Lock'' setzen, sofort zurueck, falls nicht moeglich *)
  253.     fSETLKW (* ``Lock'' setzen, blockieren, bis moeglich *)
  254.   );
  255.  
  256. TYPE
  257.   LockType = (
  258.     fRDLCK, (* (set) read/shared lock *)
  259.     fWRLCK, (* (set) write/exclusive lock *)
  260.     fUNLCK  (* unlock/unlocked *)
  261.   );
  262.  
  263. TYPE
  264.   FlockRec = RECORD
  265.     lType   : LockType; (* Typ des ``Locks'' *)
  266.     lWhence : SeekMode; (* Offset, von dem 'lStart' gerechnet wird *)
  267.     lStart  : offT;     (* Start des ``Locks'' *)
  268.     lLen    : offT;     (* Groesse des ``Locks'' (0 = bis zum Dateiende) *)
  269.     lPid    : pidT;     (* Prozess-Kennung des ``Lock-Besitzers'' *)
  270.   END;
  271.  
  272. TYPE
  273.   FcntlArg = RECORD
  274.     CASE TAG_COLON FcntlCmd OF
  275.       fDUPFD  : handle  : int;      (* in & out *)
  276.      |fGETFD,                       (* out *)
  277.       fSETFD  : fdflags : FDFlag;   (* in *)
  278.      |fGETFL,                       (* out *)
  279.       fSETFL  : mode    : OpenMode; (* in *)
  280.      |fGETLK,                       (* in & out *)
  281.       fSETLK,                       (* in & out *)
  282.       fSETLKW : flock   : FlockRec; (* in & out *)
  283.     END;
  284.   END;
  285.  
  286. (*======================= "pipe()" ==========================================*)
  287.  
  288. TYPE
  289.   PipeBuf = RECORD
  290.     readh  : int;
  291.     writeh : int;
  292.   END;
  293.  
  294. (*===================== "open()", "creat()" =================================*)
  295.  
  296. CONST (* Kleinstes gueltiges Handle, nicht POSIX: *)
  297. #ifdef __GEMDOS__
  298.   MINHANDLE = -5; (* Wegen MIDI-in/out *)
  299. #else
  300.   MINHANDLE = 0;
  301. #endif
  302.  
  303. (*===========================================================================*)
  304.  
  305. CONST (* Die immer geoeffneten Standardkanaele *)
  306.   StdinFileNo  = 0;
  307.   StdoutFileNo = 1;
  308.   StderrFileNo = 2; (* "GEMDOS": Durch 'DosSupport' sichergestellt *)
  309.  
  310. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  311.  
  312.  PROCEDURE creat ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  313.                   (* EIN/ -- *)     mode : modeT         ): int;
  314.  
  315.  PROCEDURE open ((* EIN/ -- *) REF file   : ARRAY OF CHAR;
  316.                  (* EIN/ -- *)     access : OpenMode;
  317.                  (* EIN/ -- *)     mode   : modeT         ): int;
  318.  
  319. (*--------------------------------------------------------------------------
  320.  | "open()" oeffnet eine bereits vorhandene Datei namens <file> in dem durch|
  321.  | <access> festgelegten Modus (Funktionalitaet siehe Def. von 'OpenModes'),|
  322.  | bzw. erzeugt eine neue mit den Attributen aus <mode>, falls in <access>  |
  323.  | 'oCREAT' gesetzt ist. Die Datei ist ueber die als Funktionswert zurueck- |
  324.  | gelieferte Kennung referenzierbar. Es wird die kleinste Kennung gelie-   |
  325.  | fert, die frei ist.                                                      |
  326.  | "creat()" entspricht: "open(file,oWRONLY+OpenMode{oCREAT,oTRUNC},mode)"  |
  327.  |                                                                          |
  328.  | Oeffnen einer Datei bedeutet folgendes: Es wird ein Dateibeschreibungs-  |
  329.  | block fuer die Datei <file> angelegt, und eine Kennung geliefert, ueber  |
  330.  | die dieser Block angesprochen werden kann. Die gleiche Datei kann mehr-  |
  331.  | fach geoeffnet sein und damit mehrere Dateibeschreibungsbloecke besitzen.|
  332.  | Jeder Beschreibungsblock kann wiederum mehrere Dateikennungen erhalten.  |
  333.  | Die Statusflags und der Zugriffsmodus aus <access> sind Attribute des    |
  334.  | Beschreibungsblocks, ebenso wie die Position des Lese/Schreibzeigers. Die|
  335.  | Statusflags koennen mit "fcntl(fGETFL/fSETFL)" abgefragt und veraendert  |
  336.  | (ausser dem Zugriffsmodus) werden, der Lese/Schreibzeiger wird durch     |
  337.  | "read()", "write()" und "lseek()" veraendert. Eine neue Kennung fuer     |
  338.  | denselben Beschreibungsblock kann mit "dup()" oder "fcntl(fDUPFD)"       |
  339.  | erzeugt werden. Mit "dup2()" laesst sich eine Dateikennung auf einen     |
  340.  | anderen Beschreibungsblock umleiten.                                     |
  341.  | Mit "fcntl(fGETFD/fSETFD)" laesst sich das ``Schliessen bei exec''-Flag  |
  342.  | abfragen und setzen, das ein Attribut der Dateikennung ist; dieses Flag  |
  343.  | ist nach dem Oeffnen einer Datei geloescht. Nur falls eine neue Datei    |
  344.  | angelegt wird, wird <mode> verwendet, das ein Attribut der Datei ist.    |
  345.  |                                                                          |
  346.  | GEMDOS: <access>: oNOCTTY und oNONBLOCK und oAPPEND werden ignoriert.    |
  347.  |         <mode>: Die Datei kann lediglich schreibgeschuetzt werden.       |
  348.  |         Die kleinste Kennung fuer eine normale Datei ist 6.              |
  349.  |         Eine Datei kann nur zum Lesen mehrfach geoeffnet werden.         |
  350.  |   MiNT: oNOCTTY und oAPPEND werden unterstuetzt, fuer oNONBLOCK wird     |
  351.  |         oNDELAY verwendet. Die Unterstuetzung von <mode> haengt vom      |
  352.  |         Dateisystem ab.                                                  |
  353.  |                                                                          |
  354.  | Es koennen auch Geraete geoeffnet werden, sodass auch negative Werte     |
  355.  | auftreten koennen. Ein Fehler ist erst aufgetreten, falls der Funktions- |
  356.  | wert 'MINHANDLE' unterschreitet.                                         |
  357.   --------------------------------------------------------------------------*)
  358.  
  359.  
  360.  PROCEDURE fcntl ((* EIN/ -- *)     h   : int;
  361.                   (* EIN/ -- *)     cmd : FcntlCmd;
  362.                   (* EIN/AUS *) VAR arg : FcntlArg ): int;
  363.  
  364. (*--------------------------------------------------------------------------
  365.  | Fuehrt je nach <cmd> eine Funktion auf der ueber <h> erreichbaren Datei  |
  366.  | aus. Argumente und Ergebnisse werden ueber <arg> mitgeteilt:             |
  367.  |                                                                          |
  368.  |  cmd = fDUPFD : zweite Dateikennung zu <h> liefern ( -> "dup()").        |
  369.  |    arg.handle:                                                           |
  370.  |      Eingabe: kleinster Wert fuer neue Kennung                           |
  371.  |      Ausgabe: neue Kennung                                               |
  372.  |                                                                          |
  373.  |  cmd = fGETFD : Flags der Dateikennung ermitteln (Dateikennung schliessen|
  374.  |                 bei Ausfuehren von ``exec'').                            |
  375.  |    arg.fdflags:                                                          |
  376.  |      Eingabe: --------                                                   |
  377.  |      Ausgabe: Flags                                                      |
  378.  |                                                                          |
  379.  |  cmd = fSETFD : Flags der Dateikennung setzen.                           |
  380.  |    arg.fdflags:                                                          |
  381.  |      Eingabe: Flags                                                      |
  382.  |      Ausgabe: --------                                                   |
  383.  |                                                                          |
  384.  |  cmd = fGETFL : Flags des Dateibeschreibungsblocks liefern.              |
  385.  |    arg.mode:                                                             |
  386.  |      Eingabe: --------                                                   |
  387.  |      Ausgabe: Modus-Flags                                                |
  388.  |                                                                          |
  389.  |  cmd = fSETFL : Flags des Dateibeschreibungsblocks setzen, bis auf den   |
  390.  |                 Lese/Schreibmodus, der nicht veraendert werden kann.     |
  391.  |    arg.mode:                                                             |
  392.  |      Eingabe: Modus-Flags                                                |
  393.  |      Ausgabe: --------                                                   |
  394.  |                                                                          |
  395.  |  cmd = fGETLK : Liefert Informationen, ob ein bestimmter Bereich der     |
  396.  |                 Datei fuer konkurrierenden Zugriff gesperrt ist.         |
  397.  |    arg.flock:                                                            |
  398.  |      Eingabe: Typ, Position und Laenge des in Frage kommenden ``Locks''. |
  399.  |      Ausgabe: Typ, Position und Laenge eines ``Locks'', der sich         |
  400.  |               (teilweise) mit dem angegeben Bereich ueberschneidet, oder |
  401.  |               Information, dass der Bereich frei ist ('lType' = fUNLCK). |
  402.  |                                                                          |
  403.  |  cmd = fSETLK                                                            |
  404.  |    arg.flock:                                                            |
  405.  |      Eingabe:                                                            |
  406.  |      Ausgabe:                                                            |
  407.  |                                                                          |
  408.  |  cmd = fSETLKW : wie 'fSETLK', aber warten, bis ``Lock'' gesetzt werden  |
  409.  |                  kann.                                                   |
  410.  |                                                                          |
  411.  |                                                                          |
  412.  | GEMDOS: Bisher wird nur 'fDUPFD' unterstuetzt. Falls der GEMDOS-Aufruf   |
  413.  |         "Flock()" existiert, wird auch 'fSETLK' (teilweise) unterstützt. |
  414.  |   MiNT: Die Unterstuetzung von ``Locks'' haengt vom Dateisystem ab.      |
  415.  |         Bei 'fGETFL'/'fSETFL' wird fuer 'oNONBLOCK' 'oNDELAY' verwendet. |
  416.   --------------------------------------------------------------------------*)
  417.  
  418.  
  419.  
  420.  
  421.  PROCEDURE close ((* EIN/ -- *) h : int ): int;
  422.  
  423. (*--------------------------------------------------------------------------
  424.  | Die Datei mit der Kennung <h> wird geschlossen. Danach kann nicht mehr   |
  425.  | ueber <h> auf die Datei zugegriffen werden. Die Kennung <h> ist jetzt    |
  426.  | ``frei'', sodass sie wieder mit einer anderen Datei verbunden werden     |
  427.  | kann.                                                                    |
  428.  |                                                                          |
  429.  | GEMDOS: Keine Besonderheiten.                                            |
  430.  |   MiNT: -""-                                                             |
  431.   --------------------------------------------------------------------------*)
  432.  
  433.  
  434.  
  435.  PROCEDURE read ((* EIN/ -- *) h   : int;
  436.                  (* EIN/ -- *) buf : ADDRESS;
  437.                  (* EIN/ -- *) len : sizeT   ): ssizeT;
  438.  
  439.  PROCEDURE write ((* EIN/ -- *) h   : int;
  440.                   (* EIN/ -- *) buf : ADDRESS;
  441.                   (* EIN/ -- *) len : sizeT   ): ssizeT;
  442.  
  443. (*--------------------------------------------------------------------------
  444.  | "read()" liest <len> Bytes aus der Datei mit der Kennung <h> in den Puf- |
  445.  | fer ab der Adresse <buf>. Als Funktionswert wird die Anzahl der gelesenen|
  446.  | Bytes zurueckgeliefert (0 = Dateiende, -1 = Fehler).                     |
  447.  | "write()" schreibt <len> Bytes aus dem Puffer mit der Startadresse <buf> |
  448.  | in die Datei mit der Kennung <h>. Als Funktionswert wird die Anzahl der  |
  449.  | geschriebenen Bytes zurueckgeliefert (<> len = Fehler).                  |
  450.  | Aus Portabilitaetsgruenden ('ssizeT' = 16 Bit ist moeglich) sollte <len> |
  451.  | nicht groesser als 32767 sein.                                           |
  452.  |                                                                          |
  453.  | GEMDOS: Das Lesen/Schreiben von/auf Terminals kann nicht beeinflusst     |
  454.  |         werden (Interpretation von ^C u.ae.).                            |
  455.  |   MiNT: Keine Besonderheiten.                                            |
  456.   --------------------------------------------------------------------------*)
  457.  
  458.  
  459.  PROCEDURE lseek ((* EIN/ -- *) h    : int;
  460.                   (* EIN/ -- *) off  : offT;
  461.                   (* EIN/ -- *) mode : SeekMode ): offT;
  462.  
  463. (*--------------------------------------------------------------------------
  464.  | Die aktuelle Lese/Schreibposition der Datei mit der Kennung <h> wird, je |
  465.  | nach <mode>, Beschreibung siehe dort, um <off> Bytes verschoben, bzw.    |
  466.  | auf Position <off> gesetzt. Hierbei kann auch ueber das Ende der Datei   |
  467.  | positioniert werden, die Datei wird aber erst dann (virtuell) verlaengert|
  468.  | (-> ``gap'') wenn ein Schreibvorgang hinter dem tatsaechlichen bisherigen|
  469.  | Dateiende stattfindet.                                                   |
  470.  | Als Funktionswert wird die aktuelle Schreib/Leseposition geliefert.      |
  471.  |                                                                          |
  472.  | GEMDOS: Es ist kein Verlaengern der Datei durch ein "Fseek" hinter das   |
  473.  |         augenblickliche Dateiende moeglich, daher wird bei "lseek" das   |
  474.  |         Verlaengern durch blockweises (jeweils 1kB) Schreiben mit Null-  |
  475.  |         bytes realisiert; das kann natuerlich je nach Umfang der Erwei-  |
  476.  |         terung ein bisschen dauern.                                      |
  477.  |   MiNT: Unterstuetzung der Dateiverlaengerung haengt vom Dateisystem ab. |
  478.   --------------------------------------------------------------------------*)
  479.  
  480.  
  481. (* Noch nicht POSIX: *)
  482.  PROCEDURE ftruncate ((* EIN/ -- *) h   : int;
  483.                       (* EIN/ -- *) len : offT ): int;
  484.  
  485. (*--------------------------------------------------------------------------
  486.  | Wenn <h> eine geoffnete regulaere Datei kennzeichnet, die groesser als   |
  487.  | <len> Bytes ist, wird die Datei auf <len> Bytes gekuerzt. Wenn die Datei |
  488.  | kuerzer als <len> ist, ist das Verhalten systemspezifisch.               |
  489.  |                                                                          |
  490.  | GEMDOS: Liefert immer -1 (errno = 'ENOSYS').                             |
  491.  |   MiNT: Unterstuetzung haengt vom Dateisystem ab.                        |
  492.   --------------------------------------------------------------------------*)
  493.  
  494.  
  495.  
  496.  PROCEDURE dup ((* EIN/ -- *) h : int ): int;
  497.  
  498.  PROCEDURE dup2 ((* EIN/ -- *) oldh : int;
  499.                  (* EIN/ -- *) newh : int ): int;
  500.  
  501. (*--------------------------------------------------------------------------
  502.  | "dup()" liefert zur Dateikennung <h> eine zweite Kennung (die kleinste   |
  503.  | freie Kennung), sodass die entsprechende Datei ueber beide Kennungen an- |
  504.  | gesprochen werden kann. Das 'FdCloExec'-Flag der Dateikennung ist ge-    |
  505.  | loescht.                                                                 |
  506.  | Bei "dup2()" kann die neue Kennung (<newh>) vorgegeben werden; wenn      |
  507.  | <newh> nicht frei ist, wird die entsprechende Datei zuerst geschlossen.  |
  508.  | Falls <newh> gleich <oldh> ist, wird nichts getan.                       |
  509.  | Als Funktionswert wird <newh> zurueckgeliefert.                          |
  510.  |                                                                          |
  511.  | GEMDOS: Hier funktionieren die Umlenkungen erst ab TOS 1.04 einiger-     |
  512.  |         massen, aber auch nicht voellig korrekt (z.B. keine mehrfache    |
  513.  |         Umlenkung, kein Pexec nach "dup()").                             |
  514.  |         "dup()" : <h> muss die Nummer eines Standardkanals sein, also    |
  515.  |         0 <= h <= 5. Die kleinstmoegliche neue Kennung ist 6.            |
  516.  |         "dup2()": <newh> muss die Nummer eines Standardkanals sein, also |
  517.  |         0 <= <newh> <= 5; weiterhin muss <oldh> ein Nicht-Standard-Handle|
  518.  |         (normales Datei- oder Geraetehandle) sein.                       |
  519.  |   MiNT: Keine Besonderheiten.                                            |
  520.   --------------------------------------------------------------------------*)
  521.  
  522.  
  523.  
  524.  PROCEDURE umask ((* EIN/ -- *) excl : modeT ): modeT;
  525.  
  526. (*--------------------------------------------------------------------------
  527.  | Setzt die Dateierstellungsmaske, die als Filter fuer die Zugriffsberech- |
  528.  | tigung benutzt wird, wenn eine Datei mit "open()" oder "creat()" neu     |
  529.  | erstellt, oder ein Verzeichnis mit "mkdir()" angelegt wird: Von der ange-|
  530.  | gebenen Zugriffsberechtigung wird immer zuerst die Maske subtrahiert,    |
  531.  | sodass Dateien z.B. grundsaetzlich fuer Gruppe und andere schreibge-     |
  532.  | schuetzt werden koennen.                                                 |
  533.  | Als Funktionswert wird die alte Maske zurueckgeliefert.                  |
  534.  |                                                                          |
  535.  | GEMDOS: Keine Besonderheiten, aber nicht sonderlich sinnvoll.            |
  536.  |   MiNT: Keine Besonderheiten.                                            |
  537.   --------------------------------------------------------------------------*)
  538.  
  539.  
  540.  PROCEDURE chmod ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  541.                   (* EIN/ -- *)     mode : modeT         ): int;
  542.  
  543. (*--------------------------------------------------------------------------
  544.  | Setzt die Schreib-, Lese- und Ausfuehrungsrechte und die ``set user id'' |
  545.  | und ``set group id'' Flags der Datei <file>.                             |
  546.  |                                                                          |
  547.  | GEMDOS: Es wird nur sIWUSR ausgewertet: wenn das Bit gesetzt ist, wird   |
  548.  |         'faRDONLY' im Dateiattribut geloescht und umgekehrt.             |
  549.  |         Das Dateiattribut 'faCHANGED' wird nicht geaendert. Attribute    |
  550.  |         von Verzeichnissen koennen nicht geaendert werden (ist aber kein |
  551.  |         Fehler).                                                         |
  552.  |   MiNT: Unterstuetzung haengt vom Dateisystem ab.                        |
  553.   --------------------------------------------------------------------------*)
  554.  
  555.  
  556.  PROCEDURE chown ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  557.                   (* EIN/ -- *)     uid  : uidT;
  558.                   (* EIN/ -- *)     gid  : gidT          ): int;
  559.  
  560. (*--------------------------------------------------------------------------
  561.  | Setzt die Besitzer- und Gruppenkennung der Datei <file>.                 |
  562.  |                                                                          |
  563.  | GEMDOS: Falls <uid> und <gid> ungleich Null sind, wird -1 geliefert      |
  564.  |         (errno = 'EINVAL').                                              |
  565.  |   MiNT: Unterstuetzung haengt vom Dateisystem ab.                        |
  566.   --------------------------------------------------------------------------*)
  567.  
  568.  
  569.  PROCEDURE utime ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  570.                   (* EIN/ -- *)     time : UTimPtr       ): int;
  571.  
  572. (*--------------------------------------------------------------------------
  573.  | Setzt die Zeit des letzten Dateizugriffs (st.stAtime) der Datei <file>   |
  574.  | auf <time^.actime> und die Zeit der letzten Dateiveraenderung(st.stMtime)|
  575.  | auf <time^.modtime>. Die Zeit der letzten Statusaenderung (st.stCtime)   |
  576.  | wird automatisch auf das aktuelle Datum gesetzt. Ist <time> gleich NULL, |
  577.  | wird das aktuelle Datum eingesetzt.                                      |
  578.  |                                                                          |
  579.  | GEMDOS: Es wird nur <time^.modtime> ausgewertet. Verzeichnisse koennen   |
  580.  |         nicht beruecksichtigt werden, es wird aber kein Fehler gemeldet. |
  581.  |   MiNT: Bei geeignetem Dateisystem werden 'modtime' und 'actime' ausge-  |
  582.  |         wertet. Falls moeglich werden auch Verzeichnisse beruecksichtigt.|
  583.   --------------------------------------------------------------------------*)
  584.  
  585.  
  586.  PROCEDURE stat ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  587.                  (* -- /AUS *) VAR st   : StatRec       ): int;
  588.  
  589.  PROCEDURE fstat ((* EIN/ -- *)     hndl : int;
  590.                   (* -- /AUS *) VAR st   : StatRec ): int;
  591.  
  592. (* Noch nicht POSIX: *)
  593.  PROCEDURE lstat ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  594.                   (* -- /AUS *) VAR st   : StatRec       ): int;
  595.  
  596. (*--------------------------------------------------------------------------
  597.  | Die Prozeduren liefern zum Namen <file> einer Datei bzw. einer Datei-    |
  598.  | kennung <hndl> die Informationen aus dem INODE (siehe Def. von 'modeT'   |
  599.  | und 'StatRec'.                                                           |
  600.  | Bei einem 'Symbolischen Link' liefert "stat()" Informationen ueber die   |
  601.  | physikalisch referenzierte Datei, "lstat()" Informationen ueber den Link |
  602.  | selber, ansonsten sind die beiden Funktionen identisch.                  |
  603.  |                                                                          |
  604.  | GEMDOS:                                                                  |
  605.  |          o 'stMode': Die Berechtigungen fuer Besitzer, Gruppe und Andere |
  606.  |            sind identisch; Leseberechtigung ist immer gegeben, Schreib-  |
  607.  |            berechtigung ist vorhanden, falls 'faRDONLY' im Dateiattribut |
  608.  |            nicht gesetzt ist, die Ausfuehrberechtigung bei regulaeren    |
  609.  |            Dateien wird mit 'DosSupport.IsExec' festgestellt, Verzeich-  |
  610.  |            nisse haben immer Suchberechtigung. Geraete werden mit        |
  611.  |            'DosSupport.IsDosDevice' ermittelt, Verzeichnisse durch ein   |
  612.  |            gesetztes 'faSUBDIR' im Dateiattribut, alles andere sind      |
  613.  |            regulaere Dateien.                                            |
  614.  |          o 'stIno': ein fortlaufender Wert, der keine Beziehung zur Datei|
  615.  |            hat.                                                          |
  616.  |          o 'stDev': die (aktuelle) Laufwerksnummer (A = 0, B = 1...).    |
  617.  |          o 'stNlink': bei Verzeichnissen zwei (wegen ".."), sonst eins.  |
  618.  |          o 'stSize': bei Verzeichnissen konstant 1024.                   |
  619.  |          o 'stAtime', 'stMtime', 'stCtime': die Zeiten sind identisch.   |
  620.  |            Bei Geraeten werden aktuelle Zeit und aktuelles Datum genommen|
  621.  |            Bei Wurzelverzeichnissen ist der Wert Null.                   |
  622.  |                                                                          |
  623.  |          "lstat()": ohne MiNT ist diese Funktion mit "stat()" identisch. |
  624.  |          Diese Funktion ist noch nicht POSIX-Standard.                   |
  625.  |                                                                          |
  626.  |          "fstat()": ohne MiNT sind die einzigen zuverlaessigen Informa-  |
  627.  |          tionen 'stSize' und 'stMtime', falls <hndl> eine gueltige Ken-  |
  628.  |          nung einer regulaeren Datei ist.                                |
  629.  |                                                                          |
  630.  |   MiNT: Unterstuetzung haengt vom Dateisystem ab.                        |
  631.   --------------------------------------------------------------------------*)
  632.  
  633.  PROCEDURE sISCHR  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  634.  PROCEDURE sISDIR  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  635.  PROCEDURE sISBLK  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  636.  PROCEDURE sISREG  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  637.  PROCEDURE sISFIFO ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  638.  (* Noch nicht POSIX: *)
  639.  PROCEDURE sISLNK  ((* EIN/ -- *) stMode : modeT ): BOOLEAN;
  640.  
  641. (*--------------------------------------------------------------------------
  642.  | Diese Funktionen sind bei POSIX als Makros definiert, und liefern TRUE,  |
  643.  | falls der im 'stMode'-Feld der StatRec-Struktur kodierte Dateityp dem    |
  644.  | durch den Prozedurnamen angedeuteten entspricht.                         |
  645.  | Es sollten nur diese Prozeduren verwendet werden, um den Dateityp zu     |
  646.  | bestimmen.                                                               |
  647.  |                                                                          |
  648.  | GEMDOS: Keine Besonderheiten.                                            |
  649.  |   MiNT: -""-                                                             |
  650.   --------------------------------------------------------------------------*)
  651.  
  652.  
  653.  
  654.  PROCEDURE access ((* EIN/ -- *) REF file : ARRAY OF CHAR;
  655.                    (* EIN/ -- *)     acc  : AccessMode    ): int;
  656.  
  657. (*--------------------------------------------------------------------------
  658.  | Es wird die Existenz (<acc> = fOK) oder die Lese-, Schreib oder Ausfuehr-|
  659.  | bzw. Suchberechtigung einer Datei getestet. Beim Test wird beruecksich-  |
  660.  | tigt, ob der ausfuehrende Prozess der Besitzer der Datei ist, der Gruppe |
  661.  | des Besitzers angehoert oder ein Aussenstehender ist (Es werden die      |
  662.  | realen Kennungen getestet). Es ist nicht festgelegt, ob der ``Superuser''|
  663.  | besondere Rechte hat, d.h. alle Zugriffsrechte besitzt.                  |
  664.  |                                                                          |
  665.  | GEMDOS: Die bei "stat()" genannten Einschraenkungen gelten.              |
  666.  |   MiNT: -""-                                                             |
  667.   --------------------------------------------------------------------------*)
  668.  
  669.  
  670.  PROCEDURE pipe ((* -- /AUS *) VAR ph : PipeBuf ): int;
  671.  
  672. (*--------------------------------------------------------------------------
  673.  | Generiert einen Kommunikationskanal zwischen zwei (Unter)Prozessen. Der  |
  674.  | eine Prozess kann ueber <ph.writeh> etwas schreiben, das der andere      |
  675.  | ueber <ph.readh> lesen kann. Die Groesse einer ``Pipe'' ist intern be-   |
  676.  | grenzt (z.B. auf 2kB oder 4kB), sodass der schreibende Prozess zeitweise |
  677.  | gestoppt werden kann, bis wieder etwas Platz in der Pipe vorhanden ist.  |
  678.  |                                                                          |
  679.  | GEMDOS: Liefert immer -1 (errno = 'ENOSYS').                             |
  680.  |   MiNT: Keine Besonderheiten.                                            |
  681.   --------------------------------------------------------------------------*)
  682.  
  683. END file.
  684.