wip
authorLaurent Mazet <mazet@softndesign.org>
Sat, 4 Jan 2025 20:35:46 +0000 (21:35 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sat, 4 Jan 2025 20:35:46 +0000 (21:35 +0100)
display.c
display.h
fm.c
function.c
function.h
type.h

index 731c75229e32a8c93060f14d941227115139cdea..3fcfbe87027116ec5ac3304e50a6d0a094a1e191 100644 (file)
--- 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);
index cb23d4ac903d6c6491e45800734e157d272646bd..e189ea80da1ac88351f409d8094061c846b24be3 100644 (file)
--- 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 c12ec51b975192946e869b4a8cac34faeeafde53..aebadbba2dc2857e07ddc6b3493aa7e1cb312398 100644 (file)
--- 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':
index 8376a9c554665e47a2f53c5e003b3d04e0f807ab..0b706458d895910093461078490d6d237de9ade2 100644 (file)
@@ -1,4 +1,6 @@
 #include <dirent.h>
+#include <grp.h>
+#include <pwd.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -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);
     }
index fb4b46ae120cdcc22ebff54efed942340e2bec4e..78c88babe997d1a5da11a11fcb8c5aec152dfd51 100644 (file)
@@ -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 af34ba36da261bbf241a2b729fee1fa9d42c919d..d4167bed7ac6eac37d072490c837ec88fcc61c7e 100644 (file)
--- 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 {