Topic : TOS - das Betriebssystem Author : Version : tos.hyp (5. März 2013) Subject : Programmieren/Atari Nodes : 3001 Index Size : 93602 HCP-Version : 5 Compiled on : Atari @charset : atarist @lang : @default : Titel @help : @options : +g -i -s +x +zz -t4 @width : 70 View Ref-File11.21.2.18 xfs_fopen TOS Name: »xfs_fopen« - öffnet oder erstellt eine Datei. Parameter: a0 = DD * a1 = char *name (ohne Pfad) d0 = int omode (fürs Öffnen) d1 = int attrib (fürs Erstellen) -> d0 = FD * oder Fehlercode -> a0 = SYMLINK * Beschreibung: Wird für die Funktionen Fopen und Fcreate verwendet. Der Open-Modus ist im niederwertigen Byte anders als in MiNT, weil die MiNT-Modi für die Implementierung der Abfragen ungünstig sind. Beim Aufrufen von Fopen über Trap #1 werden die MiNT-Modi vom Kernel in die internen Modi konvertiert. Hier die internen Modi, die vom XFS- Treiber bearbeitet werden müssen (NOINHERIT wird nicht unterstützt, weil nach TOS-Konvention nur die Handles 0..5 vererbt werden). Ansonsten entspricht das HiByte den MiNT-Konventionen: OM_RPERM EQU 1 // Datei ist zum Lesen geöffnet OM_WPERM EQU 2 // Datei ist zum Schreiben geöffnet OM_EXEC EQU 4 // Datei ist zum Ausführen geöffnet OM_APPEND EQU 8 // Schreibzugriffe ans Ende (Kernel!) OM_RDENY EQU 16 // andere dürfen nicht gleichz. lesen OM_WDENY EQU 32 // "" "" nicht gleichz. schreiben OM_NOCHECK EQU 64 // KEINE Überprüfung durch den Kernel Das Bit OM_APPEND wird vom Kernel bei Aufruf von Fwrite() automatisch beachtet, der Kernel führt vor jedem Schreibzugriff ein Fseek() aus. OM_NOCHECK wird vom Kernel gesetzt, wenn eine Datei als Device, d.h. als Handle -1,-2,-3 oder -4 geöffnet bzw. auf ein solches Handle umgelenkt (Fforce) wird. Ist dieses Bit gesetzt, sollte das XFS keine Prüfung auf mehrfaches Öffnen der Datei machen (siehe auch unten bei fd_mode), sondern dies dem Gerätetreiber überlassen. Hier die Bits, die wie im MiNT verwendet werden: O_CREAT EQU $200 // Datei erstellen, falls nicht existiert O_TRUNC EQU $400 // Datei leeren, falls existiert O_EXCL EQU $800 // nicht öffnen, falls existiert Der Kernel führt Fcreate aus als Fopen (O_CREAT +O_RDWR + O_TRUNC). O_COMPAT (d.h. nur der TOS-Modus 0,1 oder 2 angegeben, ist in MagiC immer gleichbedeutend mit O_WDENY. Die Überprüfung der Zugriffsrechte obliegt vollständig dem XFS, der Kernel tut nichts. Das wäre auch wenig sinnvoll, da jedes Dateisystem seine eigenen Mechanismen und Rechte hat. Zurückgegeben wird dem Kernel ein Zeiger auf einen geöffneten FD, d.h. das Öffnen des Dateitreibers muß vom XFS durchgeführt werden. Der Referenzzähler des zurückgegebenen FDs ist vom XFS zu erhöhen bzw. beim ersten Öffnen auf 1 zu initialisieren. Für symbolische Links und Diskwechsel gilt dasselbe wie bei xfs_sfirst. Fopen wird unter MiNT folgendermaßen zurückgeführt: 1. per <lookup> Konvertierung pathname->fcookie 2. per <getxattr> Ermittlung der Zugriffsrechte 3. Test der Zugriffsrechte durch den Kernel 4. per <getdev> Ermittlung des Dateitreibers 5. per <getdev->open> Öffnen der Datei Dieses Verfahren ist sehr langwierig. DOS gibt beim Suchen der Datei bereits einen Zeiger auf den 32-Byte- Verzeichniseintrag zurück, der direkt zum Überprüfen des Attributs und damit der Zugriffsrechte und auch zum Öffnen der Datei dient. MagiC erwartet daher direkt die Implementation des Fopen-Befehls mit allen Überprüfungen der Zugriffsrechte. Zurückgeliefert wird eine FD-Struktur, in die der Dateitreiber eingetragen und geöffnet wurde. Gruppe: Aufbau eines XFS Querverweis: XFS-Konzept in MagiC