|
@@ -1,3 +1,4 @@
|
|
|
|
+<<<<<<< HEAD
|
|
// Copyright (c) 2004-2013 Sergey Lyubka
|
|
// Copyright (c) 2004-2013 Sergey Lyubka
|
|
//
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
@@ -22,6 +23,33 @@
|
|
#define _CRT_SECURE_NO_WARNINGS // Disable deprecation warning in VS2005
|
|
#define _CRT_SECURE_NO_WARNINGS // Disable deprecation warning in VS2005
|
|
#else
|
|
#else
|
|
#define _XOPEN_SOURCE 600 // For PATH_MAX on linux
|
|
#define _XOPEN_SOURCE 600 // For PATH_MAX on linux
|
|
|
|
+=======
|
|
|
|
+/* Copyright (c) 2004-2013 Sergey Lyubka
|
|
|
|
+ *
|
|
|
|
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
+ * of this software and associated documentation files (the "Software"), to deal
|
|
|
|
+ * in the Software without restriction, including without limitation the rights
|
|
|
|
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
+ * copies of the Software, and to permit persons to whom the Software is
|
|
|
|
+ * furnished to do so, subject to the following conditions:
|
|
|
|
+ *
|
|
|
|
+ * The above copyright notice and this permission notice shall be included in
|
|
|
|
+ * all copies or substantial portions of the Software.
|
|
|
|
+ *
|
|
|
|
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
+ * THE SOFTWARE.
|
|
|
|
+*/
|
|
|
|
+
|
|
|
|
+#if defined(_WIN32)
|
|
|
|
+#define _CRT_SECURE_NO_WARNINGS /* Disable deprecation warning in VS2005 */
|
|
|
|
+#else
|
|
|
|
+#define _XOPEN_SOURCE 600 /* For PATH_MAX on linux */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
#endif
|
|
#endif
|
|
|
|
|
|
#ifndef IGNORE_UNUSED_RESULT
|
|
#ifndef IGNORE_UNUSED_RESULT
|
|
@@ -69,21 +97,36 @@ extern char *_getcwd(char *buf, size_t size);
|
|
#define DIRSEP '/'
|
|
#define DIRSEP '/'
|
|
#define WINCDECL
|
|
#define WINCDECL
|
|
#define abs_path(rel, abs, abs_size) realpath((rel), (abs))
|
|
#define abs_path(rel, abs, abs_size) realpath((rel), (abs))
|
|
|
|
+<<<<<<< HEAD
|
|
#endif // _WIN32
|
|
#endif // _WIN32
|
|
|
|
+=======
|
|
|
|
+#endif /* _WIN32 */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
|
|
|
|
#define MAX_OPTIONS 100
|
|
#define MAX_OPTIONS 100
|
|
#define MAX_CONF_FILE_LINE_SIZE (8 * 1024)
|
|
#define MAX_CONF_FILE_LINE_SIZE (8 * 1024)
|
|
|
|
|
|
static int exit_flag;
|
|
static int exit_flag;
|
|
|
|
+<<<<<<< HEAD
|
|
static char server_name[40]; // Set by init_server_name()
|
|
static char server_name[40]; // Set by init_server_name()
|
|
static char config_file[PATH_MAX] = ""; // Set by process_command_line_arguments()
|
|
static char config_file[PATH_MAX] = ""; // Set by process_command_line_arguments()
|
|
static struct mg_context *ctx; // Set by start_civetweb()
|
|
static struct mg_context *ctx; // Set by start_civetweb()
|
|
|
|
+=======
|
|
|
|
+static char server_name[40]; /* Set by init_server_name() */
|
|
|
|
+static char config_file[PATH_MAX] = ""; /* Set by
|
|
|
|
+ process_command_line_arguments() */
|
|
|
|
+static struct mg_context *ctx; /* Set by start_civetweb() */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
|
|
|
|
#if !defined(CONFIG_FILE)
|
|
#if !defined(CONFIG_FILE)
|
|
#define CONFIG_FILE "civetweb.conf"
|
|
#define CONFIG_FILE "civetweb.conf"
|
|
#endif /* !CONFIG_FILE */
|
|
#endif /* !CONFIG_FILE */
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// backup config file
|
|
// backup config file
|
|
|
|
+=======
|
|
|
|
+/* backup config file */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
#if !defined(CONFIG_FILE2) && defined(LINUX)
|
|
#if !defined(CONFIG_FILE2) && defined(LINUX)
|
|
#define CONFIG_FILE2 "/usr/local/etc/civetweb.conf"
|
|
#define CONFIG_FILE2 "/usr/local/etc/civetweb.conf"
|
|
#endif
|
|
#endif
|
|
@@ -167,7 +210,11 @@ static void create_config_file(const char *path)
|
|
FILE *fp;
|
|
FILE *fp;
|
|
int i;
|
|
int i;
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Create config file if it is not present yet
|
|
// Create config file if it is not present yet
|
|
|
|
+=======
|
|
|
|
+ /* Create config file if it is not present yet */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
if ((fp = fopen(path, "r")) != NULL) {
|
|
if ((fp = fopen(path, "r")) != NULL) {
|
|
fclose(fp);
|
|
fclose(fp);
|
|
} else if ((fp = fopen(path, "a+")) != NULL) {
|
|
} else if ((fp = fopen(path, "a+")) != NULL) {
|
|
@@ -222,12 +269,20 @@ static void process_command_line_arguments(char *argv[], char **options)
|
|
FILE *fp = NULL;
|
|
FILE *fp = NULL;
|
|
size_t i, cmd_line_opts_start = 1, line_no = 0;
|
|
size_t i, cmd_line_opts_start = 1, line_no = 0;
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Should we use a config file ?
|
|
// Should we use a config file ?
|
|
|
|
+=======
|
|
|
|
+ /* Should we use a config file ? */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
if (argv[1] != NULL && argv[1][0] != '-') {
|
|
if (argv[1] != NULL && argv[1][0] != '-') {
|
|
snprintf(config_file, sizeof(config_file), "%s", argv[1]);
|
|
snprintf(config_file, sizeof(config_file), "%s", argv[1]);
|
|
cmd_line_opts_start = 2;
|
|
cmd_line_opts_start = 2;
|
|
} else if ((p = strrchr(argv[0], DIRSEP)) == NULL) {
|
|
} else if ((p = strrchr(argv[0], DIRSEP)) == NULL) {
|
|
|
|
+<<<<<<< HEAD
|
|
// No command line flags specified. Look where binary lives
|
|
// No command line flags specified. Look where binary lives
|
|
|
|
+=======
|
|
|
|
+ /* No command line flags specified. Look where binary lives */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
snprintf(config_file, sizeof(config_file)-1, "%s", CONFIG_FILE);
|
|
snprintf(config_file, sizeof(config_file)-1, "%s", CONFIG_FILE);
|
|
config_file[sizeof(config_file)-1] = 0;
|
|
config_file[sizeof(config_file)-1] = 0;
|
|
} else {
|
|
} else {
|
|
@@ -238,13 +293,21 @@ static void process_command_line_arguments(char *argv[], char **options)
|
|
|
|
|
|
fp = fopen(config_file, "r");
|
|
fp = fopen(config_file, "r");
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// If config file was set in command line and open failed, die
|
|
// If config file was set in command line and open failed, die
|
|
|
|
+=======
|
|
|
|
+ /* If config file was set in command line and open failed, die */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
if (cmd_line_opts_start == 2 && fp == NULL) {
|
|
if (cmd_line_opts_start == 2 && fp == NULL) {
|
|
die("Cannot open config file %s: %s", config_file, strerror(errno));
|
|
die("Cannot open config file %s: %s", config_file, strerror(errno));
|
|
}
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_FILE2
|
|
#ifdef CONFIG_FILE2
|
|
|
|
+<<<<<<< HEAD
|
|
// try alternate config file
|
|
// try alternate config file
|
|
|
|
+=======
|
|
|
|
+ /* try alternate config file */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
if (fp == NULL) {
|
|
if (fp == NULL) {
|
|
fp = fopen(CONFIG_FILE2, "r");
|
|
fp = fopen(CONFIG_FILE2, "r");
|
|
if (fp != NULL) {
|
|
if (fp != NULL) {
|
|
@@ -253,6 +316,7 @@ static void process_command_line_arguments(char *argv[], char **options)
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Load config file settings first
|
|
// Load config file settings first
|
|
if (fp != NULL) {
|
|
if (fp != NULL) {
|
|
fprintf(stderr, "Loading config file %s\n", config_file);
|
|
fprintf(stderr, "Loading config file %s\n", config_file);
|
|
@@ -270,6 +334,32 @@ static void process_command_line_arguments(char *argv[], char **options)
|
|
if (sscanf(line, "%s %[^\r\n#]", opt, val) != 2) {
|
|
if (sscanf(line, "%s %[^\r\n#]", opt, val) != 2) {
|
|
printf("%s: line %d is invalid, ignoring it:\n %s",
|
|
printf("%s: line %d is invalid, ignoring it:\n %s",
|
|
config_file, (int) line_no, line);
|
|
config_file, (int) line_no, line);
|
|
|
|
+=======
|
|
|
|
+ /* Load config file settings first */
|
|
|
|
+ if (fp != NULL) {
|
|
|
|
+ fprintf(stderr, "Loading config file %s\n", config_file);
|
|
|
|
+
|
|
|
|
+ /* Loop over the lines in config file */
|
|
|
|
+ while (fgets(line, sizeof(line), fp) != NULL) {
|
|
|
|
+
|
|
|
|
+ if (!line_no && !memcmp(line,"\xEF\xBB\xBF",3)) {
|
|
|
|
+ /* strip UTF-8 BOM */
|
|
|
|
+ p = line+3;
|
|
|
|
+ } else {
|
|
|
|
+ p = line;
|
|
|
|
+ }
|
|
|
|
+ line_no++;
|
|
|
|
+
|
|
|
|
+ /* Ignore empty lines and comments */
|
|
|
|
+ for (i = 0; isspace(* (unsigned char *) &line[i]); ) i++;
|
|
|
|
+ if (p[i] == '#' || p[i] == '\0') {
|
|
|
|
+ continue;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (sscanf(p, "%s %[^\r\n#]", opt, val) != 2) {
|
|
|
|
+ printf("%s: line %d is invalid, ignoring it:\n %s",
|
|
|
|
+ config_file, (int) line_no, p);
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
} else {
|
|
} else {
|
|
set_option(options, opt, val);
|
|
set_option(options, opt, val);
|
|
}
|
|
}
|
|
@@ -278,12 +368,21 @@ static void process_command_line_arguments(char *argv[], char **options)
|
|
(void) fclose(fp);
|
|
(void) fclose(fp);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// If we're under MacOS and started by launchd, then the second
|
|
// If we're under MacOS and started by launchd, then the second
|
|
// argument is process serial number, -psn_.....
|
|
// argument is process serial number, -psn_.....
|
|
// In this case, don't process arguments at all.
|
|
// In this case, don't process arguments at all.
|
|
if (argv[1] == NULL || memcmp(argv[1], "-psn_", 5) != 0) {
|
|
if (argv[1] == NULL || memcmp(argv[1], "-psn_", 5) != 0) {
|
|
// Handle command line flags.
|
|
// Handle command line flags.
|
|
// They override config file and default settings.
|
|
// They override config file and default settings.
|
|
|
|
+=======
|
|
|
|
+ /* If we're under MacOS and started by launchd, then the second
|
|
|
|
+ argument is process serial number, -psn_.....
|
|
|
|
+ In this case, don't process arguments at all. */
|
|
|
|
+ if (argv[1] == NULL || memcmp(argv[1], "-psn_", 5) != 0) {
|
|
|
|
+ /* Handle command line flags.
|
|
|
|
+ They override config file and default settings. */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
for (i = cmd_line_opts_start; argv[i] != NULL; i += 2) {
|
|
for (i = cmd_line_opts_start; argv[i] != NULL; i += 2) {
|
|
if (argv[i][0] != '-' || argv[i + 1] == NULL) {
|
|
if (argv[i][0] != '-' || argv[i + 1] == NULL) {
|
|
show_usage_and_exit();
|
|
show_usage_and_exit();
|
|
@@ -310,8 +409,14 @@ static int is_path_absolute(const char *path)
|
|
{
|
|
{
|
|
#ifdef _WIN32
|
|
#ifdef _WIN32
|
|
return path != NULL &&
|
|
return path != NULL &&
|
|
|
|
+<<<<<<< HEAD
|
|
((path[0] == '\\' && path[1] == '\\') || // UNC path, e.g. \\server\dir
|
|
((path[0] == '\\' && path[1] == '\\') || // UNC path, e.g. \\server\dir
|
|
(isalpha(path[0]) && path[1] == ':' && path[2] == '\\')); // E.g. X:\dir
|
|
(isalpha(path[0]) && path[1] == ':' && path[2] == '\\')); // E.g. X:\dir
|
|
|
|
+=======
|
|
|
|
+ ((path[0] == '\\' && path[1] == '\\') || /* UNC path, e.g.
|
|
|
|
+ \\server\dir */
|
|
|
|
+ (isalpha(path[0]) && path[1] == ':' && path[2] == '\\')); /* E.g. X:\dir */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
#else
|
|
#else
|
|
return path != NULL && path[0] == '/';
|
|
return path != NULL && path[0] == '/';
|
|
#endif
|
|
#endif
|
|
@@ -334,6 +439,23 @@ static void verify_existence(char **options, const char *option_name,
|
|
struct stat st;
|
|
struct stat st;
|
|
const char *path = get_option(options, option_name);
|
|
const char *path = get_option(options, option_name);
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
|
|
+=======
|
|
|
|
+#ifdef _WIN32
|
|
|
|
+ wchar_t wbuf[1024];
|
|
|
|
+ char mbbuf[1024];
|
|
|
|
+ int len;
|
|
|
|
+
|
|
|
|
+ if (path) {
|
|
|
|
+ memset(wbuf, 0, sizeof(wbuf));
|
|
|
|
+ memset(mbbuf, 0, sizeof(mbbuf));
|
|
|
|
+ len = MultiByteToWideChar(CP_UTF8, 0, path, -1, wbuf, (int) sizeof(wbuf)/sizeof(wbuf[0])-1);
|
|
|
|
+ wcstombs(mbbuf, wbuf, sizeof(mbbuf)-1);
|
|
|
|
+ path = mbbuf;
|
|
|
|
+ }
|
|
|
|
+#endif
|
|
|
|
+
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
if (path != NULL && (stat(path, &st) != 0 ||
|
|
if (path != NULL && (stat(path, &st) != 0 ||
|
|
((S_ISDIR(st.st_mode) ? 1 : 0) != must_be_dir))) {
|
|
((S_ISDIR(st.st_mode) ? 1 : 0) != must_be_dir))) {
|
|
die("Invalid path for %s: [%s]: (%s). Make sure that path is either "
|
|
die("Invalid path for %s: [%s]: (%s). Make sure that path is either "
|
|
@@ -348,6 +470,7 @@ static void set_absolute_path(char *options[], const char *option_name,
|
|
char path[PATH_MAX] = "", abs[PATH_MAX] = "", *option_value;
|
|
char path[PATH_MAX] = "", abs[PATH_MAX] = "", *option_value;
|
|
const char *p;
|
|
const char *p;
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Check whether option is already set
|
|
// Check whether option is already set
|
|
option_value = get_option(options, option_name);
|
|
option_value = get_option(options, option_name);
|
|
|
|
|
|
@@ -357,6 +480,17 @@ static void set_absolute_path(char *options[], const char *option_name,
|
|
// Not absolute. Use the directory where civetweb executable lives
|
|
// Not absolute. Use the directory where civetweb executable lives
|
|
// be the relative directory for everything.
|
|
// be the relative directory for everything.
|
|
// Extract civetweb executable directory into path.
|
|
// Extract civetweb executable directory into path.
|
|
|
|
+=======
|
|
|
|
+ /* Check whether option is already set */
|
|
|
|
+ option_value = get_option(options, option_name);
|
|
|
|
+
|
|
|
|
+ /* If option is already set and it is an absolute path,
|
|
|
|
+ leave it as it is -- it's already absolute. */
|
|
|
|
+ if (option_value != NULL && !is_path_absolute(option_value)) {
|
|
|
|
+ /* Not absolute. Use the directory where civetweb executable lives
|
|
|
|
+ be the relative directory for everything.
|
|
|
|
+ Extract civetweb executable directory into path. */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
if ((p = strrchr(path_to_civetweb_exe, DIRSEP)) == NULL) {
|
|
if ((p = strrchr(path_to_civetweb_exe, DIRSEP)) == NULL) {
|
|
IGNORE_UNUSED_RESULT(getcwd(path, sizeof(path)));
|
|
IGNORE_UNUSED_RESULT(getcwd(path, sizeof(path)));
|
|
} else {
|
|
} else {
|
|
@@ -368,7 +502,11 @@ static void set_absolute_path(char *options[], const char *option_name,
|
|
strncat(path, "/", sizeof(path) - 1);
|
|
strncat(path, "/", sizeof(path) - 1);
|
|
strncat(path, option_value, sizeof(path) - 1);
|
|
strncat(path, option_value, sizeof(path) - 1);
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Absolutize the path, and set the option
|
|
// Absolutize the path, and set the option
|
|
|
|
+=======
|
|
|
|
+ /* Absolutize the path, and set the option */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
IGNORE_UNUSED_RESULT(abs_path(path, abs, sizeof(abs)));
|
|
IGNORE_UNUSED_RESULT(abs_path(path, abs, sizeof(abs)));
|
|
set_option(options, option_name, abs);
|
|
set_option(options, option_name, abs);
|
|
}
|
|
}
|
|
@@ -380,7 +518,11 @@ static void start_civetweb(int argc, char *argv[])
|
|
char *options[MAX_OPTIONS];
|
|
char *options[MAX_OPTIONS];
|
|
int i;
|
|
int i;
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Edit passwords file if -A option is specified
|
|
// Edit passwords file if -A option is specified
|
|
|
|
+=======
|
|
|
|
+ /* Edit passwords file if -A option is specified */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
if (argc > 1 && !strcmp(argv[1], "-A")) {
|
|
if (argc > 1 && !strcmp(argv[1], "-A")) {
|
|
if (argc != 6) {
|
|
if (argc != 6) {
|
|
show_usage_and_exit();
|
|
show_usage_and_exit();
|
|
@@ -389,7 +531,11 @@ static void start_civetweb(int argc, char *argv[])
|
|
EXIT_SUCCESS : EXIT_FAILURE);
|
|
EXIT_SUCCESS : EXIT_FAILURE);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Show usage if -h or --help options are specified
|
|
// Show usage if -h or --help options are specified
|
|
|
|
+=======
|
|
|
|
+ /* Show usage if -h or --help options are specified */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
if (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))) {
|
|
if (argc == 2 && (!strcmp(argv[1], "-h") || !strcmp(argv[1], "--help"))) {
|
|
show_usage_and_exit();
|
|
show_usage_and_exit();
|
|
}
|
|
}
|
|
@@ -397,10 +543,17 @@ static void start_civetweb(int argc, char *argv[])
|
|
options[0] = NULL;
|
|
options[0] = NULL;
|
|
set_option(options, "document_root", ".");
|
|
set_option(options, "document_root", ".");
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Update config based on command line arguments
|
|
// Update config based on command line arguments
|
|
process_command_line_arguments(argv, options);
|
|
process_command_line_arguments(argv, options);
|
|
|
|
|
|
// Make sure we have absolute paths for files and directories
|
|
// Make sure we have absolute paths for files and directories
|
|
|
|
+=======
|
|
|
|
+ /* Update config based on command line arguments */
|
|
|
|
+ process_command_line_arguments(argv, options);
|
|
|
|
+
|
|
|
|
+ /* Make sure we have absolute paths for files and directories */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
set_absolute_path(options, "document_root", argv[0]);
|
|
set_absolute_path(options, "document_root", argv[0]);
|
|
set_absolute_path(options, "put_delete_auth_file", argv[0]);
|
|
set_absolute_path(options, "put_delete_auth_file", argv[0]);
|
|
set_absolute_path(options, "cgi_interpreter", argv[0]);
|
|
set_absolute_path(options, "cgi_interpreter", argv[0]);
|
|
@@ -409,16 +562,28 @@ static void start_civetweb(int argc, char *argv[])
|
|
set_absolute_path(options, "global_auth_file", argv[0]);
|
|
set_absolute_path(options, "global_auth_file", argv[0]);
|
|
set_absolute_path(options, "ssl_certificate", argv[0]);
|
|
set_absolute_path(options, "ssl_certificate", argv[0]);
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Make extra verification for certain options
|
|
// Make extra verification for certain options
|
|
|
|
+=======
|
|
|
|
+ /* Make extra verification for certain options */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
verify_existence(options, "document_root", 1);
|
|
verify_existence(options, "document_root", 1);
|
|
verify_existence(options, "cgi_interpreter", 0);
|
|
verify_existence(options, "cgi_interpreter", 0);
|
|
verify_existence(options, "ssl_certificate", 0);
|
|
verify_existence(options, "ssl_certificate", 0);
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Setup signal handler: quit on Ctrl-C
|
|
// Setup signal handler: quit on Ctrl-C
|
|
signal(SIGTERM, signal_handler);
|
|
signal(SIGTERM, signal_handler);
|
|
signal(SIGINT, signal_handler);
|
|
signal(SIGINT, signal_handler);
|
|
|
|
|
|
// Start Civetweb
|
|
// Start Civetweb
|
|
|
|
+=======
|
|
|
|
+ /* Setup signal handler: quit on Ctrl-C */
|
|
|
|
+ signal(SIGTERM, signal_handler);
|
|
|
|
+ signal(SIGINT, signal_handler);
|
|
|
|
+
|
|
|
|
+ /* Start Civetweb */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
memset(&callbacks, 0, sizeof(callbacks));
|
|
memset(&callbacks, 0, sizeof(callbacks));
|
|
callbacks.log_message = &log_message;
|
|
callbacks.log_message = &log_message;
|
|
ctx = mg_start(&callbacks, NULL, (const char **) options);
|
|
ctx = mg_start(&callbacks, NULL, (const char **) options);
|
|
@@ -437,6 +602,7 @@ enum {
|
|
ID_REMOVE_SERVICE, ID_STATIC, ID_GROUP, ID_SAVE, ID_RESET_DEFAULTS,
|
|
ID_REMOVE_SERVICE, ID_STATIC, ID_GROUP, ID_SAVE, ID_RESET_DEFAULTS,
|
|
ID_STATUS, ID_CONNECT,
|
|
ID_STATUS, ID_CONNECT,
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// All dynamically created text boxes for options have IDs starting from
|
|
// All dynamically created text boxes for options have IDs starting from
|
|
// ID_CONTROLS, incremented by one.
|
|
// ID_CONTROLS, incremented by one.
|
|
ID_CONTROLS = 200,
|
|
ID_CONTROLS = 200,
|
|
@@ -444,6 +610,15 @@ enum {
|
|
// Text boxes for files have "..." buttons to open file browser. These
|
|
// Text boxes for files have "..." buttons to open file browser. These
|
|
// buttons have IDs that are ID_FILE_BUTTONS_DELTA higher than associated
|
|
// buttons have IDs that are ID_FILE_BUTTONS_DELTA higher than associated
|
|
// text box ID.
|
|
// text box ID.
|
|
|
|
+=======
|
|
|
|
+ /* All dynamically created text boxes for options have IDs starting from
|
|
|
|
+ ID_CONTROLS, incremented by one. */
|
|
|
|
+ ID_CONTROLS = 200,
|
|
|
|
+
|
|
|
|
+ /* Text boxes for files have "..." buttons to open file browser. These
|
|
|
|
+ buttons have IDs that are ID_FILE_BUTTONS_DELTA higher than associated
|
|
|
|
+ text box ID. */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
ID_FILE_BUTTONS_DELTA = 1000
|
|
ID_FILE_BUTTONS_DELTA = 1000
|
|
};
|
|
};
|
|
static HICON hIcon;
|
|
static HICON hIcon;
|
|
@@ -544,7 +719,11 @@ static void save_config(HWND hDlg, FILE *fp)
|
|
GetDlgItemText(hDlg, id, value, sizeof(value));
|
|
GetDlgItemText(hDlg, id, value, sizeof(value));
|
|
}
|
|
}
|
|
default_value = options[i * 2 + 1] == NULL ? "" : options[i * 2 + 1];
|
|
default_value = options[i * 2 + 1] == NULL ? "" : options[i * 2 + 1];
|
|
|
|
+<<<<<<< HEAD
|
|
// If value is the same as default, skip it
|
|
// If value is the same as default, skip it
|
|
|
|
+=======
|
|
|
|
+ /* If value is the same as default, skip it */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
if (strcmp(value, default_value) != 0) {
|
|
if (strcmp(value, default_value) != 0) {
|
|
fprintf(fp, "%s %s\n", name, value);
|
|
fprintf(fp, "%s %s\n", name, value);
|
|
}
|
|
}
|
|
@@ -694,7 +873,11 @@ static void show_settings_dialog()
|
|
static int guard;
|
|
static int guard;
|
|
|
|
|
|
static struct {
|
|
static struct {
|
|
|
|
+<<<<<<< HEAD
|
|
DLGTEMPLATE template; // 18 bytes
|
|
DLGTEMPLATE template; // 18 bytes
|
|
|
|
+=======
|
|
|
|
+ DLGTEMPLATE template; /* 18 bytes */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
WORD menu, class;
|
|
WORD menu, class;
|
|
wchar_t caption[1];
|
|
wchar_t caption[1];
|
|
WORD fontsiz;
|
|
WORD fontsiz;
|
|
@@ -775,7 +958,11 @@ static int manage_service(int action)
|
|
static const char *service_name = "Civetweb";
|
|
static const char *service_name = "Civetweb";
|
|
SC_HANDLE hSCM = NULL, hService = NULL;
|
|
SC_HANDLE hSCM = NULL, hService = NULL;
|
|
SERVICE_DESCRIPTION descr = {server_name};
|
|
SERVICE_DESCRIPTION descr = {server_name};
|
|
|
|
+<<<<<<< HEAD
|
|
char path[PATH_MAX + 20] = ""; // Path to executable plus magic argument
|
|
char path[PATH_MAX + 20] = ""; // Path to executable plus magic argument
|
|
|
|
+=======
|
|
|
|
+ char path[PATH_MAX + 20] = "";/* Path to executable plus magic argument */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
int success = 1;
|
|
int success = 1;
|
|
|
|
|
|
if ((hSCM = OpenSCManager(NULL, NULL, action == ID_INSTALL_SERVICE ?
|
|
if ((hSCM = OpenSCManager(NULL, NULL, action == ID_INSTALL_SERVICE ?
|
|
@@ -825,7 +1012,11 @@ static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam,
|
|
char buf[200], *service_argv[] = {__argv[0], NULL};
|
|
char buf[200], *service_argv[] = {__argv[0], NULL};
|
|
POINT pt;
|
|
POINT pt;
|
|
HMENU hMenu;
|
|
HMENU hMenu;
|
|
|
|
+<<<<<<< HEAD
|
|
static UINT s_uTaskbarRestart; // for taskbar creation
|
|
static UINT s_uTaskbarRestart; // for taskbar creation
|
|
|
|
+=======
|
|
|
|
+ static UINT s_uTaskbarRestart; /* for taskbar creation */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
|
|
|
|
switch (msg) {
|
|
switch (msg) {
|
|
case WM_CREATE:
|
|
case WM_CREATE:
|
|
@@ -894,7 +1085,11 @@ static LRESULT CALLBACK WindowProc(HWND hWnd, UINT msg, WPARAM wParam,
|
|
mg_stop(ctx);
|
|
mg_stop(ctx);
|
|
Shell_NotifyIcon(NIM_DELETE, &TrayIcon);
|
|
Shell_NotifyIcon(NIM_DELETE, &TrayIcon);
|
|
PostQuitMessage(0);
|
|
PostQuitMessage(0);
|
|
|
|
+<<<<<<< HEAD
|
|
return 0; // We've just sent our own quit message, with proper hwnd.
|
|
return 0; // We've just sent our own quit message, with proper hwnd.
|
|
|
|
+=======
|
|
|
|
+ return 0;/* We've just sent our own quit message, with proper hwnd. */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
default:
|
|
default:
|
|
if (msg==s_uTaskbarRestart)
|
|
if (msg==s_uTaskbarRestart)
|
|
Shell_NotifyIcon(NIM_ADD, &TrayIcon);
|
|
Shell_NotifyIcon(NIM_ADD, &TrayIcon);
|
|
@@ -936,7 +1131,11 @@ int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR cmdline, int show)
|
|
DispatchMessage(&msg);
|
|
DispatchMessage(&msg);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Return the WM_QUIT value.
|
|
// Return the WM_QUIT value.
|
|
|
|
+=======
|
|
|
|
+ /* Return the WM_QUIT value. */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
return (int) msg.wParam;
|
|
return (int) msg.wParam;
|
|
}
|
|
}
|
|
#elif defined(USE_COCOA)
|
|
#elif defined(USE_COCOA)
|
|
@@ -973,15 +1172,24 @@ int main(int argc, char *argv[])
|
|
[NSAutoreleasePool new];
|
|
[NSAutoreleasePool new];
|
|
[NSApplication sharedApplication];
|
|
[NSApplication sharedApplication];
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Add delegate to process menu item actions
|
|
// Add delegate to process menu item actions
|
|
Civetweb *myDelegate = [[Civetweb alloc] autorelease];
|
|
Civetweb *myDelegate = [[Civetweb alloc] autorelease];
|
|
[NSApp setDelegate: myDelegate];
|
|
[NSApp setDelegate: myDelegate];
|
|
|
|
|
|
// Run this app as agent
|
|
// Run this app as agent
|
|
|
|
+=======
|
|
|
|
+ /* Add delegate to process menu item actions */
|
|
|
|
+ Civetweb *myDelegate = [[Civetweb alloc] autorelease];
|
|
|
|
+[NSApp setDelegate: myDelegate];
|
|
|
|
+
|
|
|
|
+ /* Run this app as agent */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
ProcessSerialNumber psn = { 0, kCurrentProcess };
|
|
ProcessSerialNumber psn = { 0, kCurrentProcess };
|
|
TransformProcessType(&psn, kProcessTransformToBackgroundApplication);
|
|
TransformProcessType(&psn, kProcessTransformToBackgroundApplication);
|
|
SetFrontProcess(&psn);
|
|
SetFrontProcess(&psn);
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Add status bar menu
|
|
// Add status bar menu
|
|
id menu = [[NSMenu new] autorelease];
|
|
id menu = [[NSMenu new] autorelease];
|
|
|
|
|
|
@@ -992,31 +1200,62 @@ int main(int argc, char *argv[])
|
|
action:@selector(noexist) keyEquivalent:@""] autorelease]];
|
|
action:@selector(noexist) keyEquivalent:@""] autorelease]];
|
|
|
|
|
|
// Add configuration menu item
|
|
// Add configuration menu item
|
|
|
|
+=======
|
|
|
|
+ /* Add status bar menu */
|
|
|
|
+ id menu = [[NSMenu new] autorelease];
|
|
|
|
+
|
|
|
|
+ /* Add version menu item */
|
|
|
|
+[menu addItem:[[[NSMenuItem alloc]
|
|
|
|
+ /*initWithTitle:[NSString stringWithFormat:@"%s", server_name]*/
|
|
|
|
+ initWithTitle:[NSString stringWithUTF8String:server_name]
|
|
|
|
+ action:@selector(noexist) keyEquivalent:@""] autorelease]];
|
|
|
|
+
|
|
|
|
+ /* Add configuration menu item */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
[menu addItem:[[[NSMenuItem alloc]
|
|
[menu addItem:[[[NSMenuItem alloc]
|
|
initWithTitle:@"Edit configuration"
|
|
initWithTitle:@"Edit configuration"
|
|
action:@selector(editConfig) keyEquivalent:@""] autorelease]];
|
|
action:@selector(editConfig) keyEquivalent:@""] autorelease]];
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Add connect menu item
|
|
// Add connect menu item
|
|
|
|
+=======
|
|
|
|
+ /* Add connect menu item */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
[menu addItem:[[[NSMenuItem alloc]
|
|
[menu addItem:[[[NSMenuItem alloc]
|
|
initWithTitle:@"Open web root in a browser"
|
|
initWithTitle:@"Open web root in a browser"
|
|
action:@selector(openBrowser) keyEquivalent:@""] autorelease]];
|
|
action:@selector(openBrowser) keyEquivalent:@""] autorelease]];
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Separator
|
|
// Separator
|
|
[menu addItem:[NSMenuItem separatorItem]];
|
|
[menu addItem:[NSMenuItem separatorItem]];
|
|
|
|
|
|
// Add quit menu item
|
|
// Add quit menu item
|
|
|
|
+=======
|
|
|
|
+ /* Separator */
|
|
|
|
+[menu addItem:[NSMenuItem separatorItem]];
|
|
|
|
+
|
|
|
|
+ /* Add quit menu item */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
[menu addItem:[[[NSMenuItem alloc]
|
|
[menu addItem:[[[NSMenuItem alloc]
|
|
initWithTitle:@"Quit"
|
|
initWithTitle:@"Quit"
|
|
action:@selector(shutDown) keyEquivalent:@"q"] autorelease]];
|
|
action:@selector(shutDown) keyEquivalent:@"q"] autorelease]];
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Attach menu to the status bar
|
|
// Attach menu to the status bar
|
|
|
|
+=======
|
|
|
|
+ /* Attach menu to the status bar */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
id item = [[[NSStatusBar systemStatusBar]
|
|
id item = [[[NSStatusBar systemStatusBar]
|
|
statusItemWithLength:NSVariableStatusItemLength] retain];
|
|
statusItemWithLength:NSVariableStatusItemLength] retain];
|
|
[item setHighlightMode:YES];
|
|
[item setHighlightMode:YES];
|
|
[item setImage:[NSImage imageNamed:@"civetweb_22x22.png"]];
|
|
[item setImage:[NSImage imageNamed:@"civetweb_22x22.png"]];
|
|
[item setMenu:menu];
|
|
[item setMenu:menu];
|
|
|
|
|
|
|
|
+<<<<<<< HEAD
|
|
// Run the app
|
|
// Run the app
|
|
|
|
+=======
|
|
|
|
+ /* Run the app */
|
|
|
|
+>>>>>>> b393b8d2410737a01a0d18987b5dfc185b3c0ef3
|
|
[NSApp activateIgnoringOtherApps:YES];
|
|
[NSApp activateIgnoringOtherApps:YES];
|
|
[NSApp run];
|
|
[NSApp run];
|
|
|
|
|