Thumbnail

rani/cscroll.git

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

commit dd47a26181bb0ec9a5d4946c3c9e89ac6411a6e0 Author: rani <clagv.randomgames@gmail.com> Date: Mon Jan 30 19:32:39 2023 +0000 Return unknown file when lstat() fails, show '???' for unknown fields 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) {