X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuhttpd.git;a=blobdiff_plain;f=file.c;h=9268577f833342bba95c00472e56b8f22eca7d83;hp=62c8ee7ce991d587515a9056a4fa2bbf4331339f;hb=0a6fa62baa6d21455485bc6669f4e5f3b6608487;hpb=76f5d84671a258274b0b647d234431ad70b4553e diff --git a/file.c b/file.c index 62c8ee7..9268577 100644 --- a/file.c +++ b/file.c @@ -30,7 +30,6 @@ #include "uhttpd.h" #include "mimetypes.h" -static char _tag[128]; static LIST_HEAD(index_files); static LIST_HEAD(dispatch_handlers); @@ -247,10 +246,6 @@ uh_path_lookup(struct client *cl, const char *url) return p.phys ? &p : NULL; } -#ifdef __APPLE__ -time_t timegm (struct tm *tm); -#endif - static const char * uh_file_mime_lookup(const char *path) { struct mimetype *m = &uh_mime_types[0]; @@ -272,14 +267,14 @@ static const char * uh_file_mime_lookup(const char *path) return "application/octet-stream"; } -static const char * uh_file_mktag(struct stat *s) +static const char * uh_file_mktag(struct stat *s, char *buf) { - snprintf(_tag, sizeof(_tag), "\"%x-%x-%x\"", + snprintf(buf, sizeof(buf), "\"%x-%x-%x\"", (unsigned int) s->st_ino, (unsigned int) s->st_size, (unsigned int) s->st_mtime); - return _tag; + return buf; } static time_t uh_file_date2unix(const char *date) @@ -294,13 +289,13 @@ static time_t uh_file_date2unix(const char *date) return 0; } -static char * uh_file_unix2date(time_t ts) +static char * uh_file_unix2date(time_t ts, char *buf, int len) { struct tm *t = gmtime(&ts); - strftime(_tag, sizeof(_tag), "%a, %d %b %Y %H:%M:%S GMT", t); + strftime(buf, len, "%a, %d %b %Y %H:%M:%S GMT", t); - return _tag; + return buf; } static char *uh_file_header(struct client *cl, int idx) @@ -313,12 +308,15 @@ static char *uh_file_header(struct client *cl, int idx) static void uh_file_response_ok_hdrs(struct client *cl, struct stat *s) { + char buf[128]; + if (s) { - ustream_printf(cl->us, "ETag: %s\r\n", uh_file_mktag(s)); + ustream_printf(cl->us, "ETag: %s\r\n", uh_file_mktag(s, buf)); ustream_printf(cl->us, "Last-Modified: %s\r\n", - uh_file_unix2date(s->st_mtime)); + uh_file_unix2date(s->st_mtime, buf, sizeof(buf))); } - ustream_printf(cl->us, "Date: %s\r\n", uh_file_unix2date(time(NULL))); + ustream_printf(cl->us, "Date: %s\r\n", + uh_file_unix2date(time(NULL), buf, sizeof(buf))); } static void uh_file_response_200(struct client *cl, struct stat *s) @@ -341,7 +339,8 @@ static void uh_file_response_412(struct client *cl) static bool uh_file_if_match(struct client *cl, struct stat *s) { - const char *tag = uh_file_mktag(s); + char buf[128]; + const char *tag = uh_file_mktag(s, buf); char *hdr = uh_file_header(cl, HDR_IF_MATCH); char *p; int i; @@ -381,7 +380,8 @@ static int uh_file_if_modified_since(struct client *cl, struct stat *s) static int uh_file_if_none_match(struct client *cl, struct stat *s) { - const char *tag = uh_file_mktag(s); + char buf[128]; + const char *tag = uh_file_mktag(s, buf); char *hdr = uh_file_header(cl, HDR_IF_NONE_MATCH); char *p; int i; @@ -442,10 +442,11 @@ static void uh_file_dirlist(struct client *cl, struct path_info *pi) { int i; int count = 0; - char filename[PATH_MAX]; + char *filename = uh_buf; char *pathptr; struct dirent **files = NULL; struct stat s; + char buf[128]; uh_file_response_200(cl, NULL); ustream_printf(cl->us, "Content-Type: text/html\r\n\r\n"); @@ -458,14 +459,16 @@ static void uh_file_dirlist(struct client *cl, struct path_info *pi) if ((count = scandir(pi->phys, &files, uh_file_scandir_filter_dir, alphasort)) > 0) { - memset(filename, 0, sizeof(filename)); - memcpy(filename, pi->phys, sizeof(filename)); - pathptr = &filename[strlen(filename)]; + int len; + + strcpy(filename, pi->phys); + len = strlen(filename); + pathptr = filename + len; + len = PATH_MAX - len; /* list subdirs */ for (i = 0; i < count; i++) { - strncat(filename, files[i]->d_name, - sizeof(filename) - strlen(files[i]->d_name)); + snprintf(pathptr, len, "%s", files[i]->d_name); if (!stat(filename, &s) && (s.st_mode & S_IFDIR) && (s.st_mode & S_IXOTH)) @@ -476,7 +479,7 @@ static void uh_file_dirlist(struct client *cl, struct path_info *pi) "
", pi->name, files[i]->d_name, files[i]->d_name, - uh_file_unix2date(s.st_mtime), + uh_file_unix2date(s.st_mtime, buf, sizeof(buf)), s.st_size / 1024.0); *pathptr = 0; @@ -484,8 +487,7 @@ static void uh_file_dirlist(struct client *cl, struct path_info *pi) /* list files */ for (i = 0; i < count; i++) { - strncat(filename, files[i]->d_name, - sizeof(filename) - strlen(files[i]->d_name)); + snprintf(pathptr, len, "%s", files[i]->d_name); if (!stat(filename, &s) && !(s.st_mode & S_IFDIR) && (s.st_mode & S_IROTH)) @@ -496,7 +498,7 @@ static void uh_file_dirlist(struct client *cl, struct path_info *pi) "
", pi->name, files[i]->d_name, files[i]->d_name, - uh_file_unix2date(s.st_mtime), + uh_file_unix2date(s.st_mtime, buf, sizeof(buf)), uh_file_mime_lookup(filename), s.st_size / 1024.0);