|
|
Dateieigenschaften ermittelnSie können aus dem Programm heraus ermitteln, wie die Zugriffsrechte auf eine Datei sind. Sie erhalten Informationen über Zeiten des letzten Schreibens und Lesens. Sie können den Besitzer und den Typ der Datei feststellen.
stat() und fstat()
Mit der Funktion
#include <sys/types.h> #include <sys/stat.h> int stat(char *dateiname, struct stat *puffer); int fstat(int dateihandle, struct stat *puffer); Die Ergebnisse finden sich in der Variablen von Typ stat, auf die der Parameter puffer zeigt. Die Definition der Struktur stat lautet:
struct stat { dev_t st_dev /* (P) Device, auf dem die Datei liegt */ ushort st_ino /* (P) Inode-Nummer */ ushort st_mode /* (P) Dateityp */ short st_nlink /* (P) Anzahl der Links der Datei */ ushort st_uid /* (P) Eigner-ID (uid) */ ushort st_gid /* (P) Gruppen-ID (gid) */ dev_t st_rdev /* Major- und Minornumber, falls Device */ off_t st_size /* (P) Größe in Byte */ time_t st_atime /* (P) Zeitpunkt letzter Zugriffs */ time_t st_mtime /* (P) Zeitpunkt letzte Änderung */ time_t st_ctime /* (P) Zeitpunkt letzte Statusänderung */ }; Die Bestandteile dieser Struktur können sich je nach System unterscheiden. Die mit (P) gekennzeichneten Elemente sind aber zwingend von POSIX vorgeschrieben. st_dev und st_ino beschreiben eindeutig den Ort einer Datei. st_dev ist das Device, bei Festplatten also die Partition. st_ino bezeichnet den i-node, in dem auf die Datei verwiesen wird.
Die rechten 12 Bit von st_mode beschreiben die Rechtezuordnung der Datei, wie
sie von
[Konstanten für den Dateityp]L|L
Konstante & Dateityp
Das folgende Beispielprogramm ermittelt für die als ersten Parameter übergebene Dateinamen die Rechte und stellt anschließend fest, ob es sich um eine Datei, einen symbolischen Link oder ein Verzeichnis handelt.
[Dateityp und Rechte bestimmen] #include <sys/types.h> #include <sys/stat.h>
int main(int argc, char **argv) { struct stat Status; int Dateityp;
stat(argv[1], &Status); /* Dateirechte */ printf("Dateirechte: %o n", Status.st_mode & S_IFMT); Dateityp = Status.st_mode & S_IFMT; switch (Dateityp) { case S_IFREG: puts("Datei"); break; case S_IFLNK: puts("Symbolischer Link"); break; case S_IFDIR: puts("Verzeichnis"); break; default: puts("Sonstiges"); } } In st_nlink steht, wieviele harte Links auf die Datei zeigen. Mit st_uid und st_gid werden der Besitzer und die Besitzergruppe ermittelt. Der Wert ist eine Zahl, nämlich die, welche in /etc/passwd bzw. in /etc/group festgelegt wird. In st_rdev ist die Major- und Minornummer kodiert, sofern es sich bei der Datei um ein Device handelt. Sofern es sich bei der Datei um eine reguläre Datei handelt, finden Sie in st_size die Größe in Bytes. Jeder lesende oder schreibende Zugriff auf die Datei aktualisiert den Wert st_atime. Jede Veränderung des Dateiinhalts wird in in st_mtime notiert. Der Zeitpunkt der Änderungen bezüglich der Benutzer, Rechte, Linkzahl oder ähnlichem, also allem, was nicht den Inhalt betrifft, wird in st_ctime festgehalten.
Zugriffsrecht ermitteln
Will ein Programm ermitteln, ob es beispielsweise Schreibrecht auf
eine Datei hat, könnte es mit
#include <unistd.h> int access(const char *dateiname, int modus); An den Parameter modus können folgende Konstanten übergeben werden:
[Rechte beim Aufruf von access]L|L
Konstante & Bedeutung
Der Rückgabewert ist 0, wenn der Zugriff erlaubt ist oder EACCESS, wenn nicht.
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|