Changeset 22 in Main


Ignore:
Timestamp:
Sep 14, 2024, 10:25:38 PM (2 months ago)
Author:
Nishi
Message:

icon works

Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Common/dir.c

    r21 r22  
    1010#include <string.h>
    1111
    12 int cm_sort(const void* _a, const void* _b){
     12int cm_sort(const void* _a, const void* _b) {
    1313        char* a = *(char**)_a;
    1414        char* b = *(char**)_b;
     
    1616}
    1717
    18 char** cm_scandir(const char* path){
     18char** cm_scandir(const char* path) {
    1919        DIR* dir = opendir(path);
    20         if(dir != NULL){
     20        if(dir != NULL) {
    2121                char** r = malloc(sizeof(*r));
    2222                r[0] = NULL;
    2323                struct dirent* d;
    24                 while((d = readdir(dir)) != NULL){
    25                         if(strcmp(d->d_name, ".") != 0){
     24                while((d = readdir(dir)) != NULL) {
     25                        if(strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0) {
    2626                                struct stat s;
    2727                                char* p = cm_strcat3(path, "/", d->d_name);
     
    3131                                char** old = r;
    3232                                int i;
    33                                 for(i = 0; old[i] != NULL; i++);
     33                                for(i = 0; old[i] != NULL; i++)
     34                                        ;
    3435                                r = malloc(sizeof(*r) * (i + 2));
    3536                                for(i = 0; old[i] != NULL; i++) r[i] = old[i];
     
    4041                }
    4142                int len;
    42                 for(len = 0; r[len] != NULL; len++);
     43                for(len = 0; r[len] != NULL; len++)
     44                        ;
    4345                qsort(r, len, sizeof(char*), cm_sort);
     46
     47                char** old = r;
     48                int i;
     49                for(i = 0; old[i] != NULL; i++)
     50                        ;
     51                r = malloc(sizeof(*r) * (i + 2));
     52                for(i = 0; old[i] != NULL; i++) r[i + 1] = old[i];
     53                r[0] = cm_strdup("../");
     54                r[i + 1] = NULL;
     55                free(old);
     56
    4457                return r;
    45         }else{
     58        } else {
    4659                return NULL;
    4760        }
  • trunk/Server/config.c

    r21 r22  
    3131}
    3232
    33 bool tw_permission_allowed(const char* path, SOCKADDR addr, struct tw_http_request req, struct tw_config_entry* vhost){
     33bool tw_permission_allowed(const char* path, SOCKADDR addr, struct tw_http_request req, struct tw_config_entry* vhost) {
    3434        int i;
    3535        bool found = false;
     
    3737        bool perm = false;
    3838again:
    39         for(i = 0; i < vhost->dir_count; i++){
     39        for(i = 0; i < vhost->dir_count; i++) {
    4040                struct tw_dir_entry* e = &vhost->dirs[i];
    4141                pathstart = false;
    42                 if(strlen(path) >= strlen(e->dir)){
     42                if(strlen(path) >= strlen(e->dir)) {
    4343                        pathstart = true;
    4444                        int j;
    45                         for(j = 0; path[j] != 0 && e->dir[j] != 0; j++){
    46                                 if(path[j] != e->dir[j]){
     45                        for(j = 0; path[j] != 0 && e->dir[j] != 0; j++) {
     46                                if(path[j] != e->dir[j]) {
    4747                                        pathstart = false;
    4848                                        break;
     
    5252                char* noslash = cm_strdup(e->dir);
    5353                noslash[strlen(noslash) - 1] = 0;
    54                 if(strcmp(e->dir, path) == 0 || strcmp(noslash, path) == 0 || pathstart){
     54                if(strcmp(e->dir, path) == 0 || strcmp(noslash, path) == 0 || pathstart) {
    5555                        found = true;
    56                         if(strcmp(e->name, "all") == 0){
     56                        if(strcmp(e->name, "all") == 0) {
    5757                                perm = e->type == TW_DIR_ALLOW;
    5858                        }
     
    6060                free(noslash);
    6161        }
    62         if(!found && vhost != &config.root){
     62        if(!found && vhost != &config.root) {
    6363                vhost = &config.root;
    6464                goto again;
     
    8282        config.root.mime_count = 0;
    8383        config.root.dir_count = 0;
     84        config.root.icon_count = 0;
    8485        config.vhost_count = 0;
    8586        config.module_count = 0;
     
    180181                                                                current->dir_count = 0;
    181182                                                                current->mime_count = 0;
     183                                                                current->icon_count = 0;
    182184                                                                int i;
    183185                                                                current->name = cm_strdup(vhost);
     
    247249                                                        cm_log("Config", "Missing extension at line %d", ln);
    248250                                                        stop = 1;
    249                                                 }else if(r[2] == NULL) {
     251                                                } else if(r[2] == NULL) {
    250252                                                        cm_log("Config", "Missing MIME at line %d", ln);
    251253                                                        stop = 1;
     
    254256                                                        e->ext = cm_strdup(r[1]);
    255257                                                        e->mime = cm_strdup(r[2]);
     258                                                }
     259                                        } else if(cm_strcaseequ(r[0], "Icon")) {
     260                                                if(r[1] == NULL) {
     261                                                        cm_log("Config", "Missing MIME at line %d", ln);
     262                                                        stop = 1;
     263                                                } else if(r[2] == NULL) {
     264                                                        cm_log("Config", "Missing path at line %d", ln);
     265                                                        stop = 1;
     266                                                } else {
     267                                                        struct tw_icon_entry* e = &current->icons[current->icon_count++];
     268                                                        e->mime = cm_strdup(r[1]);
     269                                                        e->icon = cm_strdup(r[2]);
    256270                                                }
    257271                                        } else if(cm_strcaseequ(r[0], "LoadModule")) {
  • trunk/Server/http.c

    r20 r22  
    6060                tv.tv_sec = 5;
    6161                tv.tv_usec = 0;
    62                 int n = select(FD_SETSIZE, &fds, NULL, NULL, &tv);
    63                 if(n == 0) break;
     62                if(!SSL_has_pending(ssl)) {
     63                        int n = select(FD_SETSIZE, &fds, NULL, NULL, &tv);
     64                        if(n <= 0) {
     65                                free(header);
     66                                tw_free_request(req);
     67                                return -1;
     68                        }
     69                }
    6470                int len = tw_read(ssl, sock, buffer, 512);
    6571                if(len <= 0) break;
  • trunk/Server/server.c

    r21 r22  
    166166        size_t incr = 0;
    167167        while(1) {
    168                 if(f != NULL){
     168                if(f != NULL) {
    169169                        char buffer[128];
    170170                        fread(buffer, size < 128 ? size : 128, 1, f);
    171171                        tw_write(ssl, sock, buffer, size < 128 ? size : 128);
    172                 }else{
     172                } else {
    173173                        tw_write(ssl, sock, (unsigned char*)doc + incr, size < 128 ? size : 128);
    174174                }
     
    269269}
    270270
     271char* tw_get_mime(const char* ext, struct tw_config_entry* vhost_entry) {
     272        char* mime = "application/octet-stream";
     273        if(ext == NULL) return mime;
     274        bool set = false;
     275        int i;
     276        for(i = 0; i < vhost_entry->mime_count; i++) {
     277                if(strcmp(vhost_entry->mimes[i].ext, "all") == 0 || (ext != NULL && strcmp(vhost_entry->mimes[i].ext, ext) == 0)) {
     278                        mime = vhost_entry->mimes[i].mime;
     279                        set = true;
     280                }
     281        }
     282        if(!set) {
     283                for(i = 0; i < config.root.mime_count; i++) {
     284                        if(strcmp(config.root.mimes[i].ext, "all") == 0 || (ext != NULL && strcmp(config.root.mimes[i].ext, ext) == 0)) {
     285                                mime = config.root.mimes[i].mime;
     286                        }
     287                }
     288        }
     289        return mime;
     290}
     291
     292char* tw_get_icon(const char* mime, struct tw_config_entry* vhost_entry) {
     293        char* icon = "";
     294        if(mime == NULL) return "";
     295        bool set = false;
     296        int i;
     297        for(i = 0; i < vhost_entry->icon_count; i++) {
     298                if(strcmp(vhost_entry->icons[i].mime, "all") == 0 || (mime != NULL && strcmp(vhost_entry->icons[i].mime, mime) == 0)) {
     299                        icon = vhost_entry->icons[i].icon;
     300                        set = true;
     301                }
     302        }
     303        if(!set) {
     304                for(i = 0; i < config.root.icon_count; i++) {
     305                        if(strcmp(config.root.icons[i].mime, "all") == 0 || (mime != NULL && strcmp(config.root.icons[i].mime, mime) == 0)) {
     306                                icon = config.root.icons[i].icon;
     307                        }
     308                }
     309        }
     310        return icon;
     311}
     312
    271313#ifdef __MINGW32__
    272314struct pass_entry {
     
    307349                char* vhost = cm_strdup(config.hostname);
    308350                int i;
    309                 for(i = 0; req.headers[i] != NULL; i += 2){
    310                         if(cm_strcaseequ(req.headers[i], "Host")){
     351                for(i = 0; req.headers[i] != NULL; i += 2) {
     352                        if(cm_strcaseequ(req.headers[i], "Host")) {
    311353                                free(vhost);
    312354                                vhost = req.headers[i + 1];
     
    317359                int port = s == NULL ? 80 : 443;
    318360                char* host = cm_strdup(vhost);
    319                 for(i = 0; vhost[i] != 0; i++){
    320                         if(vhost[i] == ':'){
     361                for(i = 0; vhost[i] != 0; i++) {
     362                        if(vhost[i] == ':') {
    321363                                host[i] = 0;
    322364                                port = atoi(host + i + 1);
     
    347389                        cm_log("Server", "Filesystem path is %s", path);
    348390                        struct stat st;
    349                         if(stat(path, &st) == 0){
    350                                 if(!tw_permission_allowed(path, addr, req, vhost_entry)){
     391                        if(stat(path, &st) == 0) {
     392                                if(!tw_permission_allowed(path, addr, req, vhost_entry)) {
    351393                                        tw_http_error(s, sock, 403, name, port);
    352                                 }else if(S_ISDIR(st.st_mode)){
     394                                } else if(S_ISDIR(st.st_mode)) {
    353395                                        char* str = malloc(1);
    354396                                        str[0] = 0;
     
    368410                                        addstring(&str, "                               <th>Filename</th>\n");
    369411                                        addstring(&str, "                       </tr>\n");
    370                                         if(items != NULL){
    371                                                 for(i = 0; items[i] != NULL; i++){
     412                                        if(items != NULL) {
     413                                                for(i = 0; items[i] != NULL; i++) {
     414                                                        char* ext = NULL;
     415                                                        int j;
     416                                                        for(j = strlen(items[i]) - 1; j >= 0; j--) {
     417                                                                if(items[i][j] == '.') {
     418                                                                        ext = cm_strdup(items[i] + j);
     419                                                                        break;
     420                                                                }
     421                                                        }
     422                                                        char* mime = tw_get_mime(ext, vhost_entry);
     423                                                        if(strcmp(items[i], "../") == 0) {
     424                                                                mime = "misc/parent";
     425                                                        } else if(items[i][strlen(items[i]) - 1] == '/') {
     426                                                                mime = "misc/dir";
     427                                                        }
     428                                                        char* icon = tw_get_icon(mime, vhost_entry);
     429                                                        if(ext != NULL) free(ext);
     430                                                        char* itm = cm_strdup(items[i]);
     431                                                        if(strlen(itm) >= 32) {
     432                                                                if(itm[strlen(itm) - 1] == '/') {
     433                                                                        itm[31] = 0;
     434                                                                        itm[30] = '/';
     435                                                                        itm[29] = '.';
     436                                                                        itm[28] = '.';
     437                                                                        itm[27] = '.';
     438                                                                } else {
     439                                                                        itm[31] = 0;
     440                                                                        itm[30] = '.';
     441                                                                        itm[29] = '.';
     442                                                                        itm[28] = '.';
     443                                                                }
     444                                                        }
    372445                                                        addstring(&str, "<tr>\n");
    373                                                         addstring(&str, "       <td></td>\n");
    374                                                         addstring(&str, "       <td><a href=\"%l\">%h</a></td>\n", items[i], items[i]);
     446                                                        addstring(&str, "       <td><img src=\"%s\" alt=\"icon\"></td>\n", icon);
     447                                                        addstring(&str, "       <td><a href=\"%l\"><code>%h</code></a></td>\n", items[i], itm);
    375448                                                        addstring(&str, "</tr>\n");
     449                                                        free(itm);
    376450                                                }
    377451                                        }
     
    383457                                        tw_process_page(s, sock, tw_http_status(200), "text/html", NULL, str, strlen(str));
    384458                                        free(str);
    385                                 }else{
    386                                         char* mime = "application/octet-stream";
    387                                         bool set = false;
     459                                } else {
    388460                                        char* ext = NULL;
    389                                         for(i = strlen(req.path) - 1; i >= 0; i--){
    390                                                 if(req.path[i] == '.'){
     461                                        for(i = strlen(req.path) - 1; i >= 0; i--) {
     462                                                if(req.path[i] == '.') {
    391463                                                        ext = cm_strdup(req.path + i);
    392464                                                        break;
    393465                                                }
    394466                                        }
    395                                         for(i = 0; i < vhost_entry->mime_count; i++){
    396                                                 if(strcmp(vhost_entry->mimes[i].ext, "all") == 0 || (ext != NULL && strcmp(vhost_entry->mimes[i].ext, ext) == 0)){
    397                                                         mime = vhost_entry->mimes[i].mime;
    398                                                         set = true;
    399                                                 }
    400                                         }
    401                                         if(!set){
    402                                                 for(i = 0; i < config.root.mime_count; i++){
    403                                                         if(strcmp(config.root.mimes[i].ext, "all") == 0 || (ext != NULL && strcmp(config.root.mimes[i].ext, ext) == 0)){
    404                                                                 mime = config.root.mimes[i].mime;
    405                                                                 set = true;
    406                                                         }
    407                                                 }
    408                                         }
     467                                        char* mime = tw_get_mime(ext, vhost_entry);
    409468                                        if(ext != NULL) free(ext);
    410469                                        FILE* f = fopen(path, "rb");
     
    412471                                        fclose(f);
    413472                                }
    414                         }else{
     473                        } else {
    415474                                tw_http_error(s, sock, 404, name, port);
    416475                        }
     
    419478                free(vhost);
    420479                free(host);
     480        } else if(ret == -1) {
    421481        } else {
    422482                tw_http_error(s, sock, 400, name, port);
  • trunk/Server/tw_config.h

    r21 r22  
    2222#endif
    2323
    24 #define MAX_PORTS       1024
    25 #define MAX_VHOSTS      1024
    26 #define MAX_MODULES     1024
    27 #define MAX_DIRS        1024
    28 #define MAX_MIME        1024
     24#define MAX_PORTS 1024
     25#define MAX_VHOSTS 1024
     26#define MAX_MODULES 1024
     27#define MAX_DIRS 1024
     28#define MAX_MIME 1024
     29#define MAX_ICON 1024
    2930
    3031enum TW_DIR_TYPE {
     
    4445};
    4546
     47struct tw_icon_entry {
     48        char* mime;
     49        char* icon;
     50};
     51
    4652struct tw_config_entry {
    4753        char* name;
     
    5460        struct tw_mime_entry mimes[MAX_DIRS];
    5561        int mime_count;
     62        struct tw_icon_entry icons[MAX_DIRS];
     63        int icon_count;
    5664};
    5765
  • trunk/example.conf

    r21 r22  
    1212MIMEType all application/octet-stream
    1313MIMEType .html text/html
     14MIMEType .txt text/plain
     15MIMEType .png image/png
    1416
    15 DocumentRoot /
     17Icon all /icons/unknown.png
     18Icon text/plain /icons/text.png
     19Icon misc/dir /icons/folder.png
     20Icon misc/parent /icons/parent.png
     21
     22DocumentRoot /var/www
    1623
    1724BeginDirectory /
     
    1926EndDirectory
    2027
    21 BeginDirectory /var/www
    22         Deny all
    23 EndDirectory
    24 
    2528BeginVirtualHost nishinbsd-ssd
    2629EndVirtualHost
Note: See TracChangeset for help on using the changeset viewer.