Changeset 20884


Ignore:
Timestamp:
2010-04-15T21:53:29+02:00 (7 years ago)
Author:
jow
Message:

[backfire] merge r20883

Location:
branches/backfire/package/uhttpd
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • branches/backfire/package/uhttpd/Makefile

    r20672 r20884  
    99 
    1010PKG_NAME:=uhttpd 
    11 PKG_RELEASE:=7 
     11PKG_RELEASE:=8 
    1212 
    1313PKG_BUILD_DIR := $(BUILD_DIR)/$(PKG_NAME) 
  • branches/backfire/package/uhttpd/files/uhttpd.config

    r20500 r20884  
    3030        # CGI/Lua timeout, if the called script does not 
    3131        # write data within the given amount of seconds, 
    32         # the server will temrinate the request with 
     32        # the server will terminate the request with 
    3333        # 504 Gateway Timeout response. 
    3434        option script_timeout   60 
     35 
     36        # Network timeout, if the current connection is 
     37        # blocked for the specified amount of seconds, 
     38        # the server will terminate the associated 
     39        # request process. 
     40        option network_timeout  30 
    3541 
    3642        # Basic auth realm, defaults to local hostname 
  • branches/backfire/package/uhttpd/files/uhttpd.init

    r20672 r20884  
    5959        append_arg "$cfg" lua_handler "-L" 
    6060        append_arg "$cfg" script_timeout "-t" 
     61        append_arg "$cfg" network_timeout "-T" 
    6162 
    6263        config_get http "$cfg" listen_http 
  • branches/backfire/package/uhttpd/src/uhttpd-file.c

    r20428 r20884  
    3030{ 
    3131        struct mimetype *m = &uh_mime_types[0]; 
    32         char *p, *pd, *ps; 
    33  
    34         ps = strrchr(path, '/'); 
    35         pd = strrchr(path, '.'); 
    36  
    37         /* use either slash or dot as separator, whatever comes last */ 
    38         p = (ps && pd && (ps > pd)) ? ps : pd; 
    39  
    40         if( (p != NULL) && (*(++p) != 0) ) 
    41         { 
    42                 while( m->extn ) 
    43                 { 
    44                         if( ! strcasecmp(p, m->extn) ) 
     32        char *e; 
     33 
     34        while( m->extn ) 
     35        { 
     36                e = &path[strlen(path)-1]; 
     37 
     38                while( e >= path ) 
     39                { 
     40                        if( (*e == '.') && !strcasecmp(&e[1], m->extn) ) 
    4541                                return m->mime; 
    4642 
    47                         m++; 
    48                 } 
     43                        e--; 
     44                } 
     45 
     46                m++; 
    4947        } 
    5048 
  • branches/backfire/package/uhttpd/src/uhttpd-mimetypes.h

    r20428 r20884  
    2121static struct mimetype uh_mime_types[] = { 
    2222 
    23         { "txt",    "text/plain" }, 
    24         { "log",    "text/plain" }, 
    25         { "js",     "text/javascript" }, 
    26         { "css",    "text/css" }, 
    27         { "htm",    "text/html" }, 
    28         { "html",   "text/html" }, 
    29         { "diff",   "text/x-patch" }, 
    30         { "patch",  "text/x-patch" }, 
    31         { "c",      "text/x-csrc" }, 
    32         { "h",      "text/x-chdr" }, 
    33         { "o",      "text/x-object" }, 
    34         { "ko",     "text/x-object" }, 
     23        { "txt",     "text/plain" }, 
     24        { "log",     "text/plain" }, 
     25        { "js",      "text/javascript" }, 
     26        { "css",     "text/css" }, 
     27        { "htm",     "text/html" }, 
     28        { "html",    "text/html" }, 
     29        { "diff",    "text/x-patch" }, 
     30        { "patch",   "text/x-patch" }, 
     31        { "c",       "text/x-csrc" }, 
     32        { "h",       "text/x-chdr" }, 
     33        { "o",       "text/x-object" }, 
     34        { "ko",      "text/x-object" }, 
    3535 
    36         { "bmp",    "image/bmp" }, 
    37         { "gif",    "image/gif" }, 
    38         { "png",    "image/png" }, 
    39         { "jpg",    "image/jpeg" }, 
    40         { "jpeg",   "image/jpeg" }, 
    41         { "svg",    "image/svg+xml" }, 
     36        { "bmp",     "image/bmp" }, 
     37        { "gif",     "image/gif" }, 
     38        { "png",     "image/png" }, 
     39        { "jpg",     "image/jpeg" }, 
     40        { "jpeg",    "image/jpeg" }, 
     41        { "svg",     "image/svg+xml" }, 
    4242 
    43         { "zip",    "application/zip" }, 
    44         { "pdf",    "application/pdf" }, 
    45         { "xml",    "application/xml" }, 
    46         { "xsl",    "application/xml" }, 
    47         { "doc",    "application/msword" }, 
    48         { "ppt",    "application/vnd.ms-powerpoint" }, 
    49         { "xls",    "application/vnd.ms-excel" }, 
    50         { "odt",    "application/vnd.oasis.opendocument.text" }, 
    51         { "odp",    "application/vnd.oasis.opendocument.presentation" }, 
    52         { "pl",     "application/x-perl" }, 
    53         { "sh",     "application/x-shellscript" }, 
    54         { "php",    "application/x-php" }, 
    55         { "deb",    "application/x-deb" }, 
    56         { "iso",    "application/x-cd-image" }, 
    57         { "tgz",    "application/x-compressed-tar" }, 
    58         { "gz",     "application/x-gzip" }, 
    59         { "bz2",    "application/x-bzip" }, 
    60         { "tar",    "application/x-tar" }, 
    61         { "rar",    "application/x-rar-compressed" }, 
     43        { "zip",     "application/zip" }, 
     44        { "pdf",     "application/pdf" }, 
     45        { "xml",     "application/xml" }, 
     46        { "xsl",     "application/xml" }, 
     47        { "doc",     "application/msword" }, 
     48        { "ppt",     "application/vnd.ms-powerpoint" }, 
     49        { "xls",     "application/vnd.ms-excel" }, 
     50        { "odt",     "application/vnd.oasis.opendocument.text" }, 
     51        { "odp",     "application/vnd.oasis.opendocument.presentation" }, 
     52        { "pl",      "application/x-perl" }, 
     53        { "sh",      "application/x-shellscript" }, 
     54        { "php",     "application/x-php" }, 
     55        { "deb",     "application/x-deb" }, 
     56        { "iso",     "application/x-cd-image" }, 
     57        { "tar.gz",  "application/x-compressed-tar" }, 
     58        { "tgz",     "application/x-compressed-tar" }, 
     59        { "gz",      "application/x-gzip" }, 
     60        { "tar.bz2", "application/x-bzip-compressed-tar" }, 
     61        { "tbz",     "application/x-bzip-compressed-tar" }, 
     62        { "bz2",     "application/x-bzip" }, 
     63        { "tar",     "application/x-tar" }, 
     64        { "rar",     "application/x-rar-compressed" }, 
    6265 
    63         { "mp3",    "audio/mpeg" }, 
    64         { "ogg",    "audio/x-vorbis+ogg" }, 
    65         { "wav",    "audio/x-wav" }, 
     66        { "mp3",     "audio/mpeg" }, 
     67        { "ogg",     "audio/x-vorbis+ogg" }, 
     68        { "wav",     "audio/x-wav" }, 
    6669 
    67         { "mpg",    "video/mpeg" }, 
    68         { "mpeg",   "video/mpeg" }, 
    69         { "avi",    "video/x-msvideo" }, 
     70        { "mpg",     "video/mpeg" }, 
     71        { "mpeg",    "video/mpeg" }, 
     72        { "avi",     "video/x-msvideo" }, 
    7073 
    71         { "README", "text/plain" }, 
    72         { "log",    "text/plain" }, 
    73         { "cfg",    "text/plain" }, 
    74         { "conf",   "text/plain" }, 
     74        { "README",  "text/plain" }, 
     75        { "log",     "text/plain" }, 
     76        { "cfg",     "text/plain" }, 
     77        { "conf",    "text/plain" }, 
    7578 
    7679        { NULL, NULL } 
  • branches/backfire/package/uhttpd/src/uhttpd-utils.c

    r20513 r20884  
    117117        FD_SET(cl->socket, &writer); 
    118118 
    119         timeout.tv_sec = 0; 
    120         timeout.tv_usec = 500000; 
     119        timeout.tv_sec = cl->server->conf->network_timeout; 
     120        timeout.tv_usec = 0; 
    121121 
    122122        if( select(cl->socket + 1, NULL, &writer, NULL, &timeout) > 0 ) 
     
    377377} 
    378378 
     379static char * canonpath(const char *path, char *path_resolved) 
     380{ 
     381        char path_copy[PATH_MAX]; 
     382        char *path_cpy = path_copy; 
     383        char *path_res = path_resolved; 
     384 
     385        struct stat s; 
     386 
     387 
     388        /* relative -> absolute */ 
     389        if( *path != '/' ) 
     390        { 
     391                getcwd(path_copy, PATH_MAX); 
     392                strncat(path_copy, "/", PATH_MAX - strlen(path_copy)); 
     393                strncat(path_copy, path, PATH_MAX - strlen(path_copy)); 
     394        } 
     395        else 
     396        { 
     397                strncpy(path_copy, path, PATH_MAX); 
     398        } 
     399 
     400        /* normalize */ 
     401        while( (*path_cpy != '\0') && (path_cpy < (path_copy + PATH_MAX - 2)) ) 
     402        { 
     403                if( *path_cpy == '/' ) 
     404                { 
     405                        /* skip repeating / */ 
     406                        if( path_cpy[1] == '/' ) 
     407                        { 
     408                                path_cpy++; 
     409                                continue; 
     410                        } 
     411 
     412                        /* /./ or /../ */ 
     413                        else if( path_cpy[1] == '.' ) 
     414                        { 
     415                                /* skip /./ */ 
     416                                if( (path_cpy[2] == '/') || (path_cpy[2] == '\0') ) 
     417                                { 
     418                                        path_cpy += 2; 
     419                                        continue; 
     420                                } 
     421 
     422                                /* collapse /x/../ */ 
     423                                else if( path_cpy[2] == '.' ) 
     424                                { 
     425                                        while( (path_res > path_resolved) && (*--path_res != '/') ) 
     426                                                ; 
     427 
     428                                        path_cpy += 3; 
     429                                        continue; 
     430                                } 
     431                        } 
     432                } 
     433 
     434                *path_res++ = *path_cpy++; 
     435        } 
     436 
     437        /* remove trailing slash if not root / */ 
     438        if( (path_res > (path_resolved+1)) && (path_res[-1] == '/') ) 
     439                path_res--; 
     440        else if( path_res == path_resolved ) 
     441                *path_res++ = '/'; 
     442 
     443        *path_res = '\0'; 
     444 
     445        /* test access */ 
     446        if( !stat(path_resolved, &s) && (s.st_mode & S_IROTH) ) 
     447                return path_resolved; 
     448 
     449        return NULL; 
     450} 
    379451 
    380452struct path_info * uh_path_lookup(struct client *cl, const char *url) 
     
    388460        char *pathptr = NULL; 
    389461 
     462        int no_sym = cl->server->conf->no_symlinks; 
    390463        int i = 0; 
    391464        struct stat s; 
     
    433506                        memcpy(path_info, buffer, min(i + 1, sizeof(path_info) - 1)); 
    434507 
    435                         if( realpath(path_info, path_phys) ) 
    436                         { 
     508                        if( no_sym ? realpath(path_info, path_phys) 
     509                                   : canonpath(path_info, path_phys) 
     510                        ) { 
    437511                                memset(path_info, 0, sizeof(path_info)); 
    438512                                memcpy(path_info, &buffer[i], 
  • branches/backfire/package/uhttpd/src/uhttpd.c

    r20672 r20884  
    417417        int new_fd, cur_fd, max_fd = 0; 
    418418 
     419#ifdef HAVE_TLS 
    419420        int tls = 0; 
    420421        int keys = 0; 
     422#endif 
     423 
    421424        int bound = 0; 
    422425        int nofork = 0; 
     
    427430        char *port = NULL; 
    428431 
    429         /* library handles */ 
    430         void *tls_lib; 
    431         void *lua_lib; 
     432#if defined(HAVE_TLS) || defined(HAVE_LUA) 
     433        /* library handle */ 
     434        void *lib; 
     435#endif 
    432436 
    433437        /* clear the master and temp sets */ 
     
    467471#ifdef HAVE_TLS 
    468472        /* load TLS plugin */ 
    469         if( ! (tls_lib = dlopen("uhttpd_tls.so", RTLD_LAZY | RTLD_GLOBAL)) ) 
     473        if( ! (lib = dlopen("uhttpd_tls.so", RTLD_LAZY | RTLD_GLOBAL)) ) 
    470474        { 
    471475                fprintf(stderr, 
     
    477481        { 
    478482                /* resolve functions */ 
    479                 if( !(conf.tls_init   = dlsym(tls_lib, "uh_tls_ctx_init"))      || 
    480                     !(conf.tls_cert   = dlsym(tls_lib, "uh_tls_ctx_cert"))      || 
    481                     !(conf.tls_key    = dlsym(tls_lib, "uh_tls_ctx_key"))       || 
    482                     !(conf.tls_free   = dlsym(tls_lib, "uh_tls_ctx_free"))      || 
    483                         !(conf.tls_accept = dlsym(tls_lib, "uh_tls_client_accept")) || 
    484                         !(conf.tls_close  = dlsym(tls_lib, "uh_tls_client_close"))  || 
    485                         !(conf.tls_recv   = dlsym(tls_lib, "uh_tls_client_recv"))   || 
    486                         !(conf.tls_send   = dlsym(tls_lib, "uh_tls_client_send")) 
     483                if( !(conf.tls_init   = dlsym(lib, "uh_tls_ctx_init"))      || 
     484                    !(conf.tls_cert   = dlsym(lib, "uh_tls_ctx_cert"))      || 
     485                    !(conf.tls_key    = dlsym(lib, "uh_tls_ctx_key"))       || 
     486                    !(conf.tls_free   = dlsym(lib, "uh_tls_ctx_free"))      || 
     487                        !(conf.tls_accept = dlsym(lib, "uh_tls_client_accept")) || 
     488                        !(conf.tls_close  = dlsym(lib, "uh_tls_client_close"))  || 
     489                        !(conf.tls_recv   = dlsym(lib, "uh_tls_client_recv"))   || 
     490                        !(conf.tls_send   = dlsym(lib, "uh_tls_client_send")) 
    487491                ) { 
    488492                        fprintf(stderr, 
     
    502506#endif 
    503507 
    504         while( (opt = getopt(argc, argv, "fC:K:p:s:h:c:l:L:d:r:m:x:t:")) > 0 ) 
     508        while( (opt = getopt(argc, argv, "fSC:K:p:s:h:c:l:L:d:r:m:x:t:T:")) > 0 ) 
    505509        { 
    506510                switch(opt) 
     
    593597                                break; 
    594598 
     599                        /* don't follow symlinks */ 
     600                        case 'S': 
     601                                conf.no_symlinks = 1; 
     602                                break; 
     603 
    595604#ifdef HAVE_CGI 
    596605                        /* cgi prefix */ 
     
    618627                                break; 
    619628#endif 
     629 
     630                        /* network timeout */ 
     631                        case 'T': 
     632                                conf.network_timeout = atoi(optarg); 
     633                                break; 
    620634 
    621635                        /* no fork */ 
     
    664678#endif 
    665679                                        "       -h directory    Specify the document root, default is '.'\n" 
     680                                        "       -S              Do not follow symbolic links outside of the docroot\n" 
    666681#ifdef HAVE_LUA 
    667682                                        "       -l string       URL prefix for Lua handler, default is '/lua'\n" 
     
    674689                                        "       -t seconds      CGI and Lua script timeout in seconds, default is 60\n" 
    675690#endif 
     691                                        "       -T seconds      Network timeout in seconds, default is 30\n" 
    676692                                        "       -d string       URL decode given string\n" 
    677693                                        "       -r string       Specify basic auth realm\n" 
     
    713729        uh_config_parse(conf.file); 
    714730 
     731        /* default network timeout */ 
     732        if( conf.network_timeout <= 0 ) 
     733                conf.network_timeout = 30; 
     734 
    715735#if defined(HAVE_CGI) || defined(HAVE_LUA) 
    716736        /* default script timeout */ 
     
    727747#ifdef HAVE_LUA 
    728748        /* load Lua plugin */ 
    729         if( ! (lua_lib = dlopen("uhttpd_lua.so", RTLD_LAZY | RTLD_GLOBAL)) ) 
     749        if( ! (lib = dlopen("uhttpd_lua.so", RTLD_LAZY | RTLD_GLOBAL)) ) 
    730750        { 
    731751                fprintf(stderr, 
     
    737757        { 
    738758                /* resolve functions */ 
    739                 if( !(conf.lua_init    = dlsym(lua_lib, "uh_lua_init"))    || 
    740                     !(conf.lua_close   = dlsym(lua_lib, "uh_lua_close"))   || 
    741                     !(conf.lua_request = dlsym(lua_lib, "uh_lua_request")) 
     759                if( !(conf.lua_init    = dlsym(lib, "uh_lua_init"))    || 
     760                    !(conf.lua_close   = dlsym(lib, "uh_lua_close"))   || 
     761                    !(conf.lua_request = dlsym(lib, "uh_lua_request")) 
    742762                ) { 
    743763                        fprintf(stderr, 
  • branches/backfire/package/uhttpd/src/uhttpd.h

    r20500 r20884  
    3333#include <netdb.h> 
    3434#include <ctype.h> 
    35  
     35#include <errno.h> 
    3636#include <dlfcn.h> 
    3737 
     
    6565        char *realm; 
    6666        char *file; 
     67        int no_symlinks; 
     68        int network_timeout; 
    6769#ifdef HAVE_CGI 
    6870        char *cgi_prefix; 
Note: See TracChangeset for help on using the changeset viewer.