Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ под Linux
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
win32hater
1 / 1 / 0
Регистрация: 09.04.2018
Сообщений: 16
1

Режимом доступа к файлам

20.05.2018, 22:24. Просмотров 774. Ответов 4

Доброго времени суток.
Есть 2 файла. У одного установлены права для владельца, группы и остальных пользователей на чтение и запись. У другого - только для владельца.
Вот что показывает команда ls -al

drwxrwxrwx 2 arthur arthur 4096 Май 20 20:46 .
drwxrwxr-x 4 arthur arthur 4096 Май 20 22:13 ..
-rw-rw-r-- 1 arthur arthur 0 Май 20 20:46 1
-rw------- 1 arthur arthur 0 Май 20 20:46 2

Но когда я работаю с этими файлами через opendir и дальнейшим получением информации через stat(), то права отображаются для всех полные (777). Проверил поле st_mode. Там, насколько я понимаю, число в восьмеричном формате. Получилось 16895. Перевел. Получил 040777.

Мб кто-то сталкивался с этим? В чем может быть проблема?

Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <ctime>
#include <string>
#include <cstring>
#include <iostream>
using namespace std;
 
 
void mode_to_letters( int mode, char str[] )
{
    strcpy( str, "------" );           /* default=no perms */
    cout << endl << "mode:" << mode;
    if ( mode & S_IRGRP ) str[0] = 'r';    /* 3 bits for group */
    if ( mode & S_IWGRP ) str[1] = 'w';
    if ( mode & S_IXGRP ) str[2] = 'x';
 
    if ( mode & S_IROTH ) str[3] = 'r';    /* 3 bits for other */
    if ( mode & S_IWOTH ) str[4] = 'w';
    if ( mode & S_IXOTH ) str[5] = 'x';
}
 
void viewDir(string dir) {
    DIR *op_dir = opendir(dir.c_str());
    char modestr[7];
 
    struct dirent *file;
    struct stat fileStat;
 
    while(file = readdir(op_dir)) {
        // если это каталог
        if (file->d_type == DT_DIR) {
            if ((file->d_name != ".") && (file->d_name != ".."))
                cout << "";
                //viewDir((string)file->d_name);
        } else {
            // если это файл
            stat(dir.c_str(), &fileStat);
 
            cout << "modestr: " << modestr << endl;
            mode_to_letters(fileStat.st_mode, modestr);
            if (strcmp(modestr, "------")) {
               cout << endl << file->d_name;
               cout << endl << modestr;
            }
        }
 
        
    }
closedir(op_dir);
    
}
 
main(int argc, char **argv) {
    if (argc > 1) {
        viewDir((string)argv[1]);
    } else {
        cout << endl << "Укажите название директории!" << endl;
    }
    cout << endl;
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.05.2018, 22:24
Ответы с готовыми решениями:

Модель управления температурным режимом методической печи
Всем доброго времени суток. Есть такое задание, и честно не знаю как даже с...

Разграничение доступа к файлам
Доброго времени суток. Есть Windows 2008 server на котором настроен AD. Есть...

Блокировка доступа к файлам
Здравствуйте! Подскажите, возможно ли написать приложение, которое бы следило...

нет доступа к файлам
если ошибся темой - извиняюсь, лучше не нашёл впервые пришлось заняться...

Мониторинг доступа к файлам
Здравствуйте. Задача следующая: написать прогу (Qt 4.6), которая ведет логи...

4
Humanoid
Почетный модератор
9962 / 3848 / 344
Регистрация: 12.06.2008
Сообщений: 11,363
20.05.2018, 23:31 2
Цитата Сообщение от win32hater Посмотреть сообщение
C++
1
2
// если это файл
stat(dir.c_str(), &fileStat);
А почему тут для dir вызывается stat() ?
1
win32hater
1 / 1 / 0
Регистрация: 09.04.2018
Сообщений: 16
20.05.2018, 23:44  [ТС] 3
Да. Про** немного)

Пофиксил. Передал file->d_name. Но права все равно не те. Должно быть ------ у второго, а у него r--r-x. Как и у первого, впрочем.
0
Humanoid
Почетный модератор
9962 / 3848 / 344
Регистрация: 12.06.2008
Сообщений: 11,363
21.05.2018, 22:44 4
Лучший ответ Сообщение было отмечено win32hater как решение

Решение

Что возвращает stat() ? Точнее, он возвращает, скорее всего, -1. А какой при этом errno? Я подозреваю, что file->d_name он найти не может, так как ищет в текущей директории. Наверное, надо вначале ещё переменную dir со слешем добавлять.
1
win32hater
1 / 1 / 0
Регистрация: 09.04.2018
Сообщений: 16
21.05.2018, 23:32  [ТС] 5
Большое спасибо. Добавление директории со слешем решило эту проблему и проблему с сегментацией при попытке рекурсивно просканировать дочерние каталоги.
0
21.05.2018, 23:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2018, 23:32

Защита доступа к файлам
Пишу простой движек. Любой url обрабатывается из главного index файла. Также...

Нет доступа к файлам
В компьютере невозможно ничего открыть пишет у вас нет доступа к файлам и т.д,...

Нет доступа к файлам
Давно уже такая хрень происходит с данной директорией, но ранее было пофик,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru