commit a0daeca932a40c97694bc1596ca5f4b275252b29
Author: rani <clagv.randomgames@gmail.com>
Date: Thu Jan 12 21:27:14 2023 +0000
diff --git a/include/dir.h b/include/dir.h
index d77b5a4..777520c 100644
--- a/include/dir.h
+++ b/include/dir.h
@@ -517 +517 @@ struct dir_entry_t {
time_t mtime;
long owner;
long group;
- int size;
+ size_t size;
enum f_size u_size;
// oneshot args
diff --git a/include/io.h b/include/io.h
index 2a94694..82072f6 100644
--- a/include/io.h
+++ b/include/io.h
@@ -36 +37 @@
#include <stdbool.h>
#include <stdio.h>
+#include <sys/types.h>
#include "dir.h"
@@ -746 +759 @@ void resize_fbufcur(long);
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);
extern bool print_path;
diff --git a/src/dir.c b/src/dir.c
index e02a400..6c19233 100644
--- a/src/dir.c
+++ b/src/dir.c
@@ -13813 +13822 @@ struct dir_entry_t * gen_dir_entry(char * dir_path, char * d_name) {
#else
dir_entry->mtime = buf->st_mtim.tv_sec;
#endif
- size_t n;
+
dir_entry->owner = buf->st_uid;
- if ((n = strlen(getpwuid(buf->st_uid)->pw_name)) > dir_longest_owner)
- dir_longest_owner = n;
dir_entry->group = buf->st_gid;
- if ((n = strlen(getgrgid(buf->st_gid)->gr_name)) > dir_longest_group)
- dir_longest_group = n;
+
+ struct passwd * pw = getpwuid(buf->st_uid);
+ size_t pw_l = 0;
+ if (!pw) pw_l = get_ilen(buf->st_uid, 10);
+ else pw_l = strlen(pw->pw_name);
+
+ struct group * gr = getgrgid(buf->st_gid);
+ size_t gr_l = 0;
+ if (!gr) gr_l = get_ilen(buf->st_gid, 10);
+ else gr_l = strlen(gr->gr_name);
+
+ if (pw_l > dir_longest_owner) dir_longest_owner = pw_l;
+ if (gr_l > dir_longest_group) dir_longest_group = gr_l;
dir_entry->size = buf->st_size;
dir_entry->u_size = B;
diff --git a/src/io.c b/src/io.c
index f558667..97a3331 100644
--- a/src/io.c
+++ b/src/io.c
@@ -1388 +1388 @@ void curses_write_file(struct dir_entry_t * dir_entry, bool highlight) {
char * icon = NULL;
#endif
char * smode = NULL;
- char * owner = getpwuid(dir_entry->owner)->pw_name;
- char * group = getgrgid(dir_entry->group)->gr_name;
+ char * owner = get_oname(dir_entry->owner);
+ char * group = get_gname(dir_entry->group);
char * size = NULL;
char time[128];
@@ -2146 +2149 @@ void curses_write_file(struct dir_entry_t * dir_entry, bool highlight) {
printw("%c %s", f_ident, u_text);
addch('\n');
+
+ free(owner);
+ free(group);
}
@@ -5417 +5447 @@ void print_oneshot(void) {
if (n < dir_longest_owner) padstr(dir_longest_owner - n);
// print rest of the long mode info
- printf(" %4d %-2s %s %s%s %s%s%c %s\n",
+ printf(" %4lu %-2s %s %s%s %s%s%c %s\n",
de->size, size, time, fcolor, icon, de->name,
ANSI_RESET, f_ident, u_text);
}
@@ -7183 +72143 @@ char get_file_ident(struct dir_entry_t * de) {
return f_ident;
}
+
+
+size_t get_ilen(long i, int base) {
+ size_t l = 0;
+
+ while (i > 0) {
+ i /= base;
+ l++;
+ }
+
+ return l;
+}
+
+
+char * get_oname(uid_t uid) {
+ char * buf = NULL;
+ struct passwd * pw = getpwuid(uid);
+ if (!pw) {
+ buf = malloc(get_ilen(uid, 10) + 1);
+ sprintf(buf, "%d", uid);
+ } else {
+ buf = malloc(strlen(pw->pw_name) + 1);
+ strcpy(buf, pw->pw_name);
+ }
+ return buf;
+}
+
+
+char * get_gname(gid_t gid) {
+ char * buf = NULL;
+ struct group * gr = getgrgid(gid);
+ if (!gr) {
+ buf = malloc(get_ilen(gid, 10) + 1);
+ sprintf(buf, "%d", gid);
+ } else {
+ buf = malloc(strlen(gr->gr_name) + 1);
+ strcpy(buf, gr->gr_name);
+ }
+ return buf;
+}