]> gitweb.ps.run Git - ps-cgit/blobdiff - shared.c
ui-shared: fix resource leak: free allocation from cgit_hosturl
[ps-cgit] / shared.c
index 3bd2a9e3dadd39282712f297218433cdfcdb34d1..e216c642a4f374c4e7fce922c66c31527eb6b522 100644 (file)
--- a/shared.c
+++ b/shared.c
@@ -560,3 +560,42 @@ char *expand_macros(const char *txt)
        }
        return result;
 }
        }
        return result;
 }
+
+char *get_mimetype_for_filename(const char *filename)
+{
+       char *ext, *mimetype, *token, line[1024], *saveptr;
+       FILE *file;
+       struct string_list_item *mime;
+
+       if (!filename)
+               return NULL;
+
+       ext = strrchr(filename, '.');
+       if (!ext)
+               return NULL;
+       ++ext;
+       if (!ext[0])
+               return NULL;
+       mime = string_list_lookup(&ctx.cfg.mimetypes, ext);
+       if (mime)
+               return xstrdup(mime->util);
+
+       if (!ctx.cfg.mimetype_file)
+               return NULL;
+       file = fopen(ctx.cfg.mimetype_file, "r");
+       if (!file)
+               return NULL;
+       while (fgets(line, sizeof(line), file)) {
+               if (!line[0] || line[0] == '#')
+                       continue;
+               mimetype = strtok_r(line, " \t\r\n", &saveptr);
+               while ((token = strtok_r(NULL, " \t\r\n", &saveptr))) {
+                       if (!strcasecmp(ext, token)) {
+                               fclose(file);
+                               return xstrdup(mimetype);
+                       }
+               }
+       }
+       fclose(file);
+       return NULL;
+}