From f706565148494ac35945bb143ba8ff7bf71729f7 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sat, 4 Jan 2025 21:35:46 +0100 Subject: [PATCH] wip --- display.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ display.h | 2 ++ fm.c | 13 ++++++++++++ function.c | 45 ++++++++++++++++++++++++++++++++++++++++ function.h | 2 ++ type.h | 7 ++++--- 6 files changed, 126 insertions(+), 3 deletions(-) diff --git a/display.c b/display.c index 731c752..3fcfbe8 100644 --- a/display.c +++ b/display.c @@ -214,6 +214,66 @@ void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *in set_color (white); } +void elementwindow (window_t *win, elem_t *elem) +{ + char buf[64] = {0}; + int pos = 0; + switch (elem->type) { + case type_unkn_e: + mvaddstr (win->yoffset, win->xoffset + pos, "Unknown"); + pos += 7; + break; + case type_block_e: + mvaddstr (win->yoffset, win->xoffset + pos, "Block dev"); + pos += 9; + break; + case type_char_e: + mvaddstr (win->yoffset, win->xoffset + pos, "Char dev"); + pos += 8; + break; + case type_dir_e: + mvaddstr (win->yoffset, win->xoffset + pos, "Directory"); + pos += 9; + break; + case type_pipe_e: + mvaddstr (win->yoffset, win->xoffset + pos, "Pipe"); + pos += 4; + break; + case type_symb_e: + mvaddstr (win->yoffset, win->xoffset + pos, "Link"); + pos += 4; + break; + case type_reg_e: + if (elem->size < 10000) { + sprintf (buf, "%d B", elem->size); + } else if (elem->size < 10000 * 1024) { + sprintf (buf, "%d kB", elem->size / 1024); + } else if (elem->size < 10000 * 1024 * 1024) { + sprintf (buf, "%d MB", elem->size / 1024 / 1024); + } else if (elem->size < 10000 * 1024 * 1024 * 1024) { + sprintf (buf, "%d GB", elem->size / 1024 / 1024 / 1024); + } else { + sprintf (buf, "%d TB", elem->size / 1024 / 1024 / 1024 / 1024); + } + mvaddstr (win->yoffset, win->xoffset + pos, buf); + pos += strlen (buf); + break; + case type_socket_e: + mvaddstr (win->yoffset, win->xoffset + pos, "Socket"); + pos += 6; + break; + } + pos += 1; + + mvaddstr (win->yoffset, win->xoffset + pos, elem->uid); + pos += strlen (elem->uid); + mvaddch (win->yoffset, win->xoffset + pos, '/'); + pos += 1; + mvaddstr (win->yoffset, win->xoffset + pos, elem->gid); + pos += strlen (elem->gid); + pos += 1; +} + char *getwindow (int length, int xoffset, int yoffset) { char *name = (char *) calloc (1, length + 1); diff --git a/display.h b/display.h index cb23d4a..e189ea8 100644 --- a/display.h +++ b/display.h @@ -10,6 +10,8 @@ int helpwindow (char *msg, int xoffset, int yoffset); void displaywindow (window_t *win, list_t *list, int page, int *index_x, int *index_y); +void elementwindow (window_t *win, elem_t *elem); + char *getwindow (int length, int xoffset, int yoffset); void msgwindow (char *msg, int xoffset, int yoffset, int length); diff --git a/fm.c b/fm.c index c12ec51..aebadbb 100644 --- a/fm.c +++ b/fm.c @@ -124,6 +124,11 @@ int main (int argc, char *argv[]) windir[i]->yoffset = yoffset; windir[i]->ysize = LINES - 2 * yoffset; } + window_t *winelem = allocwindow (); + winelem->xoffset = 0; + winelem->xsize = COLS; + winelem->yoffset = LINES - 1; + winelem->ysize = 1; list_t *list[MAXPANES] = {0}; int page[MAXPANES] = {0}; @@ -134,6 +139,7 @@ int main (int argc, char *argv[]) int stop = 0; while (!stop) { + /* display panes */ for (i = 0; i < MAXPANES; i++) { if (list[i] == NULL) { list[i] = exploredir (dirname[i]); @@ -152,6 +158,13 @@ int main (int argc, char *argv[]) displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i]); } + /* display info */ + elem_t *current = list[pane]->tab + windir[pane]->index; + if (current->uid == NULL) { + getinfo (dirname[pane], current); + } + elementwindow (winelem, current); + int ch = getch (); switch (ch) { case '\n': diff --git a/function.c b/function.c index 8376a9c..0b70645 100644 --- a/function.c +++ b/function.c @@ -1,4 +1,6 @@ #include +#include +#include #include #include #include @@ -160,11 +162,54 @@ list_t *exploredir (char *dirname) return list; } +int _log10 (int x) +{ + int l = 0; + while (x > 10) { + x /= 10; + l++; + } + return l + 1; +} + +void getinfo (char *dirname, elem_t *elem) +{ + char *name = newfilename (dirname, elem->name); + + struct stat sb; + if (lstat (name, &sb) == -1) { + VERBOSE (ERROR, fprintf (stderr, "can't stat on file '%s%s%s'\n", dirname, SEPARATOR, elem->name)); + exit (1); + } + + elem->mode = 0777 & sb.st_mode; + + struct passwd *pwd = getpwuid (sb.st_uid); + if (pwd) { + elem->uid = strdup (pwd->pw_name); + } else { + elem->uid = (char *) calloc (_log10 (sb.st_uid) + 1, 1); + sprintf (elem->uid, "%d", sb.st_uid); + } + + struct group *grp = getgrgid (sb.st_gid); + if (grp) { + elem->gid = strdup (grp->gr_name); + } else { + elem->gid = (char *) calloc (_log10 (sb.st_gid) + 1, 1); + sprintf (elem->gid, "%d", sb.st_gid); + } + + elem->nlk = sb.st_nlink; +} + void freelist (list_t *list) { if (list) { while (list->nb--) { + free ((list->tab + list->nb)->gid); free ((list->tab + list->nb)->name); + free ((list->tab + list->nb)->uid); } free (list->tab); } diff --git a/function.h b/function.h index fb4b46a..78c88ba 100644 --- a/function.h +++ b/function.h @@ -23,6 +23,8 @@ list_t *alloclist (void); list_t *exploredir (char *dirname); +void getinfo (char *dirname, elem_t *elem); + void freelist (list_t *list); window_t *allocwindow (void); diff --git a/type.h b/type.h index af34ba3..d4167be 100644 --- a/type.h +++ b/type.h @@ -13,12 +13,13 @@ typedef enum { } type_t; typedef struct { - //char *gid; - //unsigned short mode; + char *gid; + unsigned short mode; char *name; + int nlk; size_t size; type_t type; - //char *uid; + char *uid; } elem_t; typedef struct { -- 2.30.2