Removed the unused strrcmp from sendfile.
[ashd.git] / src / sendfile.c
index 4ec25a6..ce422e2 100644 (file)
 #include <log.h>
 #include <resp.h>
 
+#ifdef HAVE_XATTR
+#include <attr/xattr.h>
+#endif
+
 static magic_t cookie = NULL;
 
 static void passdata(int in, int out)
@@ -61,15 +65,40 @@ static void passdata(int in, int out)
     free(buf);
 }
 
-static int strrcmp(char *str, char *end)
+static char *attrmimetype(char *file)
 {
-    return(strcmp(str + strlen(str) - strlen(end), end));
+#ifdef HAVE_XATTR
+    static char buf[1024];
+    int i;
+    ssize_t sz;
+    
+    if((sz = getxattr(file, "user.ash-mime-type", buf, sizeof(buf) - 1)) > 0)
+       goto found;
+    if((sz = getxattr(file, "user.mime-type", buf, sizeof(buf) - 1)) > 0)
+       goto found;
+    if((sz = getxattr(file, "user.mime_type", buf, sizeof(buf) - 1)) > 0)
+       goto found;
+    if((sz = getxattr(file, "user.Content-Type", buf, sizeof(buf) - 1)) > 0)
+       goto found;
+    return(NULL);
+found:
+    for(i = 0; i < sz; i++) {
+       if((buf[sz] < 32) || (buf[sz] >= 128))
+           return(NULL);
+    }
+    buf[sz] = 0;
+    return(buf);
+#else
+    return(NULL);
+#endif
 }
 
 static const char *getmimetype(char *file, struct stat *sb)
 {
     const char *ret;
     
+    if((ret = attrmimetype(file)) != NULL)
+       return(ret);
     if(cookie == NULL) {
        cookie = magic_open(MAGIC_MIME_TYPE);
        magic_load(cookie, NULL);
@@ -86,10 +115,10 @@ static void checkcache(char *file, struct stat *sb)
     if((hdr = getenv("REQ_IF_MODIFIED_SINCE")) != NULL) {
        if(parsehttpdate(hdr) < sb->st_mtime)
            return;
-       printf("HTTP/1.1 304 Not Modified\r\n");
-       printf("Date: %s\r\n", fmthttpdate(time(NULL)));
-       printf("Content-Length: 0\r\n");
-       printf("\r\n");
+       printf("HTTP/1.1 304 Not Modified\n");
+       printf("Date: %s\n", fmthttpdate(time(NULL)));
+       printf("Content-Length: 0\n");
+       printf("\n");
        exit(0);
     }
 }
@@ -141,12 +170,12 @@ int main(int argc, char **argv)
     
     checkcache(file, &sb);
     
-    printf("HTTP/1.1 200 OK\r\n");
-    printf("Content-Type: %s\r\n", contype);
-    printf("Content-Length: %ji\r\n", (intmax_t)sb.st_size);
-    printf("Last-Modified: %s\r\n", fmthttpdate(sb.st_mtime));
-    printf("Date: %s\r\n", fmthttpdate(time(NULL)));
-    printf("\r\n");
+    printf("HTTP/1.1 200 OK\n");
+    printf("Content-Type: %s\n", contype);
+    printf("Content-Length: %ji\n", (intmax_t)sb.st_size);
+    printf("Last-Modified: %s\n", fmthttpdate(sb.st_mtime));
+    printf("Date: %s\n", fmthttpdate(time(NULL)));
+    printf("\n");
     fflush(stdout);
     if(strcasecmp(argv[optind], "head"))
        passdata(fd, 1);