icon works
git-svn-id: file:///raid/svn-personal/tewi/trunk@22 8739d7e6-ffea-ec47-b151-bdff447c6205
This commit is contained in:
parent
631d4bcd38
commit
850a70e9ce
19
Common/dir.c
19
Common/dir.c
|
@ -22,7 +22,7 @@ char** cm_scandir(const char* path){
|
|||
r[0] = NULL;
|
||||
struct dirent* d;
|
||||
while((d = readdir(dir)) != NULL) {
|
||||
if(strcmp(d->d_name, ".") != 0){
|
||||
if(strcmp(d->d_name, ".") != 0 && strcmp(d->d_name, "..") != 0) {
|
||||
struct stat s;
|
||||
char* p = cm_strcat3(path, "/", d->d_name);
|
||||
stat(p, &s);
|
||||
|
@ -30,7 +30,8 @@ char** cm_scandir(const char* path){
|
|||
|
||||
char** old = r;
|
||||
int i;
|
||||
for(i = 0; old[i] != NULL; i++);
|
||||
for(i = 0; old[i] != NULL; i++)
|
||||
;
|
||||
r = malloc(sizeof(*r) * (i + 2));
|
||||
for(i = 0; old[i] != NULL; i++) r[i] = old[i];
|
||||
r[i] = cm_strcat(d->d_name, S_ISDIR(s.st_mode) ? "/" : "");
|
||||
|
@ -39,8 +40,20 @@ char** cm_scandir(const char* path){
|
|||
}
|
||||
}
|
||||
int len;
|
||||
for(len = 0; r[len] != NULL; len++);
|
||||
for(len = 0; r[len] != NULL; len++)
|
||||
;
|
||||
qsort(r, len, sizeof(char*), cm_sort);
|
||||
|
||||
char** old = r;
|
||||
int i;
|
||||
for(i = 0; old[i] != NULL; i++)
|
||||
;
|
||||
r = malloc(sizeof(*r) * (i + 2));
|
||||
for(i = 0; old[i] != NULL; i++) r[i + 1] = old[i];
|
||||
r[0] = cm_strdup("../");
|
||||
r[i + 1] = NULL;
|
||||
free(old);
|
||||
|
||||
return r;
|
||||
} else {
|
||||
return NULL;
|
||||
|
|
|
@ -81,6 +81,7 @@ void tw_config_init(void) {
|
|||
config.root.root = NULL;
|
||||
config.root.mime_count = 0;
|
||||
config.root.dir_count = 0;
|
||||
config.root.icon_count = 0;
|
||||
config.vhost_count = 0;
|
||||
config.module_count = 0;
|
||||
config.extension = NULL;
|
||||
|
@ -179,6 +180,7 @@ int tw_config_read(const char* path) {
|
|||
current = &config.vhosts[config.vhost_count++];
|
||||
current->dir_count = 0;
|
||||
current->mime_count = 0;
|
||||
current->icon_count = 0;
|
||||
int i;
|
||||
current->name = cm_strdup(vhost);
|
||||
current->port = -1;
|
||||
|
@ -254,6 +256,18 @@ int tw_config_read(const char* path) {
|
|||
e->ext = cm_strdup(r[1]);
|
||||
e->mime = cm_strdup(r[2]);
|
||||
}
|
||||
} else if(cm_strcaseequ(r[0], "Icon")) {
|
||||
if(r[1] == NULL) {
|
||||
cm_log("Config", "Missing MIME at line %d", ln);
|
||||
stop = 1;
|
||||
} else if(r[2] == NULL) {
|
||||
cm_log("Config", "Missing path at line %d", ln);
|
||||
stop = 1;
|
||||
} else {
|
||||
struct tw_icon_entry* e = ¤t->icons[current->icon_count++];
|
||||
e->mime = cm_strdup(r[1]);
|
||||
e->icon = cm_strdup(r[2]);
|
||||
}
|
||||
} else if(cm_strcaseequ(r[0], "LoadModule")) {
|
||||
for(i = 1; r[i] != NULL; i++) {
|
||||
void* mod = tw_module_load(r[i]);
|
||||
|
|
|
@ -59,8 +59,14 @@ int tw_http_parse(SSL* ssl, int sock, struct tw_http_request* req) {
|
|||
struct timeval tv;
|
||||
tv.tv_sec = 5;
|
||||
tv.tv_usec = 0;
|
||||
if(!SSL_has_pending(ssl)) {
|
||||
int n = select(FD_SETSIZE, &fds, NULL, NULL, &tv);
|
||||
if(n == 0) break;
|
||||
if(n <= 0) {
|
||||
free(header);
|
||||
tw_free_request(req);
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
int len = tw_read(ssl, sock, buffer, 512);
|
||||
if(len <= 0) break;
|
||||
int i;
|
||||
|
|
|
@ -268,6 +268,48 @@ void addstring(char** str, const char* add, ...) {
|
|||
}
|
||||
}
|
||||
|
||||
char* tw_get_mime(const char* ext, struct tw_config_entry* vhost_entry) {
|
||||
char* mime = "application/octet-stream";
|
||||
if(ext == NULL) return mime;
|
||||
bool set = false;
|
||||
int i;
|
||||
for(i = 0; i < vhost_entry->mime_count; i++) {
|
||||
if(strcmp(vhost_entry->mimes[i].ext, "all") == 0 || (ext != NULL && strcmp(vhost_entry->mimes[i].ext, ext) == 0)) {
|
||||
mime = vhost_entry->mimes[i].mime;
|
||||
set = true;
|
||||
}
|
||||
}
|
||||
if(!set) {
|
||||
for(i = 0; i < config.root.mime_count; i++) {
|
||||
if(strcmp(config.root.mimes[i].ext, "all") == 0 || (ext != NULL && strcmp(config.root.mimes[i].ext, ext) == 0)) {
|
||||
mime = config.root.mimes[i].mime;
|
||||
}
|
||||
}
|
||||
}
|
||||
return mime;
|
||||
}
|
||||
|
||||
char* tw_get_icon(const char* mime, struct tw_config_entry* vhost_entry) {
|
||||
char* icon = "";
|
||||
if(mime == NULL) return "";
|
||||
bool set = false;
|
||||
int i;
|
||||
for(i = 0; i < vhost_entry->icon_count; i++) {
|
||||
if(strcmp(vhost_entry->icons[i].mime, "all") == 0 || (mime != NULL && strcmp(vhost_entry->icons[i].mime, mime) == 0)) {
|
||||
icon = vhost_entry->icons[i].icon;
|
||||
set = true;
|
||||
}
|
||||
}
|
||||
if(!set) {
|
||||
for(i = 0; i < config.root.icon_count; i++) {
|
||||
if(strcmp(config.root.icons[i].mime, "all") == 0 || (mime != NULL && strcmp(config.root.icons[i].mime, mime) == 0)) {
|
||||
icon = config.root.icons[i].icon;
|
||||
}
|
||||
}
|
||||
}
|
||||
return icon;
|
||||
}
|
||||
|
||||
#ifdef __MINGW32__
|
||||
struct pass_entry {
|
||||
int sock;
|
||||
|
@ -369,10 +411,42 @@ void tw_server_pass(int sock, bool ssl, int port, SOCKADDR addr) {
|
|||
addstring(&str, " </tr>\n");
|
||||
if(items != NULL) {
|
||||
for(i = 0; items[i] != NULL; i++) {
|
||||
char* ext = NULL;
|
||||
int j;
|
||||
for(j = strlen(items[i]) - 1; j >= 0; j--) {
|
||||
if(items[i][j] == '.') {
|
||||
ext = cm_strdup(items[i] + j);
|
||||
break;
|
||||
}
|
||||
}
|
||||
char* mime = tw_get_mime(ext, vhost_entry);
|
||||
if(strcmp(items[i], "../") == 0) {
|
||||
mime = "misc/parent";
|
||||
} else if(items[i][strlen(items[i]) - 1] == '/') {
|
||||
mime = "misc/dir";
|
||||
}
|
||||
char* icon = tw_get_icon(mime, vhost_entry);
|
||||
if(ext != NULL) free(ext);
|
||||
char* itm = cm_strdup(items[i]);
|
||||
if(strlen(itm) >= 32) {
|
||||
if(itm[strlen(itm) - 1] == '/') {
|
||||
itm[31] = 0;
|
||||
itm[30] = '/';
|
||||
itm[29] = '.';
|
||||
itm[28] = '.';
|
||||
itm[27] = '.';
|
||||
} else {
|
||||
itm[31] = 0;
|
||||
itm[30] = '.';
|
||||
itm[29] = '.';
|
||||
itm[28] = '.';
|
||||
}
|
||||
}
|
||||
addstring(&str, "<tr>\n");
|
||||
addstring(&str, " <td></td>\n");
|
||||
addstring(&str, " <td><a href=\"%l\">%h</a></td>\n", items[i], items[i]);
|
||||
addstring(&str, " <td><img src=\"%s\" alt=\"icon\"></td>\n", icon);
|
||||
addstring(&str, " <td><a href=\"%l\"><code>%h</code></a></td>\n", items[i], itm);
|
||||
addstring(&str, "</tr>\n");
|
||||
free(itm);
|
||||
}
|
||||
}
|
||||
addstring(&str, " </table>\n");
|
||||
|
@ -383,8 +457,6 @@ void tw_server_pass(int sock, bool ssl, int port, SOCKADDR addr) {
|
|||
tw_process_page(s, sock, tw_http_status(200), "text/html", NULL, str, strlen(str));
|
||||
free(str);
|
||||
} else {
|
||||
char* mime = "application/octet-stream";
|
||||
bool set = false;
|
||||
char* ext = NULL;
|
||||
for(i = strlen(req.path) - 1; i >= 0; i--) {
|
||||
if(req.path[i] == '.') {
|
||||
|
@ -392,20 +464,7 @@ void tw_server_pass(int sock, bool ssl, int port, SOCKADDR addr) {
|
|||
break;
|
||||
}
|
||||
}
|
||||
for(i = 0; i < vhost_entry->mime_count; i++){
|
||||
if(strcmp(vhost_entry->mimes[i].ext, "all") == 0 || (ext != NULL && strcmp(vhost_entry->mimes[i].ext, ext) == 0)){
|
||||
mime = vhost_entry->mimes[i].mime;
|
||||
set = true;
|
||||
}
|
||||
}
|
||||
if(!set){
|
||||
for(i = 0; i < config.root.mime_count; i++){
|
||||
if(strcmp(config.root.mimes[i].ext, "all") == 0 || (ext != NULL && strcmp(config.root.mimes[i].ext, ext) == 0)){
|
||||
mime = config.root.mimes[i].mime;
|
||||
set = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
char* mime = tw_get_mime(ext, vhost_entry);
|
||||
if(ext != NULL) free(ext);
|
||||
FILE* f = fopen(path, "rb");
|
||||
tw_process_page(s, sock, tw_http_status(200), mime, f, NULL, st.st_size);
|
||||
|
@ -418,6 +477,7 @@ void tw_server_pass(int sock, bool ssl, int port, SOCKADDR addr) {
|
|||
}
|
||||
free(vhost);
|
||||
free(host);
|
||||
} else if(ret == -1) {
|
||||
} else {
|
||||
tw_http_error(s, sock, 400, name, port);
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#define MAX_MODULES 1024
|
||||
#define MAX_DIRS 1024
|
||||
#define MAX_MIME 1024
|
||||
#define MAX_ICON 1024
|
||||
|
||||
enum TW_DIR_TYPE {
|
||||
TW_DIR_ALLOW = 0,
|
||||
|
@ -43,6 +44,11 @@ struct tw_mime_entry {
|
|||
char* mime;
|
||||
};
|
||||
|
||||
struct tw_icon_entry {
|
||||
char* mime;
|
||||
char* icon;
|
||||
};
|
||||
|
||||
struct tw_config_entry {
|
||||
char* name;
|
||||
int port;
|
||||
|
@ -53,6 +59,8 @@ struct tw_config_entry {
|
|||
int dir_count;
|
||||
struct tw_mime_entry mimes[MAX_DIRS];
|
||||
int mime_count;
|
||||
struct tw_icon_entry icons[MAX_DIRS];
|
||||
int icon_count;
|
||||
};
|
||||
|
||||
struct tw_config {
|
||||
|
|
13
example.conf
13
example.conf
|
@ -11,16 +11,19 @@ SSLCertificate cert.pem
|
|||
|
||||
MIMEType all application/octet-stream
|
||||
MIMEType .html text/html
|
||||
MIMEType .txt text/plain
|
||||
MIMEType .png image/png
|
||||
|
||||
DocumentRoot /
|
||||
Icon all /icons/unknown.png
|
||||
Icon text/plain /icons/text.png
|
||||
Icon misc/dir /icons/folder.png
|
||||
Icon misc/parent /icons/parent.png
|
||||
|
||||
DocumentRoot /var/www
|
||||
|
||||
BeginDirectory /
|
||||
Allow all
|
||||
EndDirectory
|
||||
|
||||
BeginDirectory /var/www
|
||||
Deny all
|
||||
EndDirectory
|
||||
|
||||
BeginVirtualHost nishinbsd-ssd
|
||||
EndVirtualHost
|
||||
|
|
Loading…
Reference in New Issue
Block a user