Как проверить, требует ли папка прав root в языке C (Язык C, UNIX)?
Подскажите, пожалуйста, как проверить в языкe С, требует ли папка права root?
Сравниваю переменную типа mode_t с флагами (маркерами) разрешений (S_IWUSR и так далее), но среди данных маркеров нету ничего на проверку root. Проверка на обычную папку if((bits & S_IFREG)==0) тоже ничего не даёт, потому что определяет своё значение как раз по тому, имеется ли право доступа read.
На всякий случай привожу код, извиняюсь за польский, он, думаю, здесь не критичен.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
void listuj(char* dirName);
int main(int argc, char** argv){
if(argc==2)
listuj(argv[1]);
else
printf ("Niepoprawna liczba argumentow, podaj jeden.\n");
return 0;
}
void listuj(char* dirName){
struct dirent *entry;
DIR *theDir;
struct stat st;
if(stat(dirName, &st) == 0){
printf("Katalog %s istnieje\n",dirName);
mode_t bits = st.st_mode;
if((bits & S_IRUSR)==0){
printf("Wlasciciel nie ma uprawnienia Read \n");
}
else {
printf("Wlasciciel ma uprawnienie Read \n");
}
if((bits & S_IWUSR)==0){
printf("Wlasciciel nie ma uprawnienia Write \n");
}
else {
printf("Wlasciciel ma uprawnienie Write \n");
}
if((bits & S_IXUSR)==0){
printf("Wlasciciel nie ma uprawnienia Execute \n");
}
else {
printf("Wlasciciel ma uprawnienie Execute \n");
}
if (chdir(dirName) != 0){
if((bits & S_IFREG)==0){
printf ("Nie mam dostepu! \n");
if((bits & S_IRUSR)==0){
printf("Nie ma uprawnienia Read! \n");
}
else {
printf ("Wymaga praw root! \n");
}
}
}
else{
theDir=opendir("./");
int regulars=0;
while(entry=readdir(theDir))
switch(entry->d_type){
case DT_REG: regulars++; break;
default:
break;
}
printf("liczba plikow zwyklych (-) %d\n", regulars);
closedir(theDir);
}
}
else {
printf("Katalog %s nie istnieje\n",dirName);
exit(1);
}
}
Ответы (2 шт):
Посмотрите на access.
Можете поиграться с
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
int
main (int ac, char *av[])
{
errno = 0;
int rc = access(av[1] ? av[1] : "/", R_OK | W_OK | X_OK);
printf ("%m rc = %d\n", rc);
return rc;
}
На прямую опеределить не получится.
Среди полей mode_t структуры stat нет ничего на проверку root. Но в этой же структуре есть поля:
uid_t st_uid
gid_t st_gid
которые показывают владельца и группу. Сравнивая владельца и группу, а так же права доступа для остальных можно определить может ли не root получить доступ к файлу (каталог это тоже файл).