aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Arun Prakash Jana <engineerarun@gmail.com>2017-04-03 20:28:55 +0530
committerGravatar Arun Prakash Jana <engineerarun@gmail.com>2017-04-03 20:32:09 +0530
commit418c9f2654bf9f86f5de9d9e1575d9d1b0b29bfd (patch)
tree876200727228e6a1b624a52b14e1c80b4c751c19
parentf466ba543c9dbc59d753420196ddb0d42ca986ce (diff)
downloadnnn-418c9f2654bf9f86f5de9d9e1575d9d1b0b29bfd.tar.gz
Show stat, file, md5, sh256 in file details
This commit adds dependencies on file, openssl and cut binaries.
-rw-r--r--README.md2
-rw-r--r--nnn.c62
2 files changed, 57 insertions, 7 deletions
diff --git a/README.md b/README.md
index 35a2c83..7fdba0d 100644
--- a/README.md
+++ b/README.md
@@ -54,7 +54,7 @@ I chose to fork because:
- current item in reverse video
- number of items in current directory
- full name of currently selected file
- - Show details of the currently selected file
+ - Show details of the currently selected file (stat, file, md5, sha256)
- Directories first
- Sort numeric names in numeric order
- Case-insensitive alphabetic content listing instead of upper case first
diff --git a/nnn.c b/nnn.c
index 9f18584..d604e06 100644
--- a/nnn.c
+++ b/nnn.c
@@ -639,6 +639,8 @@ get_fileind(mode_t mode, char *desc)
if (S_ISREG(mode)) {
c = '-';
sprintf(desc, "%s", "regular file");
+ if (mode & S_IXUSR)
+ strcat(desc, ", executable");
} else if (S_ISDIR(mode)) {
c = 'd';
sprintf(desc, "%s", "directory");
@@ -703,14 +705,30 @@ get_lsperms(mode_t mode, char *desc)
return(bits);
}
+char *
+get_output(char *buf, size_t bytes)
+{
+ char *ret;
+ FILE *pf = popen(buf, "r");
+ if (pf) {
+ ret = fgets(buf, bytes, pf);
+ pclose(pf);
+ return ret;
+ }
+
+ return NULL;
+}
+
/*
* Follows the stat(1) output closely
*/
void
show_stats(char* fpath, char* fname, struct stat *sb)
{
- char buf[40];
+ char buf[PATH_MAX + 48];
char *perms = get_lsperms(sb->st_mode, buf);
+ FILE *pf;
+ char *p, *begin = buf;
clear();
@@ -718,11 +736,12 @@ show_stats(char* fpath, char* fname, struct stat *sb)
if (perms[0] == 'l') {
char symtgt[PATH_MAX];
ssize_t len = readlink(fpath, symtgt, PATH_MAX);
- if (len == -1)
- printerr(1, "readlink");
- printw("\n\n File: '%s' -> '%s'", fname, symtgt);
+ if (len != -1) {
+ symtgt[len] = '\0';
+ printw("\n\n File: '%s' -> '%s'", fname, symtgt);
+ }
} else
- printw("\n\n File: '%s'", fname);
+ printw("\n File: '%s'", fname);
/* Show size, blocks, file type */
printw("\n Size: %-15llu Blocks: %-10llu IO Block: %-6llu %s",
@@ -757,8 +776,39 @@ show_stats(char* fpath, char* fname, struct stat *sb)
strftime(buf, 40, "%a %d-%b-%Y %T %z,%Z", localtime(&sb->st_ctime));
printw("\n Change: %s", buf);
+ if (S_ISREG(sb->st_mode)) {
+ /* Show file(1) output */
+ sprintf(buf, "file -b %s 2>&1", fpath);
+ p = get_output(buf, PATH_MAX + 48);
+ if (p) {
+ printw("\n\n ");
+ while (*p) {
+ if (*p == ',') {
+ *p = '\0';
+ printw(" %s\n", begin);
+ begin = p + 1;
+ }
+
+ p++;
+ }
+ printw(" %s", begin);
+ }
+
+ /* Show md5 */
+ sprintf(buf, "openssl md5 %s 2>&1 | cut -d' ' -f2", fpath);
+ p = get_output(buf, PATH_MAX + 48);
+ if (p)
+ printw("\n md5: %s", p);
+
+ /* Show sha256 */
+ sprintf(buf, "openssl sha256 %s 2>&1| cut -d' ' -f2", fpath);
+ p = get_output(buf, PATH_MAX + 48);
+ if (p)
+ printw(" sha256: %s", p);
+ }
+
/* Show exit keys */
- printw("\n\n\n\n < (q/Esc)");
+ printw("\n\n << (q/Esc)");
while (*buf = getch())
if (*buf == 'q' || *buf == 27)