+/*
+ * Try to use external command to determine mime type, and possibly
+ * encoding. Caller is responsible for free'ing returned memory.
+ */
+static char *
+mime_type (const char *file_name) {
+ char *content_type = NULL; /* mime content type */
+
+#ifdef MIMETYPEPROC
+ char cmd[2 * PATH_MAX + 2]; /* file command buffer */
+ char buf[BUFSIZ >= 2048 ? BUFSIZ : 2048];
+ FILE *fp; /* content and pipe file pointer */
+ char mimetypeproc[] = MIMETYPEPROC " '%s'";
+
+ if ((int) snprintf (cmd, sizeof cmd, mimetypeproc, file_name) <
+ (int) sizeof cmd) {
+ if ((fp = popen (cmd, "r")) != NULL) {
+ if (fgets (buf, sizeof cmd, fp)) {
+ char *cp;
+
+ /* Skip leading <filename>:<whitespace>, if present. */
+ if ((content_type = strchr (buf, ':')) != NULL) {
+ ++content_type;
+ while (*content_type && isblank (*content_type)) {
+ ++content_type;
+ }
+ } else {
+ content_type = buf;
+ }
+
+ /* Truncate at newline (LF or CR), if present. */
+ if ((cp = strpbrk (content_type, "\n\n")) != NULL) {
+ *cp = '\0';
+ }
+ } else {
+ advise (NULL, "unable to read mime type");
+ }
+ } else {
+ advise (NULL, "unable to run %s", buf);
+ }
+ } else {
+ advise (NULL, "filename to large to deduce mime type");
+ }
+#else
+ NMH_UNUSED (file_name);
+#endif
+
+ return content_type ? strdup (content_type) : NULL;
+}
+