commit dd47a26181bb0ec9a5d4946c3c9e89ac6411a6e0
Author: rani <clagv.randomgames@gmail.com>
Date: Mon Jan 30 19:32:39 2023 +0000
diff --git a/include/io.h b/include/io.h
index 345575d..ba4028a 100644
--- a/include/io.h
+++ b/include/io.h
@@ -978 +978 @@ void print_oneshot(void);
enum colors get_file_color(struct dir_entry_t *);
char get_file_ident(struct dir_entry_t *);
size_t get_ilen(long, int);
-char * get_oname(uid_t);
-char * get_gname(gid_t);
+char * get_oname(struct dir_entry_t *);
+char * get_gname(struct dir_entry_t *);
extern bool print_path;
diff --git a/src/dir.c b/src/dir.c
index f35813a..681d5b3 100644
--- a/src/dir.c
+++ b/src/dir.c
@@ -5423 +5434 @@ struct dir_entry_t * gen_dir_entry(char * dir_path, char * d_name) {
struct dir_entry_t * dir_entry = malloc(sizeof(struct dir_entry_t) + 12);
size_t d_name_len = strlen(d_name);
+ dir_entry->name = malloc(d_name_len + 1);
+ strcpy(dir_entry->name, d_name);
+
+ // figure out file 'mime' type
+ dir_entry->m_type = get_mime(dir_entry->name);
+
+ dir_entry->file_type = FILE_UNKNOWN;
+ dir_entry->under_link = FILE_UNKNOWN;
+ dir_entry->mode = 0;
+ dir_entry->mtime = 0;
+ dir_entry->owner = 0;
+ dir_entry->group = 0;
+ dir_entry->size = 0;
+ dir_entry->u_size = B;
+
+ dir_entry->marked = false;
+ dir_entry->last_in_col = false;
struct stat * buf = malloc(sizeof(struct stat));
char * tmp_path = malloc(d_name_len + strlen(dir_path) + 2);
sprintf(tmp_path, "%s/%s", dir_path, d_name);
if (lstat(tmp_path, buf) == -1) {
- free(dir_entry);
free(buf);
free(tmp_path);
- return NULL;
+ return dir_entry;
}
- dir_entry->name = malloc(d_name_len + 1);
- strcpy(dir_entry->name, d_name);
-
- dir_entry->file_type = FILE_UNKNOWN;
- dir_entry->under_link = FILE_UNKNOWN;
switch(buf->st_mode & S_IFMT) {
case S_IFBLK:
case S_IFCHR:
@@ -1018 +1126 @@ struct dir_entry_t * gen_dir_entry(char * dir_path, char * d_name) {
break;
}
- dir_entry->mode = 0;
-
// other mode
if (buf->st_mode & S_IROTH)
dir_entry->mode |= M_READ;
@@ -1577 +1666 @@ struct dir_entry_t * gen_dir_entry(char * dir_path, char * d_name) {
if (gr_l > dir_longest_group) dir_longest_group = gr_l;
dir_entry->size = buf->st_size;
- dir_entry->u_size = B;
for (int i = 0; i <= PB; i++) {
if (dir_entry->size < 1000) break;
@@ -16812 +1766 @@ struct dir_entry_t * gen_dir_entry(char * dir_path, char * d_name) {
free(tmp_path);
free(buf);
- // figure out file 'mime' type
- dir_entry->m_type = get_mime(dir_entry->name);
-
- dir_entry->marked = false;
- dir_entry->last_in_col = false;
-
return dir_entry;
}
@@ -20311 +2056 @@ int list_dir(char * dir_path) {
struct dir_entry_t * dir_entry = gen_dir_entry(dir_path, d_name);
- if (!dir_entry) {
- display_info(INFO_WARN, strerror(errno));
- continue;
- }
-
dir_entries = realloc(dir_entries, sizeof(struct dir_entry_t*) * (n_dir_entries + 1));
dir_entries[n_dir_entries] = dir_entry;
n_dir_entries++;
@@ -2966 +29312 @@ void remove_marked(void) {
char * mode_to_s(struct dir_entry_t * f) {
char * s = malloc(11);
+
+ if (f->file_type == FILE_UNKNOWN) {
+ strcpy(s, "??????????");
+ return s;
+ }
+
char * p = s;
uint16_t mode = f->mode;
diff --git a/src/io.c b/src/io.c
index 50ab524..38a314b 100644
--- a/src/io.c
+++ b/src/io.c
@@ -1418 +1418 @@ void curses_write_file(struct dir_entry_t * dir_entry, bool highlight) {
char * icon = NULL;
#endif
char * smode = NULL;
- char * owner = get_oname(dir_entry->owner);
- char * group = get_gname(dir_entry->group);
+ char * owner = get_oname(dir_entry);
+ char * group = get_gname(dir_entry);
char * size = NULL;
char time[128];
@@ -7527 +75210 @@ size_t get_ilen(long i, int base) {
}
-char * get_oname(uid_t uid) {
+char * get_oname(struct dir_entry_t * de) {
+ if (de->file_type == FILE_UNKNOWN) return strdup("?");
+
+ uid_t uid = de->owner;
char * buf = NULL;
struct passwd * pw = getpwuid(uid);
if (!pw) {
@@ -7667 +76910 @@ char * get_oname(uid_t uid) {
}
-char * get_gname(gid_t gid) {
+char * get_gname(struct dir_entry_t * de) {
+ if (de->file_type == FILE_UNKNOWN) return strdup("?");
+
+ gid_t gid = de->group;
char * buf = NULL;
struct group * gr = getgrgid(gid);
if (!gr) {