Zugriffsbitts
-
Hallo
Hab mich eigentlich nur wegen einer Frage angemeldet - hoffe jemand kann mir etwas helfen.
Folgendes: Ich soll verschiedene Infos zu einem Datei ausgeben mit Hilfe von man: lstat() und man: getpwuid(). Also nur diese 2 funktionen und dazu gehörige strukturen sollen benutzt werden.
So Sachen heit wie Filetyp, user-ID, Zugriffsrechte, Zeit des letzen Zugriffs und noch so paar sachen. -War auch nicht schwer. Nun muss ich noch Zugriffsbits (was auch immer damit gemeint ist) irgendwoher bekommen - diese stehen nicht drin. Muss diese also irgendwie ausrechnen und oktal ausgeben - aber wie rechne ich diese aus? -Hat jemand eine idee?
-
Die stecken in st_mode
#include <sys/types.h> #include <sys/stat.h> #include <stdio.h> int main() { struct stat sb; if(lstat("foo.test", &sb) == -1) { perror("lstat"); return 1; } printf("%o\n", sb.st_mode); }
-
irgendetwas bekomme ich damit schon raus - danke
Auch wenn ich nicht weiß was es ist. Was ist eigentlich an sich mit Zugriffsbits gemeint?Ich bekomme bei der Zeile
printf( "Zugriffsbits: %o\n", attribut.st_mode);
folgende Warning: unsigned int format, mode_t arg (arg 2)
Aber eigentlich hab ich mode_t st_mode bereits verwendet für
void geraetenart ( mode_t mod) { if ( S_IFREG ( mod ) ) printf ( "Regulaer \n" ); else if ( S_IFDIR ( mod ) ) printf ( "Dir \n" ); else if ( S_ISFIFO( mod ) ) printf ( "Pipe \n" ); else if ( S_ISSOCK( mod ) ) printf ( "Socket \n" ); else if ( S_IFCHR ( mod ) ) printf ( "Char \n" ); else if ( S_ISLNK ( mod ) ) printf ( "Link \n" ); else printf ( "unbekannte Geraetenart \n" ); }
-Was ist es also für so ein mysterioser wert, der alles kennt?
_
-
Die einzelnen Bits werden ja nach Eigenschaft gesetzt. Daher passt da ganz viel rein. 9 Bits werden für die Zugriffsrechte genutzt und der Rest für weitere Informationen über den Typ. Daher musst du die anderen Bits vermutlich noch 0en, wenn du nur die Zugriffsrechte haben willst
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <stdio.h> int main() { struct stat sb; if(lstat("foo.test", &sb) == -1) { perror("lstat"); return 1; } printf("0%o\n", 0777 & sb.st_mode); }
http://en.wikipedia.org/wiki/File_system_permissions#Octal_notation
folgende Warning: unsigned int format, mode_t arg (arg 2)
Ja, das ist der Nachteil von printf und versteckten Typen. Man weiß nie genau was man als Formatargument nutzen soll.
-
die Frage ist ja nun schon ziemlich alt, trotzdem noch eine Antwort - vielleicht hilft es ja mal jemandem, der nach einer Möglichkeit sucht, das ominöse Feld st_mode auszuwerten.
Erst mal die Theorie:
Mit "Zugriffsbits" sind die Rechte gemeint, die jemand auf Directory-Entries hat. "Jemand" wird unterteilt in User/Gruppe/Andere. An Rechten gibt es Lese-, Schreib- und Ausführungsrechte. Und vorndran wird eine Info gestellt, ob es sich um einen Ordner handelt oder nicht.
So sieht die Rechteanzeige z.B. in einem File-Explorer wie Nautilus aus:d rw- r-- ---
d: Verzeichniseintrag ist ein Ordner
erste Dreiergruppe: "User" darf lesen (r), schreiben (w)
zweite Dreiergruppe: "Gruppe" darf nur lesen
dritte Dreiergruppe: "Andere" dürfen nix.Und für eine ausführbare Datei sähe es z.B. so aus:
- rwx r-x r--
erste Stelle "-": es ist kein Ordner
erste Dreiergruppe: "User" darf lesen (r), schreiben (w) und ausführen (x)
zweite Dreiergruppe: "Gruppe" darf nur lesen und ausführen
dritte Dreiergruppe: "Andere" dürfen nur lesen.In einem cpp-Programm kann man diesen lesbaren String wie folgt erzeugen:
#include <sys/stat.h> void DirectoryEntry::EvaluateMode( __mode_t st_mode ) { char buf[11]; //directory? buf[0] = ( S_ISDIR( st_mode ) ) ? 'd' : '-'; //owner read? buf[1] = (st_mode & S_IRUSR ) ? 'r' : '-'; //owner write? buf[2] = (st_mode & S_IWUSR ) ? 'w' : '-'; //owner execute? buf[3] = (st_mode & S_IXUSR ) ? 'x' : '-'; //group read? buf[4] = (st_mode & S_IRGRP ) ? 'r' : '-'; //group write? buf[5] = (st_mode & S_IWGRP ) ? 'w' : '-'; //group execute? buf[6] = (st_mode & S_IXGRP ) ? 'x' : '-'; //others read? buf[7] = (st_mode & S_IRGRP ) ? 'r' : '-'; //others write? buf[8] = (st_mode & S_IWGRP ) ? 'w' : '-'; //others execute? buf[9] = (st_mode & S_IXGRP ) ? 'x' : '-'; buf[10] = '\0'; }
-
nur der Richtigkeit halber: im Beitrag von heute_nur_gast muss "User" durch "Owner" ersetzt werden