From 65c1278975c9f21abdda36c987d3d526f77848aa Mon Sep 17 00:00:00 2001 From: Sergey Lyubka <valenok@gmail.com> Date: Thu, 16 Jan 2014 14:40:26 +0000 Subject: [PATCH] win32 build of server.c fixed --- examples/server.c | 38 ++++++++++++++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/examples/server.c b/examples/server.c index ae6265f35..7d84a8d43 100644 --- a/examples/server.c +++ b/examples/server.c @@ -39,12 +39,36 @@ #include "mongoose.h" +#ifdef _WIN32 +#include <windows.h> +#include <direct.h> // For chdir() +#include <winsvc.h> +#include <shlobj.h> + +#ifndef PATH_MAX +#define PATH_MAX MAX_PATH +#endif + +#ifndef S_ISDIR +#define S_ISDIR(x) ((x) & _S_IFDIR) +#endif + +#define DIRSEP '\\' +#define snprintf _snprintf +#define vsnprintf _vsnprintf +#define sleep(x) Sleep((x) * 1000) +#define abs_path(rel, abs, abs_size) _fullpath((abs), (rel), (abs_size)) +#define SIGCHLD 0 +typedef struct _stat file_stat_t; +#define stat(x, y) _stat((x), (y)) +#else typedef struct stat file_stat_t; #include <sys/wait.h> #include <unistd.h> #define DIRSEP '/' #define __cdecl #define abs_path(rel, abs, abs_size) realpath((rel), (abs)) +#endif // _WIN32 #define MAX_OPTIONS 100 #define MAX_CONF_FILE_LINE_SIZE (8 * 1024) @@ -62,19 +86,17 @@ static void __cdecl signal_handler(int sig_num) { // Reinstantiate signal handler signal(sig_num, signal_handler); +#ifndef _WIN32 // Do not do the trick with ignoring SIGCHLD, cause not all OSes (e.g. QNX) // reap zombies if SIGCHLD is ignored. On QNX, for example, waitpid() // fails if SIGCHLD is ignored, making system() non-functional. if (sig_num == SIGCHLD) { do {} while (waitpid(-1, &sig_num, WNOHANG) > 0); } else +#endif { exit_flag = sig_num; } } -#ifdef NO_GUI -#undef _WIN32 -#endif - static void die(const char *fmt, ...) { va_list ap; char msg[200]; @@ -209,7 +231,13 @@ static void init_server_name(void) { } static int is_path_absolute(const char *path) { +#ifdef _WIN32 + return path != NULL && + ((path[0] == '\\' && path[1] == '\\') || // UNC path, e.g. \\server\dir + (isalpha(path[0]) && path[1] == ':' && path[2] == '\\')); // E.g. X:\dir +#else return path != NULL && path[0] == '/'; +#endif } static char *get_option(char **options, const char *option_name) { @@ -398,7 +426,9 @@ static void start_mongoose(int argc, char *argv[]) { // Setup signal handler: quit on Ctrl-C signal(SIGTERM, signal_handler); signal(SIGINT, signal_handler); +#ifndef _WIN32 signal(SIGCHLD, signal_handler); +#endif } int main(int argc, char *argv[]) { -- GitLab