Как добавить разрешения для моей программы ls-al c? - PullRequest
0 голосов
/ 20 июня 2019

Я пишу код для реализации команды ls-al, используя программу c, и я получил свой код, чтобы реализовать его без разрешений на печать, но я также хочу реализовать разрешения, но не могу понять, как. какие-либо предложения? мой код ниже

#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <pwd.h>

// Last Modified
        time_t t = my_stat.st_mtime;
        localtime_r(&t, &lt);
        char timebuf[80];
        strftime(timebuf, sizeof(timebuf), "%c", &lt);
        if (pwd != 0) {
            printf("%s \t %ld \t %s \t %s", pwd->pw_name, (long)my_stat.st_size, timebuf, current_directory->d_name);
            printf("\n");
        } else {
            printf("%d \t %ld \t %s \t %s", my_stat.st_uid, (long)my_stat.st_size, timebuf, current_directory->d_name);
            printf("\n");
        }
    }
    closedir(directory);
    return 0;
}
int main(int argc, char* argv[]) {
    if ( argc == 1 ) {
        return list_dir ( "." );
    } else {
        int ret = 0;
        for (int i = 1; i < argc; i += 1 ) {
            if ( list_dir ( argv[i] ) != 0 ) {
                ret = 1;
            }
        }
        return ret;
    }
}

Я долго пытался добавить разрешения к этому коду, но мне кажется, что я застрял и у меня нет идей здесь

вывод моего кода:

kev      0   Thu Jun 20 13:39:49 2019    .
kev      0   Thu Jun 20 13:39:46 2019    ..
kev      24147   Thu Jun 20 12:24:40 2019    CMakeCache.txt
kev      0   Thu Jun 20 13:39:53 2019    CMakeFiles
kev      1426    Thu Jun 20 12:24:41 2019    cmake_install.cmake
kev      5160    Thu Jun 20 12:24:41 2019    Makefile

ожидаемый результат:

rw-r--r--  1 kev     0   Thu Jun 20 13:39:49 2019    .
rw-r--r--  1 kev     0   Thu Jun 20 13:39:46 2019    ..
-rw-------       24147   Thu Jun 20 12:24:40 2019    CMakeCache.txt
rw-r--r--   kev      0   Thu Jun 20 13:39:53 2019    CMakeFiles
-rw-------  kev      1426    Thu Jun 20 12:24:41 2019 cmake_install.cmake
rw-r--r-- kev    5160    Thu Jun 20 12:24:41 2019    Makefile

1 Ответ

2 голосов
/ 20 июня 2019

Вы захотите использовать поле mode_t st_mode вашего struct stat.См. Stat (2):

Структура stat

Все эти системные вызовы возвращают структуру stat, которая содержит следующие поля:

struct stat {
   dev_t     st_dev;         /* ID of device containing file */
   ino_t     st_ino;         /* inode number */
   mode_t    st_mode;        /* file type and mode */
   nlink_t   st_nlink;       /* number of hard links */
   uid_t     st_uid;         /* user ID of owner */
   gid_t     st_gid;         /* group ID of owner */
   dev_t     st_rdev;        /* device ID (if special file) */
   off_t     st_size;        /* total size, in bytes */
   blksize_t st_blksize;     /* blocksize for filesystem I/O */
   blkcnt_t  st_blocks;      /* number of 512B blocks allocated */

   /* Since Linux 2.6, the kernel supports nanosecond
      precision for the following timestamp fields.
      For the details before Linux 2.6, see NOTES. */

   struct timespec st_atim;  /* time of last access */
   struct timespec st_mtim;  /* time of last modification */
   struct timespec st_ctim;  /* time of last status change */

#define st_atime st_atim.tv_sec      /* Backward compatibility */  
#define st_mtime st_mtim.tv_sec    #define st_ctime st_ctim.tv_sec    };

[...]

Тип и режим файла (st_mode)

POSIX относится к битам st_mode, соответствующиммаска S_IFMT (см. ниже) в качестве типа файла, 12 битов, соответствующих маске 07777 в качестве битов режима файла и наименее значимых 9 бит (0777) в качестве битов разрешения файла.

Следующие значения маскиопределены для типа файла поля st_mode:

       S_IFMT     0170000   bit mask for the file type bit field

       S_IFSOCK   0140000   socket

       S_IFLNK    0120000   symbolic link
       S_IFREG    0100000   regular file
       S_IFBLK    0060000   block device
       S_IFDIR    0040000   directory
       S_IFCHR    0020000   character device
       S_IFIFO    0010000   FIFO

[...]

Следующие значения маски определены для компонента режима файлаПоле st_mode:

       S_ISUID     04000   set-user-ID bit
       S_ISGID     02000   set-group-ID bit (see below)
       S_ISVTX     01000   sticky bit (see below)

       S_IRWXU     00700   owner has read, write, and execute permission
       S_IRUSR     00400   owner has read permission
       S_IWUSR     00200   owner has write permission
       S_IXUSR     00100   owner has execute permission

       S_IRWXG     00070   group has read, write, and execute permission
       S_IRGRP     00040   group has read permission
       S_IWGRP     00020   group has write permission
       S_IXGRP     00010   group has execute permission

       S_IRWXO     00007   others  (not  in group) have read, write, and execute per‐
                           mission
       S_IROTH     00004   others have read permission
       S_IWOTH     00002   others have write permission
       S_IXOTH     00001   others have execute permission
...