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);
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);
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};
int stop = 0;
while (!stop) {
+ /* display panes */
for (i = 0; i < MAXPANES; i++) {
if (list[i] == NULL) {
list[i] = exploredir (dirname[i]);
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':
#include <dirent.h>
+#include <grp.h>
+#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
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);
}
list_t *exploredir (char *dirname);
+void getinfo (char *dirname, elem_t *elem);
+
void freelist (list_t *list);
window_t *allocwindow (void);
} 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 {