STAT(2)

BEZEICHNUNG
stat, fstat, lstat - Ermittle Dateistatus

ÜBERSICHT
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *file_name, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *file_name, struct stat *buf);

UEBERBLICK

Beim Aufruf geben diese Funktionen Informationen über die angegebene Datei zurück. Dazu benötigt man keinerlei Rechte an der angegebene Datei, sehr wohl aber die ''Search''-Rechte im rekursiven Pfad zu dieser Datei.

stat liefert die Informationen zu der in file_name angegebenen Datei und übergibt diese an buf. lstat ist ähnlich stat, nur dass, bei Links, Informationen zum Link und nicht der bezogenen Datei an buf übergeben werden. fstat ist wie stat, doch wird statt file_name die, von -I fopen(3) übergebene filedes verwendet.

Alle Aufrufe geben eine Struktur vom Typ stat zurück, die folgendermassen aufgebaut ist:

    struct stat
    {
        dev_t         st_dev;      /* Device */
        ino_t         st_ino;      /* INode */
        umode_t       st_mode;     /* Protection */
        nlink_t       st_nlink;    /* Anzahl d. Hard_Links */
        uid_t         st_uid;      /* UID des Besitzers */
        gid_t         st_gid;      /* GID des Besitzers */
        dev_t         st_rdev;     /* Typ (wenn INode-Device) */
        off_t         st_size;     /* Grösse in Bytes*/
        unsigned long st_blksize;  /* Blockgrösse */
        unsigned long st_blocks;   /* Allozierte Blocks */
        time_t        st_atime;    /* Letzter Zugriff */
        time_t        st_mtime;    /* Letzte Modifikation */
        time_t        st_ctime;    /* Letzte Aenderung */
    };

CAVEAT: st_blocks muss nicht unbedingt die Blockgrösse darstellen und st_blksize kann auch die optimale Blockgrösse für die Dateioperationen angeben.

Nicht alle, von Linux unterstützte, Dateisysteme verwenden alle Felder. Normalerweise ändert sich st_atime durch den Einsatz von mknod(2), utime(2), read(2), write(2), und truncate(2). st_mtime verändert sich beim Einsatz von mknod(2), utime(2), und write(2). st_mtime wird nicht durch Ändern von Besitzer, Gruppe, Hardlink-Count, oder Mode verändert. st_ctime wird durch das Aendern der INode-Informationen neu gesetzt.

Folgende Makros sind für den Dateityp definiert:

    S_ISLNK(m)
        Testet auf einen Symbolischen Link,

    S_ISREG(m)
        auf reguläre Dateien,

    S_ISDIR(m)
        auf Verzeichnisse,

    S_ISCHR(m)
        checkt auf Character-Devices,

    S_ISBLK(m)
        auf Block-Devices, während

    S_ISFIFO(m)
        auf FiFos und

    S_ISSOCK(m)
        auf Sockets überprüft.

Folgende Flags sind für st_mode definiert:

    S_IFMT
        00170000 Bitmaske für den Dateityp

    S_IFSOCK
        0140000 Sockets

    S_IFLNK
        0120000 Symbolische Links

    S_IFREG
        0100000 reguläre Dateien

    S_IFBLK
        0060000 Block-Devices

    S_IFDIR
        0040000 Verzeichnisse

    S_IFCHR
        0020000 Char-Devices

    S_IFIFO
        0010000 FIFOs

    S_ISUID
        0004000 SUID-bit

    S_ISGID
        0002000 SGID-bit

    S_ISVTX
        0001000 Stickybit ( Wer's braucht :) )

    S_IRWXU
        00700 rwx für (u)ser

    S_IRUSR (S_IREAD)
        00400 r-- für (u)ser

    S_IWUSR (S_IWRITE)
        00200 -w- für (u)ser

    S_IXUSR (S_IEXEC)
        00100 --x für (u)ser

    S_IRWXG
        00070 rwx für (g)roup

    S_IRGRP
        00040 r-- für (g)roup

    S_IWGRP
        00020 -w- für (g)roup

    S_IXGRP
        00010 --x für (g)roup

    S_IRWXO
        00007 rwx für (o)thers

    S_IROTH
        00004 r-- für (o)thers

    S_IWOTH
        00002 -w- für (o)thers

    S_IXOTH
        00001 --x für (o)thers

RETURN VALUE
Erfolg gibt 0, ein Fehler gibt -1 zurück und setzt errno entsprechend.

FEHLER

EBADF
    filedes falsch oder nicht vorhanden.

ENOENT
    Datei existiert nicht.

KONFORM ZU
SVID (not lstat()), AT&T (not lstat()), POSIX (not lstat()), X/OPEN (not lstat()), BSD 4.3

SIEHE AUCH
chmod(2), chown(2), readlink(2), utime(2)

DEUTSCH VON
Jonas Rovan <jonas@blitz.de>, der das GerMan-Projekt für eine der besten Ideen hält, die jemals gehabt wurden und Andries Brouwer <aeb@win.tue.nl> für dessen Engagement herzlichst dankt.