/* Adressierungs-Typen */ #define CDROM_LBA 0x01 #define CDROM_MSF 0x02 /* SUB-Q Kontroll-Bits */ #define CDROM_AUDIO_EMPHASIS 0x01 #define CDROM_COPY_PERMITTED 0x02 #define CDROM_DATA_TRACK 0x04 #define CDROM_FOUR_CHANNEL 0x08 /* The leadout track is always 0xAA, regardless of # of tracks on disc */ #define CDROM_LEADOUT 0xAA /* Rückgabewerte von READ SUBCHANNEL DATA */ /* audio status not supported */ #define CDROM_AUDIO_INVALID 0x00 /* audio play operation in progress */ #define CDROM_AUDIO_PLAY 0x11 /* audio play operation paused */ #define CDROM_AUDIO_PAUSED 0x12 /* audio play successfully completed */ #define CDROM_AUDIO_COMPLETED 0x13 /* audio play stopped due to error */ #define CDROM_AUDIO_ERROR 0x14 /* no current audio status to return */ #define CDROM_AUDIO_NO_STATUS 0x15
Querverweis: CD-ROM Opcodes für Fcntl
struct cdrom_audioctrl { /* Eingabe-Parameter */ int16_t set; /* 0 = nur nachfragen */ /* Ein-/Ausgabe-Parameter */ struct { int8_t selection; int8_t volume; } channel[4]; };
Querverweis: CD-ROM Opcodes für Fcntl
struct cdrom_mcn { int8_t mcn_audiostatus; int8_t mcn_mcn[23]; /* Media-Katalog-Nummer als ASCII-String */ };
Querverweis: CD-ROM Opcodes für Fcntl ASCII-Tabelle
struct cdrom_msf { int8_t cdmsf_min0; /* Anfangs-Minute */ int8_t cdmsf_sec0; /* Anfangs-Sekunde */ int8_t cdmsf_frame0; /* Anfangs-Frame */ int8_t cdmsf_min1; /* Ende-Minute */ int8_t cdmsf_sec1; /* Ende-Sekunde */ int8_t cdmsf_frame1; /* Ende-Frame */ };
Querverweis: CD-ROM Opcodes für Fcntl
struct cdrom_read { int32_t cdread_lba; /* Adresse */ int8_t *cdread_bufaddr; /* Zeiger auf den Puffer */ int32_t cdread_buflen; /* Länge des Puffers */ };
Querverweis: CD-ROM Opcodes für Fcntl
struct cdrom_subchnl { /* Eingabe-Parameter */ int8_t cdsc_format; /* CDROM_MSF oder CDROM_LBA */ /* Ausgabe-Parameter */ int8_t cdsc_audiostatus; unsigned cdsc_resvd: 8; /* reserviert */ unsigned cdsc_adr : 4; unsigned cdsc_ctrl : 4; int8_t cdsc_track; /* aktueller Track */ int8_t cdsc_ind; /* aktueller Index */ cd_ad cdsc_absaddr; /* absolute Adresse */ cd_ad cdsc_reladdr; /* relative Track-Adresse */ };
Querverweis: CD-ROM Opcodes für Fcntl
struct cdrom_ti { int8_t cdti_trk0; /* Start-Track */ int8_t cdti_ind0; /* Start-Index */ int8_t cdti_trk1; /* Ende-Track */ int8_t cdti_ind1; /* Ende-Index */ };
Querverweis: CD-ROM Opcodes für Fcntl
Diese Struktur ist wie folgt definiert:
struct cdrom_tisrc { /* Eingabe-Parameter */ int8_t tisrc_track; /* Track-Nummer */ /* Ausgabe-Parameter */ int8_t tisrc_audiostatus; int8_t tisrc_tisrc[23]; /* Track International Standard Recording Code als ASCII-String */ };
Querverweis: CD-ROM Opcodes für Fcntl ASCII-Tabelle
Diese Struktur ist wie folgt definiert:
struct cdrom_tocentry { /* Eingabe-Parameter */ int8_t cdte_track; /* Track-Nummer oder CDROM_LEADOUT */ int8_t cdte_format; /* CDROM_LBA oder CDROM_MSF */ /* Ausgabe-Parameter */ unsigned cdte_adr:4; /* SUBQ Channel Encodes; es gilt: 0 = keine 1 = Positions-Daten 2 = MCN 3 = ISRC (alle anderen Werte reserviert) */ unsigned cdte_ctrl:4; /* Bit-0: Audio mit Pre-Emphasis Bit-1: digitale Kopie möglich Bit-2: Daten Track Bit-3: 4-Kanal */ int8_t cdte_datamode; /* z.Zt. unbenutzt */ cd_ad dte_addr; /* Track-Start */ };
Querverweis: CD-ROM Opcodes für Fcntl
struct cdrom_tochdr { int8_t cdth_trk0; /* Start-Track */ int8_t cdth_trk1; /* Ende-Track */ };
Querverweis: CD-ROM Opcodes für Fcntl
struct cdrom_volctrl { int8_t channel0; /* Kanal-1: Lautstärke 0...255 */ int8_t channel1; /* Kanal-2: Lautstärke 0...255 */ int8_t channel2; /* Kanal-3: Lautstärke 0...255 */ int8_t channel3; /* Kanal-4: Lautstärke 0...255 */ };
Querverweis: CD-ROM Opcodes für Fcntl
Diese Union ist wie folgt definiert:
typedef union { struct { int8_t reserved; /* reserviert */ int8_t minute; /* Minute */ int8_t second; /* Sekunde */ int8_t frame; /* Frame */ } msf; int32_t lba; } cd_ad;
Querverweis: CD-ROM Opcodes für Fcntl
typedef struct { uint32_t b_free; /* Anzahl der freien Cluster */ uint32_t b_total; /* Gesamtzahl der Cluster */ uint32_t b_secsiz; /* Bytes pro Sektor */ uint32_t b_clsiz; /* Sektoren pro Cluster */ } DISKINFO;
typedef struct { uint16_t time; /* Zeit wie in Tgettime */ uint16_t date; /* Datum wie in Tgetdate */ } DOSTIME;
Die Struktur der beiden Integer-Werte gliedert sich wie folgt:
Bit | time |
0-4 | Sekunden in Zweierschritten (0-29) |
5-10 | Minuten (0-59) |
11-15 | Stunden (0-23) |
Bit | date |
0-4 | Tag im Monat (1-31) |
5-8 | Monat (1-12) |
9-15 | Jahr (0-119, 0=1980) |
typedef struct { int8_t *in_dos; /* Adresse der DOS- Semaphore */ int16_t *dos_time; /* Adresse der DOS- Zeit */ int16_t *dos_date; /* Adresse des DOS- Datums */ int32_t res1; /* */ int32_t res2; /* */ int32_t res3; /* ist 0L */ VOID *act_pd; /* Laufendes Programm */ int32_t res4; /* */ int16_t res5; /* */ VOID *res6; /* */ VOID *res7; /* interne DOS- Speicherliste */ VOID (*resv_intmem)(); /* DOS- Speicher erweitern */ int32_t (*etv_critic)(); /* etv_critic des GEMDOS */ int8_t * ((*err_to_str)(int8_t e)); /* Umrechnung Code->Klartext*/ VOID *xaes_appls; /* */ VOID *mem_root; /* */ VOID *ur_pd; /* */ } DOSVARS;
Hinweis: Diese Variablen sind READ-ONLY !
Mit Hilfe der Funktion resv_intmem läßt sich ähnlich wie mit FOLDRnnnn Speicher für die interne Speicherverwaltung reservieren. Im Gegensatz zu TOS wird diese jedoch deutlich weniger belastet, so daß ein Erweitern i.a. nicht notwendig ist. Muß der Speicher erweitert werden, was auch in ADDMEM geschieht, übergibt man der Funktion resv_intmem in Register A0 die Adresse, und in Register D0 die Länge des zu reservierenden Speicherblocks.
Der Prototyp für den Event-Critic-Handler lautet:
int32_t etv_critic (int16_t errcode, int16_t drvnr)
Man beachte, daß die Funktion die Argumente auf dem Stack erwartet, und daher in Pure-C als cdecl deklariert werden muß.
Die Funktion err_to_str erwartet in Register D0 einen TOS-Fehlercode, und gibt in den Registern D0 und A0 einen Zeiger auf die beschreibende Zeichenkette zurück. Bei einem ungültigen Fehlercode erhält man in D0 eine Null, und in A0 einen Zeiger auf die Zeichenkette 'TOS-Fehler'.
Aus der Sicht von KAOS 1.4.2 sieht die Struktur folgendermaßen aus:
typedef struct { int8_t *in_dos; /* Adresse der DOS- Semaphore */ int16_t *dos_time; /* Adresse der DOS- Zeit */ int16_t *dos_date; /* Adresse des DOS- Datums */ int32_t dos_stack; /* Stack für DOS selbst */ int32_t pgm_superset; /* Benutzerpgm.-Sup.stack */ MD *menlist[3]; /* Adresse der 3 MD-Listen */ VOID *act_pd; /* Laufendes Programm */ FCB *fcbx; /* Dateien */ int16_t fcbn; /* Länge von fcbx[] */ DMD *dmdx; /* Zeiger auf 16 DMDs */ IMB *imbx; /* interne DOS- Speicherliste */ VOID (*resv_intmem)(); /* DOS- Speicher erweitern */ int32_t (*etv_critic)(); /* etv_critic des GEMDOS */ int8_t * ((*err_to_str)(int8_t e)); /* Umrechnung Code->Klartext */ } DOSVARS;
Querverweis: AESVARS Cookie von MagiC Sconfig
Diese Struktur ist wie folgt definiert:
typedef struct { int8_t d_reserved[21]; /* für GEMDOS reserviert */ uint8_t d_attrib; /* Datei-Attribut */ uint16_t d_time; /* Uhrzeit */ uint16_t d_date; /* Datum */ uint32_t d_length; /* Dateilänge */ int8_t d_fname[14]; /* Dateiname */ } DTA;
rekursive Suche in Ordnern
In je einer DTA werden genau alle nötigen Informationen
gespeichert, die nach einem Fsfirst für weitere Fsnext benötigt
werden. Das heißt, daß auf keinen Fall erneut Fsfirst für andere
Verzeichnisse/Wildcards aufrufen sollte, solange noch weitere
Fsnext-Aufrufe in der Verzeichnis-Ebene gemachen werden.
Bei einer rekursiven Suche mußt für jedes neue Fsfirst eine
eigene DTA verwendet werden, die solange erhalten bleiben muß, bis
alle Fsnext für den Fsfirst getätigt sind. Hier ein Bsp in pseudo-C:
void durchsuche_verzeichnis (int8_t *pfadname) { DTA_Record local_dta, saved_dta; saved_dta = GetDTA (); SetDTA (local_dta); err = Fsfirst (pfadname, ...); while (err == 0) { if (local_dta.attrib == subdir) { // rekursive suche in sub-dir durchsuche_verzeichnis (subdir-pfadname); } else { ... normales file auswerten } err = Fsnext (); } SetDTA (saved_dta); }
Querverweis: Fgetdta Fsetdta Fsfirst Fsnext GEMDOS
typedef struct f_cookie { struct filesys *fs; /* Filesystem welches diesen Cookie kennt */ uint16_t dev; /* Device-Info (z.B. Rwabs Gerätenummer) */ uint16_t aux; /* weitere Daten für das Filesystem */ int32_t index; /* dient zusammen mit dev zur Identifizierung */ /* eines Files */ } fcookie;
Querverweis: FILEPTR FILESYS XFS-Konzept in MagiC
typedef struct fileptr { int16_t links; uint16_t flags; int32_t pos; int32_t devinfo; fcookie fc; struct devdrv *dev; struct fileptr *next; } FILEPTR;
struct flock { int16_t l_type; /* Art des Lockings */ int16_t l_whence; /* SEEK_SET, SEEK_CUR, SEEK_END */ int32_t l_start; /* Start des Locking-Bereiches */ int32_t l_len; /* Länge des Locking-Bereiches */ int16_t l_pid; /* PID des sperrenden Prozesses */ };
Hinweis: Mögliche Werte für l_type sind 0 = Read-Locking, 1 = Write-Locking sowie 3 = kein Locking.
struct iovec { char *iov_base; int32_t iov_len; };
typedef struct { uint8_t maxlen; /* max. Zeilenlänge */ uint8_t actuallen; /* aktuelle Zeilenlänge */ int8_t buffer[255]; /* Zeilen-Puffer */ } LINE;
struct ltchars { int8_t t_suspc; int8_t t_dsuspc; int8_t t_rprntc; int8_t t_flushc; int8_t t_werasc; int8_t t_lnextc; };
Querverweis: struct tty XFS-Konzept in MagiC
/* structure used with sendmsg() and recvmsg() */ struct msghdr { struct sockaddr *msg_name; int32_t msg_namelen; struct iovec *msg_iov; int32_t msg_iovlen; void *msg_accrights; int32_t msg_accrightslen; };
struct mutimbuf { uint16_t actime; /* Zugriffszeit */ uint16_t acdate; /* Zugriffsdatum */ uint16_t modtime; /* Uhrzeit der letzten Änderung */ uint16_t moddate; /* Datum der letzten Änderung */ };
Querverweis: Dcntl Fcntl GEMDOS
typedef struct pd { VOID *p_lowtpa; /* Anfangsadresse der TPA */ VOID *p_hitpa; /* erstes Byte nach dem Ende der TPA */ VOID *p_tbase; /* Anfangsadresse des Programmcodes */ int32_t p_tlen; /* Länge des Programmcodes */ VOID *p_dbase; /* Anfangsadresse des DATA-Bereichs */ int32_t p_dlen; /* Länge des DATA-Abschnittes */ VOID *p_bbase; /* Anfangsadresse des BSS-Bereichs */ int32_t p_blen; /* Länge des BSS-Abschnittes */ DTA *p_dta; /* Zeiger auf Default-DTA. */ /* Achtung: zeigt zunächst in die */ /* Kommandozeile ! */ struct pd *p_parent; /* Zeiger auf die Basepage des auf- */ /* rufenden Prozesses */ int32_t p_resrvd0; /* reserviert */ int8_t *p_env; /* Adresse der Environment-Strings */ int8_t p_resrvd1[80]; /* reserviert */ int8_t p_cmdlin[128]; /* Kommandozeile */ } PD; /* auch: BASEPAGE */
Hinweis zur Kommandozeile: Im ersten Byte wird die Anzahl der Zeichen eingesetzt. Die maximale Länge der Kommandozeile beläuft sich nicht auf 127, sondern nur auf 124 Zeichen! (Dies trift nicht für MagiC ab Version 3 zu - siehe ARGV-Verfahren).
Querverweis: GEMDOS OSHEADER Pexec Programmstart und TPA
typedef struct pollfd { int32_t fd; /* File descriptor to poll */ uint16_t events; /* Types of events poller cares about */ uint16_t revents; /* Types of events that actually occurred */ } POLLFD;
struct ploadinfo { int16_t fnamelen; /* Länge von 'fname' */ int8_t *cmdlin; /* Kommandozeile des Prozesses (128 Bytes) */ int8_t *fname; /* vollst. Pfad- und Dateiname des Prozesses */ };
struct sgttyb { int8_t sg_ispeed; int8_t sg_ospeed; int8_t sg_erase; int8_t sg_kill; uint16_t sg_flags; };
Querverweis: struct tty XFS-Konzept in MagiC
Diese Struktur ist wie folgt definiert:
struct sigaction { void cdecl (*sa_handler)(int32_t sig); int32_t sa_mask; int16_t sa_flags; };
Hinweis: Die Komponente sa_handler kann dabei verschiedene Werte annehmen. Ein Wert von 0 bedeutet eine Default-Signal-Behandlung durch das System, bei einem Wert von 1 wird das Signal ignoriert; jeder andere Werte wird als die Adresse einer Signalbehandlungsroutine interpretiert, die dann aufgerufen wird.
Die Komponente sa_mask enthält die zusätzlich (zu dem gerade in Bearbeitung befindlichen Signal) während der Signalbehandlung zu maskierenden Signale. Es gilt dann also mask = oldmask+(1<<sig)+sa_mask). Über sa_flags kann das Verhalten eines Signals weiter beeinflußt werden. Ein Wert von 1 für sa_flags bedeutet in MiNT, daß das Signal SIGCHLD nur beim Terminieren, und nicht beim Anhalten eines Childs ausgelöst wird; andere Werte für sa_flags sind z.Zt. noch nicht definiert.
Querverweis: Signale Signalhandler in MagiC GEMDOS Psigaction Prozessfunktionen
/* generic socket address */ struct sockaddr { int16_t sa_family; char sa_data[14]; };
struct time { int32_t high_time; int32_t time; uint32_t nanoseconds; }; typedef struct STAT { uint64_t dev; /* Gerätenummer */ uint32_t ino; /* Dateinummer */ uint32_t mode; /* Dateimodus, Angaben zu */ /* - möglichen Filetypen */ /* - speziellen Bits */ /* - Zugriffsrechten */ uint32_t nlink; /* Anzahl der Links */ uint32_t uid; /* Benutzernummer */ uint32_t gid; /* Gruppennummer */ uint64_t rdev; /* tatsächliches Gerät */ /* (z.B. bei BIOS-Files) */ struct time atime; /* Datum des letzten Zugriffs */ struct time mtime; /* Datum der letzten Änderung */ struct time ctime; /* Datum der letzten Status-Änderung */ int64_t size; /* Dateilänge */ int64_t blocks; /* belegte Blocks */ int32_t blksize; /* Blockgröße */ uint32_t flags; /* Benutzer-definierte Flags */ uint32_t gen; /* file generation number */ int32_t reserved[7]; /* reserviert */ } STAT;
Hinweis: MagiC liefert für FAT-Dateisysteme folgende Index-Daten:
• Verzeichnisse: | Startcluster im Motorola-Format | ||||
• sonstige Dateien: |
|
Dieses Verfahren ist ähnlich wie das, welches Linux und Solaris verwenden. Nachteil ist, daß Dateien beim Verschieben ihren Index ändern.
Die Komponente index ist also ein Langwort zur eindeutigen Identifizierung einer Datei bzw. eines Ordners. Der Index muß innerhalb eines Dateisystems eindeutig sein; zusammen mit dem folgenden Feld (dev) ist damit eine Datei oder ein Ordner systemglobal vollständig festgelegt.
Unter UNIX-ähnlichen Dateisystemen ist index die Nummer des Inode.
Auf Macintosh-Partitionen wird die hard file ID bzw. die hard dir ID verwendet, die vom MacOS zur Verfügung gestellt wird. Das MacOS verwendet als Standard-Deskriptoren aber das FSSpec. Für Verzeichnisse, d.h. für Directory IDs, gibt es Funktionen des MacOS, um einen FSSpec zu berechnen. Leider lassen sich die hard file IDs für normale Dateien (d.h. nicht Unterverzeichnisse) nicht weiter verwenden, da sie von keiner Funktion des MacOS verarbeitet werden.
Querverweis: XFS-Konzept in MagiC Fxattr Dxreaddir
Legt das Dateisystem fest. Auf dem Atari sind 0..25 die BIOS-Laufwerke A: bis Z:, Laufwerk U: oder andere Dateisysteme verwenden höhere Nummern. Auf dem Macintosh wird die 'volume ID' eingesetzt, die vom MacOS vergeben wird.
Mögliche Filetypen, die über die STAT-Struktur gesetzt bzw. ermittelt werden können:
#define S_IFMT 0170000 /* zur Isolierung des Filetyps */ #define S_IFSOCK 0010000 /* Socket Datei */ #define S_IFCHR 0020000 /* spezielles BIOS-File */ #define S_IFDIR 0040000 /* Verzeichnis */ #define S_IFBLK 0060000 /* Block special file */ #define S_IFREG 0100000 /* normale Datei */ #define S_IFIFO 0120000 /* FIFO (Pipe mit Namen) */ #define S_IMEM 0140000 /* Speicherblock/Prozeßfile */ #define S_IFLNK 0160000 /* symbolischer Link */
Spezielle Bits, die über die STAT-Struktur gesetzt bzw. ermittelt werden können:
#define S_ISUID 04000 /* User-ID des Eigentümers setzen */ #define S_ISGID 02000 /* Gruppen-ID bei Aufruf setzen */ #define S_ISVTX 01000 /* Sticky bit */
Hinweis: Die Bedeutung des Sticky-Bits ist dabei vom Filetyp abhängig.
Auf DOS-Partitionen wird für Ordner der Wert 0 als Länge geliefert. Die tatsächliche Länge kann leider aufgrund der Einschränkungen von MSDOS nicht ermittelt werden. Die Länge des Wurzelverzeichnisses kann allerdings ermittelt werden.
Auf Macintosh-Partitionen haben Ordner immer die Länge 0, die tatsächliche Länge läßt sich (zumindest unter System 7) nicht ermitteln.
Mögliche Zugriffsrechte, die über die STAT-Struktur gesetzt bzw. ermittelt werden können:
#define S_IRUSR 0400 /* Eigentümer darf Datei lesen */ #define S_IWUSR 0200 /* dto. darf beschreiben */ #define S_IXUSR 0100 /* dto. darf ausführen */ #define S_IRGRP 0040 /* Gruppenmitglieder dürfen lesen */ #define S_IWGRP 0020 /* dto. dürfen beschreiben */ #define S_IXGRP 0010 /* dto. dürfen ausführen */ #define S_IROTH 0004 /* Andere dürfen Datei lesen */ #define S_IWOTH 0002 /* dto. dürfen beschreiben */ #define S_IXOTH 0001 /* dto. dürfen ausführen */
struct tchars { int8_t t_intrc; int8_t t_quitc; int8_t t_startc; int8_t t_stopc; int8_t t_eofc; int8_t t_brkc; };
Querverweis: struct tty XFS-Konzept in MagiC
struct timeval { int32_t int tv_sec; int32_t int tv_usec; };
tv_sec enthält die Anzahl Sekunden, die seit dem Ursprung vergangen sind. Der Ursprung ist Donnerstag, 1.Januar 1970, 00:00:00 UTC.
tv_usec enthält den Nachkommaanteil von tv_sec in Mikrosekunden.
struct timezone { int32_t int tz_minuteswest; int32_t int tz_dsttime; };
tz_minuteswest enthält den Offset zur UTC in Sekunden. Zeitzonen östlich den Null-Meridians (z.B. Osteuropa) haben einen negativen Offset, Zeitzonen westlich des Null-Meridians (z.B. Amerika) haben einen positiven.
tz_dsttime ist ungleich Null, wenn innerhalb des Jahr auf Sommerzeit umgestellt wird.
struct tty { int16_t pgrp; int16_t state; int16_t use_cnt; int16_t res1; struct sgttyb sg; struct tchars tc; struct ltchars ltc; struct winsize wsiz; int32_t rsel; int32_t wsel; int8_t *xkey; int32_t hup_ospeed; uint16_t vmin, vtime; int32_t resrvd[1]; };
Querverweis: Dcntl dev_descr XFS-Konzept in MagiC
struct winsize { int16_t ws_row; int16_t ws_col; int16_t ws_xpixel; int16_t ws_ypixel; };
Querverweise: Fcntl TIOCGWINSZ
typedef struct xattr { uint16_t mode; /* Dateimodus, Angaben zu */ /* - möglichen Filetypen */ /* - speziellen Bits */ /* - Zugriffsrechten */ int32_t index; /* Dateinummer */ uint16_t dev; /* Gerätenummer */ uint16_t rdev; /* tatsächliches Gerät */ /* (z.B. bei BIOS-Files) */ /* in MagiC jedoch reserviert */ uint16_t nlink; /* Anzahl der Links */ uint16_t uid; /* Benutzernummer */ uint16_t gid; /* Gruppennummer */ int32_t size; /* Dateilänge */ int32_t blksize, nblocks; /* Blockgröße/belegte Blocks */ uint16_t mtime, mdate; /* Datum der letzten Änderung */ uint16_t atime, adate; /* Datum des letzten Zugriffs */ uint16_t ctime, cdate; /* Erstellungsdatum */ uint16_t attr; /* TOS-Dateiattribute */ uint16_t reserved2; /* reserviert */ int32_t reserved3[2]; /* reserviert */ } XATTR;
Hinweis: MagiC liefert für FAT-Dateisysteme folgende Index-Daten:
• Verzeichnisse: | Startcluster im Motorola-Format | ||||
• sonstige Dateien: |
|
Dieses Verfahren ist ähnlich wie das, welches Linux und Solaris verwenden. Nachteil ist, daß Dateien beim Verschieben ihren Index ändern.
Die Komponente index ist also ein Langwort zur eindeutigen Identifizierung einer Datei bzw. eines Ordners. Der Index muß innerhalb eines Dateisystems eindeutig sein; zusammen mit dem folgenden Feld (dev) ist damit eine Datei oder ein Ordner systemglobal vollständig festgelegt.
Unter UNIX-ähnlichen Dateisystemen ist index die Nummer des Inode.
Auf Macintosh-Partitionen wird die hard file ID bzw. die hard dir ID verwendet, die vom MacOS zur Verfügung gestellt wird. Das MacOS verwendet als Standard-Deskriptoren aber das FSSpec. Für Verzeichnisse, d.h. für Directory IDs, gibt es Funktionen des MacOS, um einen FSSpec zu berechnen. Leider lassen sich die hard file IDs für normale Dateien (d.h. nicht Unterverzeichnisse) nicht weiter verwenden, da sie von keiner Funktion des MacOS verarbeitet werden.
Querverweis: XFS-Konzept in MagiC Fxattr Dxreaddir
Legt das Dateisystem fest. Auf dem Atari sind 0..25 die BIOS-Laufwerke A: bis Z:, Laufwerk U: oder andere Dateisysteme verwenden höhere Nummern. Auf dem Macintosh wird die 'volume ID' eingesetzt, die vom MacOS vergeben wird.
Mögliche Filetypen, die über die XATTR-Struktur gesetzt bzw. ermittelt werden können:
#define S_IFMT 0170000 /* zur Isolierung des Filetyps */ #define S_IFCHR 0020000 /* spezielles BIOS-File */ #define S_IFDIR 0040000 /* Verzeichnis */ #define S_IFREG 0100000 /* normale Datei */ #define S_IFIFO 0120000 /* FIFO (Pipe mit Namen) */ #define S_IMEM 0140000 /* Speicherblock/Prozeßfile */ #define S_IFLNK 0160000 /* symbolischer Link */
Spezielle Bits, die über die XATTR-Struktur gesetzt bzw. ermittelt werden können:
#define S_ISUID 04000 /* User-ID des Eigentümers setzen */ #define S_ISGID 02000 /* Gruppen-ID bei Aufruf setzen */ #define S_ISVTX 01000 /* Sticky bit */
Hinweis: Die Bedeutung des Sticky-Bits ist dabei vom Filetyp abhängig.
Auf DOS-Partitionen wird für Ordner der Wert 0 als Länge geliefert. Die tatsächliche Länge kann leider aufgrund der Einschränkungen von MSDOS nicht ermittelt werden. Die Länge des Wurzelverzeichnisses kann allerdings ermittelt werden.
Auf Macintosh-Partitionen haben Ordner immer die Länge 0, die tatsächliche Länge läßt sich (zumindest unter System 7) nicht ermitteln.
Mögliche Zugriffsrechte, die über die XATTR-Struktur gesetzt bzw. ermittelt werden können:
#define S_IRUSR 0400 /* Eigentümer darf Datei lesen */ #define S_IWUSR 0200 /* dto. darf beschreiben */ #define S_IXUSR 0100 /* dto. darf ausführen */ #define S_IRGRP 0040 /* Gruppenmitglieder dürfen lesen */ #define S_IWGRP 0020 /* dto. dürfen beschreiben */ #define S_IXGRP 0010 /* dto. dürfen ausführen */ #define S_IROTH 0004 /* Andere dürfen Datei lesen */ #define S_IWOTH 0002 /* dto. dürfen beschreiben */ #define S_IXOTH 0001 /* dto. dürfen ausführen */
Spezielle Bits, die über die XATTR-STruktur gesetzt bzw. ermittelt werden können:
#define S_ISUID 04000 /* User-ID des Eigentümers setzen */ #define S_ISGID 02000 /* Gruppen-ID bei Aufruf setzen */ #define S_ISVTX 01000 /* Sticky bit */
Hinweis: Die Bedeutung des Sticky-Bits ist dabei vom Filetyp abhängig.
struct xkey { int16_t xk_num; int8_t xk_def[8]; };