Thumbnail

rani/cscroll.git

Clone URL: https://git.buni.party/rani/cscroll.git

commit a190fefeb2c6ae7cdc9ef53f518015766d5a7d38 Author: rani <clagv.randomgames@gmail.com> Date: Tue Jun 28 21:13:51 2022 +0000 fix uid/sticky bit showing in long mode diff --git a/include/dir.h b/include/dir.h index f8879a2..6dd0961 100644 --- a/include/dir.h +++ b/include/dir.h @@ -515 +515 @@  #include <time.h>  #include <stdint.h>   -#define MOWNER(M) (M >> 6) -#define MGROUP(M) (M >> 3) -#define POWNER(M) (M << 6) -#define PGROUP(M) (M << 3) +#define MOWNER(M) (M >> 8) +#define MGROUP(M) (M >> 4) +#define POWNER(M) (M << 8) +#define PGROUP(M) (M << 4)    #define M_EXEC (1 << 0)  #define M_WRITE (1 << 1)  #define M_READ (1 << 2) -#define M_SUID (1 << 10) +#define M_SUID (1 << 3)    enum file_type_t {   FILE_REG, diff --git a/src/dir.c b/src/dir.c index 05abbdd..9a9e7ff 100644 --- a/src/dir.c +++ b/src/dir.c @@ -1246 +1248 @@ int list_dir(char * dir_path) {   dir_entry->mode |= M_WRITE;   if (buf->st_mode & S_IXOTH)   dir_entry->mode |= M_EXEC; + if (buf->st_mode & S_ISVTX) // sticky + dir_entry->mode |= M_SUID;     // group mode   if (buf->st_mode & S_IRGRP) @@ -1326 +1348 @@ int list_dir(char * dir_path) {   dir_entry->mode |= PGROUP(M_WRITE);   if (buf->st_mode & S_IXGRP)   dir_entry->mode |= PGROUP(M_EXEC); + if (buf->st_mode & S_ISGID) // suid; group + dir_entry->mode |= PGROUP(M_SUID);     // owner mode   if (buf->st_mode & S_IRUSR) @@ -1409 +1449 @@ int list_dir(char * dir_path) {   dir_entry->mode |= POWNER(M_WRITE);   if (buf->st_mode & S_IXUSR)   dir_entry->mode |= POWNER(M_EXEC); + if (buf->st_mode & S_ISUID) // suid + dir_entry->mode |= POWNER(M_SUID);   - if (buf->st_mode & S_ISUID) - dir_entry->mode |= M_SUID;    #if defined(__APPLE__) || defined(__MACH__)   dir_entry->mtime = buf->st_mtime; @@ -25534 +25940 @@ char * mode_to_s(struct dir_entry_t * f) {   char * p = s;   uint16_t mode = f->mode;   - char x = 'x'; - if (f->mode & M_SUID) x = 's'; -   if (f->file_type == FILE_DIR) *p++ = 'd';   else *p++ = '.';   + // owner mode   if (MOWNER(mode) & M_READ) *p++ = 'r';   else *p++ = '-';   if (MOWNER(mode) & M_WRITE) *p++ = 'w';   else *p++ = '-'; - if (MOWNER(mode) & M_EXEC) *p++ = x; - else if (mode & M_SUID) *p++ = 'S'; + if (MOWNER(mode) & M_EXEC) { + if (MOWNER(mode) & M_SUID) *p++ = 's'; + else *p++ = 'x'; + } else if (MOWNER(mode) & M_SUID) *p++ = 'S';   else *p++ = '-';   + // group mode   if (MGROUP(mode) & M_READ) *p++ = 'r';   else *p++ = '-';   if (MGROUP(mode) & M_WRITE) *p++ = 'w';   else *p++ = '-'; - if (MGROUP(mode) & M_EXEC) *p++ = x; - else if (mode & M_SUID) *p++ = 'S'; + if (MGROUP(mode) & M_EXEC) { + if (MGROUP(mode) & M_SUID) *p++ = 's'; + else *p++ = 's'; + } else if (MGROUP(mode) & M_SUID) *p++ = 'S';   else *p++ = '-';   + // other mode   if (mode & M_READ) *p++ = 'r';   else *p++ = '-';   if (mode & M_WRITE) *p++ = 'w';   else *p++ = '-'; - if (mode & M_EXEC) { if (mode & M_SUID) *p++ = 't'; else *p++ = 'x'; } - else if (mode & M_SUID) *p++ = 'T'; + if (mode & M_EXEC) { + if (mode & M_SUID) *p++ = 't'; + else *p++ = 'x'; + } else if (mode & M_SUID) *p++ = 'T';   else *p++ = '-';     *p++ = 0;