From db9f741875ad1fd3c7c3e5b932420081862159bc Mon Sep 17 00:00:00 2001 From: "Rafael G. Martins" Date: Sat, 22 Dec 2018 02:47:07 +0100 Subject: wip --- src/blogc-runserver/httpd.c | 49 ++++++++++++++++++++++++++++---- src/common/error.c | 68 +++++++++++++++++++++++++++++++++++++++++++-- src/common/error.h | 8 ++++++ src/common/file.c | 24 ++++++++++++++++ src/common/file.h | 1 + 5 files changed, 143 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/blogc-runserver/httpd.c b/src/blogc-runserver/httpd.c index 57bcec4..9249b94 100644 --- a/src/blogc-runserver/httpd.c +++ b/src/blogc-runserver/httpd.c @@ -10,6 +10,11 @@ #include #endif /* HAVE_CONFIG_H */ +#if defined(WIN32) || defined(_WIN32) +#define WINVER 0x0600 +#define _WIN32_WINNT 0x0600 +#endif /* WIN32 || _WIN32 */ + #ifdef HAVE_SYS_SOCKET_H #include #endif /* HAVE_SYS_SOCKET_H */ @@ -34,8 +39,13 @@ #include #endif /* HAVE_WINSOCK2_H */ +#ifdef HAVE_WS2TCPIP_H +#include +#endif + #include #include +#include #include #include #include @@ -49,6 +59,14 @@ #include "mime.h" #include "httpd-utils.h" +#if defined(WIN32) || defined(_WIN32) +#include +typedef uint8_t u_int8_t; +typedef uint16_t u_int16_t; +typedef uint32_t u_int32_t; +typedef unsigned short in_port_t; +#endif /* WIN32 || _WIN32 */ + #define LISTEN_BACKLOG 100 typedef struct { @@ -64,6 +82,22 @@ typedef struct { } request_data_t; +static void +error_printf(const char *format, ...) +{ + va_list ap; + va_start(ap, format); +#if defined(WIN32) || defined(_WIN32) + bc_error_t *rv = bc_error_new_errno_vprintf(0, WSAGetLastError(), format, ap); +#else + bc_error_t *rv = bc_error_new_errno_vprintf(0, errno, format, ap); +#endif + va_end(ap); + fprintf(stderr, "%s\n", rv->msg); + bc_error_free(rv); +} + + static void error(int socket, int status_code, const char *error) { @@ -122,7 +156,7 @@ handle_request(void *arg) } char *abs_path = bc_strdup_printf("%s/%s", docroot, path); - char *real_path = realpath(abs_path, NULL); + char *real_path = bc_file_get_realpath(abs_path); free(abs_path); if (real_path == NULL) { @@ -137,7 +171,7 @@ handle_request(void *arg) goto point2; } - char *real_root = realpath(docroot, NULL); + char *real_root = bc_file_get_realpath(docroot); if (real_root == NULL) { status_code = 500; error(client_socket, 500, "Internal Server Error"); @@ -251,7 +285,11 @@ br_httpd_get_ip(int af, const struct sockaddr *addr) char host[INET6_ADDRSTRLEN]; if (af == AF_INET6) { struct sockaddr_in6 *a = (struct sockaddr_in6*) addr; +//#if defined(WIN32) || defined(_WIN32) +// InetNtopA(af, &(a->sin6_addr), host, INET6_ADDRSTRLEN); +//#else inet_ntop(af, &(a->sin6_addr), host, INET6_ADDRSTRLEN); +//#endif } else { struct sockaddr_in *a = (struct sockaddr_in*) addr; @@ -316,11 +354,12 @@ br_httpd_run(const char *host, const char *port, const char *docroot, for (rp = result; rp != NULL; rp = rp->ai_next) { final_host = br_httpd_get_ip(rp->ai_family, rp->ai_addr); final_port = br_httpd_get_port(rp->ai_family, rp->ai_addr); - server_socket = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + server_socket = socket(rp->ai_family, rp->ai_socktype, IPPROTO_TCP); + printf("%d\n", rp->ai_protocol); if (server_socket == -1) { if (rp->ai_next == NULL) { - fprintf(stderr, "Failed to open server socket (%s:%d): %s\n", - final_host, final_port, strerror(errno)); + error_printf("Failed to open server socket (%s:%d)", final_host, + final_port); rv = 3; goto cleanup0; } diff --git a/src/common/error.c b/src/common/error.c index a3a08e7..ef6edff 100644 --- a/src/common/error.c +++ b/src/common/error.c @@ -6,9 +6,19 @@ * See the file LICENSE. */ +#ifdef HAVE_CONFIG_H +#include +#endif /* HAVE_CONFIG_H */ + +#ifdef HAVE_WINDOWS_H +#include +#endif /* HAVE_WINDOWS_H */ + +#include #include #include #include +#include #include "error.h" #include "utils.h" @@ -23,19 +33,73 @@ bc_error_new(bc_error_type_t type, const char *msg) } +bc_error_t* +bc_error_new_vprintf(bc_error_type_t type, const char *format, va_list ap) +{ + char *tmp = bc_strdup_vprintf(format, ap); + bc_error_t *rv = bc_error_new(type, tmp); + free(tmp); + return rv; +} + + bc_error_t* bc_error_new_printf(bc_error_type_t type, const char *format, ...) { va_list ap; va_start(ap, format); - char *tmp = bc_strdup_vprintf(format, ap); + bc_error_t *rv = bc_error_new_vprintf(type, format, ap); va_end(ap); - bc_error_t *rv = bc_error_new(type, tmp); + return rv; +} + + +bc_error_t* +bc_error_new_errno_vprintf(bc_error_type_t type, int errno_, const char *format, + va_list ap) +{ + char *tmp = bc_strdup_vprintf(format, ap); +#if defined(WIN32) || defined(_WIN32) + LPTSTR buf = "bola"; + FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, + NULL, errno_, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)&buf, + 0, NULL); + bc_error_t *rv = bc_error_new_printf(type, "%s: %s", tmp, buf); + LocalFree(buf); +#else + bc_error_t *rv = bc_error_new_printf(type, "%s: %s", tmp, strerror(errno_)); +#endif free(tmp); return rv; } +bc_error_t* +bc_error_new_errno_printf(bc_error_type_t type, int errno_, const char *format, ...) +{ + va_list ap; + va_start(ap, format); + bc_error_t *rv = bc_error_new_errno_vprintf(type, errno_, format, ap); + va_end(ap); + return rv; +} + + +bc_error_t* +bc_error_new_default_errno_printf(bc_error_type_t type, const char *format, ...) +{ + va_list ap; + va_start(ap, format); +#if defined(WIN32) || defined(_WIN32) + bc_error_t *rv = bc_error_new_errno_vprintf(type, GetLastError(), format, ap); +#else + bc_error_t *rv = bc_error_new_errno_vprintf(type, errno, format, ap); +#endif + va_end(ap); + return rv; +} + + bc_error_t* bc_error_parser(bc_error_type_t type, const char *src, size_t src_len, size_t current, const char *format, ...) diff --git a/src/common/error.h b/src/common/error.h index 2aac439..ccb4228 100644 --- a/src/common/error.h +++ b/src/common/error.h @@ -9,6 +9,7 @@ #ifndef _ERROR_H #define _ERROR_H +#include #include // error handling is centralized here for the sake of simplicity :/ @@ -38,7 +39,14 @@ typedef struct { } bc_error_t; bc_error_t* bc_error_new(bc_error_type_t type, const char *msg); +bc_error_t* bc_error_new_vprintf(bc_error_type_t type, const char *format, va_list ap); bc_error_t* bc_error_new_printf(bc_error_type_t type, const char *format, ...); +bc_error_t* bc_error_new_errno_vprintf(bc_error_type_t type, int errno_, + const char *format, va_list ap); +bc_error_t* bc_error_new_errno_printf(bc_error_type_t type, int errno_, + const char *format, ...); +bc_error_t* bc_error_new_default_errno_printf(bc_error_type_t type, + const char *format, ...); bc_error_t* bc_error_parser(bc_error_type_t type, const char *src, size_t src_len, size_t current, const char *format, ...); void bc_error_print(bc_error_t *err, const char *prefix); diff --git a/src/common/file.c b/src/common/file.c index a2f7340..b44b202 100644 --- a/src/common/file.c +++ b/src/common/file.c @@ -7,9 +7,11 @@ */ #include +#include #include #include #include +#include #include #include "file.h" #include "error.h" @@ -64,3 +66,25 @@ bc_file_get_contents(const char *path, bool utf8, size_t *len, bc_error_t **err) return bc_string_free(str, false); } + + +char* +bc_file_get_realpath(const char *path) +{ + if (path == NULL) + return NULL; + +#if defined(WIN32) || defined(_WIN32) + char *buf = bc_malloc(_MAX_PATH); + if (NULL == _fullpath(buf, path, _MAX_PATH)) { +#else + char *buf = bc_malloc(PATH_MAX); + if (NULL == realpath(path, buf)) { +#endif + + free(buf); + return NULL; + } + + return buf; +} diff --git a/src/common/file.h b/src/common/file.h index 73793ea..73590c6 100644 --- a/src/common/file.h +++ b/src/common/file.h @@ -16,5 +16,6 @@ #define BC_FILE_CHUNK_SIZE 1024 char* bc_file_get_contents(const char *path, bool utf8, size_t *len, bc_error_t **err); +char* bc_file_get_realpath(const char *path); #endif /* _FILE_H */ -- cgit v1.2.3-18-g5258