int process_header_end(request * req) { if (!req->logline) { send_r_error(req); return 0; } /* Percent-decode request */ if (unescape_uri(req->request_uri, &(req->query_string)) == 0) { log_error_doc(req); fputs("Problem unescaping uri\n", stderr); send_r_bad_request(req); return 0; } /* clean pathname */ clean_pathname(req->request_uri); if (req->request_uri[0] != '/') { send_r_bad_request(req); return 0; } if (translate_uri(req) == 0) { /* unescape, parse uri */ SQUASH_KA(req); return 0; /* failure, close down */ } if (req->method == M_POST) { req->post_data_fd = create_temporary_file(1, NULL, 0); if (req->post_data_fd == 0) return(0); return(1); /* success */ } if (req->is_cgi) { return init_cgi(req); } req->status = WRITE; return init_get(req); /* get and head */ }
void set_directory( char * dir, int verbose) { char *cmd = NULL; char *new_dir = NULL; char *qnew_dir; char *dp, *de; char *ldir = NULL; /* do nothing if "." */ if(strcmp(dir,".")==0) { show_directory(); /* say where we are */ return; /*NOTREACHED*/ } if (disk_name == NULL) { g_printf(_("Must select disk before setting directory\n")); return; /*NOTREACHED*/ } ldir = stralloc(dir); clean_pathname(ldir); /* convert directory into absolute path relative to disk mount point */ if (ldir[0] == '/') { /* absolute path specified, must start with mount point */ if (strcmp(mount_point, "/") == 0) { new_dir = stralloc(ldir); } else { if (strncmp(mount_point, ldir, strlen(mount_point)) != 0) { g_printf(_("Invalid directory - Can't cd outside mount point \"%s\"\n"), mount_point); amfree(ldir); return; /*NOTREACHED*/ } new_dir = stralloc(ldir+strlen(mount_point)); if (strlen(new_dir) == 0) { new_dir = newstralloc(new_dir, "/"); /* i.e. ldir == mount_point */ } } } else { new_dir = stralloc(disk_path); dp = ldir; /* strip any leading ..s */ while (strncmp(dp, "../", 3) == 0) { de = strrchr(new_dir, '/'); /* always at least 1 */ if (de == new_dir) { /* at top of disk */ *(de + 1) = '\0'; dp = dp + 3; } else { *de = '\0'; dp = dp + 3; } } if (strcmp(dp, "..") == 0) { if (strcmp(new_dir, "/") == 0) { /* at top of disk */ g_printf(_("Invalid directory - Can't cd outside mount point \"%s\"\n"), mount_point); /*@ignore@*/ amfree(new_dir); /*@end@*/ amfree(ldir); return; /*NOTREACHED*/ } de = strrchr(new_dir, '/'); /* always at least 1 */ if (de == new_dir) { /* at top of disk */ *(de+1) = '\0'; } else { *de = '\0'; } } else { /*@ignore@*/ if (strcmp(new_dir, "/") != 0) { strappend(new_dir, "/"); } strappend(new_dir, ldir); /*@end@*/ } } qnew_dir = quote_string(new_dir); cmd = stralloc2("OISD ", qnew_dir); amfree(qnew_dir); if (exchange(cmd) == -1) { exit(1); /*NOTREACHED*/ } amfree(cmd); if (server_happy()) { disk_path = newstralloc(disk_path, new_dir); suck_dir_list_from_server(); /* get list of directory contents */ if (verbose) show_directory(); /* say where we moved to */ } else { g_printf(_("Invalid directory - %s\n"), dir); } /*@ignore@*/ amfree(new_dir); amfree(ldir); /*@end@*/ }
int process_header_end(request * req) { if (!req->logline) { log_error_doc(req); fputs("No logline in process_header_end\n", stderr); send_r_error(req); return 0; } /* Percent-decode request */ if (unescape_uri(req->request_uri, &(req->query_string)) == 0) { log_error_doc(req); fputs("URI contains bogus characters\n", stderr); send_r_bad_request(req); return 0; } /* clean pathname */ clean_pathname(req->request_uri); if (req->request_uri[0] != '/') { log_error("URI does not begin with '/'\n"); send_r_bad_request(req); return 0; } if (vhost_root) { char *c; if (!req->header_host) { req->host = strdup(default_vhost); } else { req->host = strdup(req->header_host); } if (!req->host) { log_error_doc(req); fputs("unable to strdup default_vhost/req->header_host\n", stderr); send_r_error(req); return 0; } strlower(req->host); /* check for port, and remove * we essentially ignore the port, because we cannot * as yet report a different port than the one we are * listening on */ c = strchr(req->host, ':'); if (c) *c = '\0'; if (check_host(req->host) < 1) { log_error_doc(req); fputs("host invalid!\n", stderr); send_r_bad_request(req); return 0; } } if (translate_uri(req) == 0) { /* unescape, parse uri */ /* errors already logged */ SQUASH_KA(req); return 0; /* failure, close down */ } if (req->method == M_POST) { req->post_data_fd = create_temporary_file(1, NULL, 0); if (req->post_data_fd == 0) { /* errors already logged */ send_r_error(req); return 0; } if (fcntl(req->post_data_fd, F_SETFD, 1) == -1) { log_error_doc(req); fputs("unable to set close-on-exec for req->post_data_fd!\n", stderr); close(req->post_data_fd); req->post_data_fd = 0; send_r_error(req); return 0; } return 1; /* success */ } if (req->cgi_type) { return init_cgi(req); } req->status = WRITE; // return complete_response(req); return init_control(req); // return init_get(req); /* get and head */ }
int process_header_end(request * req) { if (!req->logline) { log_error_doc(req); fputs("No logline in process_header_end\n", stderr); send_r_error(req); return 0; } /* Percent-decode request */ if (unescape_uri(req->request_uri, &(req->query_string)) == 0) { log_error_doc(req); fputs("URI contains bogus characters\n", stderr); send_r_bad_request(req); return 0; } /* clean pathname */ clean_pathname(req->request_uri); if (req->request_uri[0] != '/') { log_error("URI does not begin with '/'\n"); send_r_bad_request(req); return 0; } if (use_caudium_hack) { /* We check whether the path is of the form "/(ll)/foo/..." which is used by the Caudium webserver for caching purposes and people have bookmarked it. To cope with this we simply strip it of. */ if (req->request_uri[0] == '/' && req->request_uri[1] == '(' && req->request_uri[2] >= 'a' && req->request_uri[2] <= 'z' && req->request_uri[3] >= 'a' && req->request_uri[3] <= 'z' && req->request_uri[4] == ')' && req->request_uri[5] == '/' && req->request_uri[6] ) { unsigned int len = strlen(req->request_uri); memmove (req->request_uri, req->request_uri+5, len - 5 + 1); } } if (vhost_root) { char *c; if (!req->header_host) { req->host = strdup(default_vhost); } else { req->host = strdup(req->header_host); } if (!req->host) { log_error_doc(req); fputs("unable to strdup default_vhost/req->header_host\n", stderr); send_r_error(req); return 0; } strlower(req->host); /* check for port, and remove * we essentially ignore the port, because we cannot * as yet report a different port than the one we are * listening on */ c = strchr(req->host, ':'); if (c) *c = '\0'; if (check_host(req->host) < 1) { log_error_doc(req); fputs("host invalid!\n", stderr); send_r_bad_request(req); return 0; } } if (translate_uri(req) == 0) { /* unescape, parse uri */ /* errors already logged */ SQUASH_KA(req); return 0; /* failure, close down */ } if (req->method == M_POST) { req->post_data_fd = create_temporary_file(1, NULL, 0); if (req->post_data_fd == 0) { /* errors already logged */ send_r_error(req); return 0; } if (fcntl(req->post_data_fd, F_SETFD, 1) == -1) { boa_perror(req, "unable to set close-on-exec for req->post_data_fd!"); close(req->post_data_fd); req->post_data_fd = 0; return 0; } return 1; /* success */ } if (req->cgi_type) { return init_cgi(req); } req->status = WRITE; return init_get(req); /* get and head */ }