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");
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();
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",
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)