shithub: plan9front

Download patch

ref: 2cdc8075f8109b69895bc56bd4d3f59deb6da360
parent: 52a367f3ea8b6fa256b2a9b0e52c5c2d557a9fc3
author: kemal <kemali13@protonmail.com>
date: Mon Apr 19 19:40:31 EDT 2021

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.

--- a/sys/src/cmd/file.c	Sun Apr 18 10:20:04 2021
+++ b/sys/src/cmd/file.c	Mon Apr 19 19:40:31 2021
@@ -169,6 +169,7 @@
 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 @@
 	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 @@
 	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 @@
 	"!<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 @@
 	"%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 @@
 		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';