30: /* Отобразить всю информацию, полученную от lstat() по имени
31: файла как единственному параметру. */
32: int statFile(const char *file) {
33: struct stat statbuf;
34: char timeBuf[TIME_STRING_BUF];
35:
36: if (lstat(file, &statbuf)) {
37: fprintf(stderr, 'не удалось lstat %s: %s
', file,
38: strerror(errno));
39: return 1;
40: }
41:
42: printf('Имя файла : %s
', file);
43: printf('На устройстве: старший %d/младший %d Inode номер: %ld
' ,
44: major(statbuf.st_dev), minor(statbuf.st_dev),
45: statbuf.st_ino);
46: printf ('Размер : %-101d Тип: %07o'
47: 'Права доступа : %05o
', statbuf.st_size,
48: statbuf.st_mode & S_IFMT, statbuf.st_mode &~(S_IFMT));
49: printf('Владелец : %d Группа : %d'
50: ' Количество ссылок : %d
',
51: statbuf.st_uid, statbuf.st_gid, statbuf.st_nlink);
52: printf('Время создания : %s
',
53: timeString(statbuf.st_ctime, timeBuf));
54: printf('Время модификации : %s
',
55: timeString(statbuf.st_mtime, timeBuf));
56: printf('Время доступа : %s
',
57: timeString (statbuf.st_atime, timeBuf));
58:
59: return 0;
60: }
61:
62: int main(int argc, const char **argv) {
63: int i;
64: int rc = 0 ;
65:
66: /* Вызвать statFile() для каждого имени файла,
67: переданного в командной строке. */
68: for (i = 1; i < argc; i++) {
69: /* Если statFile() сбоит, rc будет содержать не ноль.*/
70: rc |= statFile(argv[i]);
71:
72: /* это печатает пробел между позициями,
73: но не за последней */
74: if ((argc - i) > 1) printf ('
');
75: }
76:
77: return rc;
78: }
11.3.3. Простое определение прав доступа
Хотя режим файла представляет всю информацию, которая может понадобиться программе, для определения того, имеет ли она доступ к файлу, тестирование набора прав — дело хитрое и чреватое ошибкам. Поскольку ядро ухе включает в себя код для проверки прав доступа, предусмотрен простой системный вызов, который позволяет программам определять, могут ли они получить доступ к файлу определенным образом.
#include <unistd.h>
int access(const char *pathname, int mode);
mode
— это маска, которая содержит одно или более перечисленных ниже значений.
F_OK | Файл существует. Это требует прав на выполнение по всем каталогам, составляющим путь, поэтому может закончиться сбоем, даже если файл существует. |
R_OK | Процесс может читать файл. |
W_OK | Процесс может писать файл. |
X_OK | Процесс может исполнять файл (или искать в каталоге). |
access()
возвращает 0, если указанный режим доступа разрешен, в противном случае возвращает ошибку EACCESS
.
11.3.4. Изменение прав доступа к файлу
Права доступа и модификаторы прав доступа к файлу изменяются с помощью системного вызова chmod()
.
#include <sys/stat.h>
int chmod(const char *pathname, mode_t mode);
int fchmod(int fd, mode_t mode);
Хотя chmod()
позволяет указать путь, помните, что права доступа к файлу определяет inode, а не имя файла. Если у файла есть множество жестких ссылок, то изменение прав доступа по одному из имен файла изменяет права доступа к нему везде, где он встречается в файловой