commit a190fefeb2c6ae7cdc9ef53f518015766d5a7d38
Author: rani <clagv.randomgames@gmail.com>
Date: Tue Jun 28 21:13:51 2022 +0000
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;