summaryrefslogtreecommitdiff
path: root/sys/src/cmd/file.c
diff options
context:
space:
mode:
authorkemal <kemali13@protonmail.com>2021-04-20 01:40:31 +0200
committerkemal <kemali13@protonmail.com>2021-04-20 01:40:31 +0200
commit2cdc8075f8109b69895bc56bd4d3f59deb6da360 (patch)
treea44371655f9e32d7efecd2cfd6f36b497c908572 /sys/src/cmd/file.c
parent52a367f3ea8b6fa256b2a9b0e52c5c2d557a9fc3 (diff)
file: recognize executable scripts, etc.
The patch does the following: 1. Adds recognition of executable script (shebang) files. 2. Returns correct MIME type for mbox files (RFC 4155). 3. Returns XML instead of HTML type in some cases.
Diffstat (limited to 'sys/src/cmd/file.c')
-rw-r--r--sys/src/cmd/file.c45
1 files changed, 40 insertions, 5 deletions
diff --git a/sys/src/cmd/file.c b/sys/src/cmd/file.c
index ba34eb009..99a693e12 100644
--- a/sys/src/cmd/file.c
+++ b/sys/src/cmd/file.c
@@ -169,6 +169,7 @@ int istar(void);
int isface(void);
int isexec(void);
int isudiff(void);
+int isexecscript(void);
int p9bitnum(char*, int*);
int p9subfont(uchar*);
void print_utf(void);
@@ -182,6 +183,7 @@ int (*call[])(void) =
istring, /* recognizable by first string */
iself, /* ELF (foreign) executable */
isexec, /* native executables */
+ isexecscript, /* executable scripts */
iff, /* interchange file format (strings) */
longoff, /* recognizable by 4 bytes at some offset */
isoffstr, /* recognizable by string at some offset */
@@ -722,6 +724,41 @@ isexec(void)
return 0;
}
+/* executable scripts */
+int
+isexecscript(void)
+{
+ char tmp[128+1], *p;
+
+ if (memcmp("#!", buf, 2) != 0)
+ return 0;
+ memmove(tmp, buf+2, sizeof(tmp) - 1);
+ tmp[sizeof(tmp) - 1] = 0;
+ if ((p = strchr(tmp, '\n')) != nil)
+ *p = 0;
+ if ((p = strpbrk(tmp, " \t")) != nil)
+ *p = 0;
+ if ((p = strrchr(tmp, '/')) != nil)
+ p++;
+ else
+ p = tmp;
+
+ if (strcmp("rc", p) == 0)
+ print("%s\n", mime ? PLAIN : "rc executable file");
+ else if (strcmp("sh", p) == 0)
+ print("%s\n", mime ? "application/x-sh" : "sh executable file");
+ else if (strcmp("bash", p) == 0)
+ print("%s\n", mime ? "application/x-sh" : "bash executable file");
+ else if (strcmp("awk", p) == 0)
+ print("%s\n", mime ? PLAIN : "awk executable file");
+ else if (strcmp("sed", p) == 0)
+ print("%s\n", mime ? PLAIN : "sed executable file");
+ else if (strcmp("perl", p) == 0)
+ print("%s\n", mime ? PLAIN : "perl executable file");
+ else
+ print("%s\n", mime ? PLAIN : "unknown executable file");
+ return 1;
+}
/* from tar.c */
enum { NAMSIZ = 100, TBLOCK = 512 };
@@ -805,8 +842,6 @@ struct FILE_STRING
"!<arch>\n__.SYMDEF", "archive random library", 16, OCTET,
"!<arch>\n", "archive", 8, OCTET,
"070707", "cpio archive - ascii header", 6, OCTET,
- "#!/bin/rc", "rc executable file", 9, PLAIN,
- "#!/bin/sh", "sh executable file", 9, PLAIN,
"%!", "postscript", 2, "application/postscript",
"\004%!", "postscript", 3, "application/postscript",
"x T post", "troff output for post", 8, "application/troff",
@@ -820,10 +855,10 @@ struct FILE_STRING
"%PDF", "PDF", 4, "application/pdf",
"<!DOCTYPE", "HTML file", 9, "text/html",
"<!doctype", "HTML file", 9, "text/html",
- "<!--", "HTML file", 4, "text/html",
+ "<!--", "XML file", 4, "text/xml",
"<html>", "HTML file", 6, "text/html",
"<HTML>", "HTML file", 6, "text/html",
- "<?xml", "HTML file", 5, "text/html",
+ "<?xml", "XML file", 5, "text/xml",
"\111\111\052\000", "tiff", 4, "image/tiff",
"\115\115\000\052", "tiff", 4, "image/tiff",
"\377\330\377\340", "jpeg", 4, "image/jpeg",
@@ -1108,7 +1143,7 @@ ismbox(void)
return 0;
*q = 0;
if(strncmp(p, "From ", 5) == 0 && strstr(p, " remote from ") == nil){
- print("%s\n", mime ? PLAIN : "mail box");
+ print("%s\n", mime ? "application/mbox" : "mail box");
return 1;
}
*q = '\n';