Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in / Register
Toggle navigation
M
mongoose
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Packages
Packages
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
submodule
mongoose
Commits
41b405d7
Commit
41b405d7
authored
Jul 13, 2015
by
Sergey Lyubka
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove examples/web_server
parent
30b80dc5
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
0 additions
and
566 deletions
+0
-566
Makefile
examples/web_server/Makefile
+0
-30
cert.pem
examples/web_server/certs/cert.pem
+0
-46
web_server.c
examples/web_server/web_server.c
+0
-490
No files found.
examples/web_server/Makefile
deleted
100644 → 0
View file @
30b80dc5
# Copyright (c) 2014 Cesanta Software
# All rights reserved
PROG
=
web_server
CFLAGS
=
-W
-Wall
-I
../..
-g
-O0
$(CFLAGS_EXTRA)
SOURCES
=
$(PROG)
.c ../../mongoose.c
OPENSSL_FLAGS
=
-DNS_ENABLE_SSL
-lssl
# PolarSSL paths and flags
POLARSSL_PATH
=
/usr/local
POLARSSLCOMPAT_PATH
=
./../../../polar
SOURCES_POLAR
=
$(SOURCES)
$(POLARSSLCOMPAT_PATH)
/polarssl_compat.c
INCDIR_POLAR
=
-I
$(POLARSSLCOMPAT_PATH)
-I
$(POLARSSL_PATH)
/include
LDFLAGS_POLAR
=
-L
$(POLARSSL_PATH)
/lib
-lmbedtls
CFLAGS_POLAR
=
$(CFLAGS)
$(INCDIR_POLAR)
-DNS_ENABLE_SSL
$(PROG)
:
$(SOURCES)
$(CC)
-o
$(PROG)
$(SOURCES)
$(CFLAGS)
$(PROG).exe
:
$(SOURCES)
cl
-Fo
$(PROG)
$(SOURCES)
-nologo
-MD
-I
../..
openssl
:
$(CC)
-o
$(PROG)
$(SOURCES)
$(CFLAGS)
$(OPENSSL_FLAGS)
polarssl
:
$(CC)
-o
$(PROG)
$(SOURCES_POLAR)
$(LDFLAGS_POLAR)
$(CFLAGS_POLAR)
clean
:
rm
-rf
$(PROG)
*
.exe
*
.dSYM
*
.obj
*
.exp .
*
o
*
.lib
examples/web_server/certs/cert.pem
deleted
100644 → 0
View file @
30b80dc5
-----BEGIN CERTIFICATE-----
MIIC+zCCAeOgAwIBAgIJAPhB8jbL+G82MA0GCSqGSIb3DQEBCwUAMBQxEjAQBgNV
BAMMCTEyNy4wLjAuMTAeFw0xNTAzMDYxMjQzMzNaFw0yNTAzMDMxMjQzMzNaMBQx
EjAQBgNVBAMMCTEyNy4wLjAuMTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
ggEBALi3b3daMgzUEROKob1Caf68i+//cTRkPdBJv2cOBak21CdQzY0Nvx73GLzf
5TKB347BCHNbYRKGJXDbYdmFp20/WeBHkY7RS3Ad2Q5lzyx66u9PxNx7hJIiqBgF
58VU+E3o/I+o8QNIoOT+wtCiq3Nwkp+zGBJmS32rzMEV9bcKxSzMrkfRhF+XAREd
DwM9vfPg6WRb/b+vv06uvVwcw390RprLautGfBdaRddVYkIAKJGRRTqZAvTRFW1J
FcIVOxlN+iA7qP7xjr3tUP78qMmlu0MXsHrUR2cgfveZK2sdUW5G804yHsU5sC8l
FbtLKMEOyLsk2bEIScOXgum7g2sCAwEAAaNQME4wHQYDVR0OBBYEFHtLzUqAsXkH
Il8S5sMhJuVhRJLdMB8GA1UdIwQYMBaAFHtLzUqAsXkHIl8S5sMhJuVhRJLdMAwG
A1UdEwQFMAMBAf8wDQYJKoZIhvcNAQELBQADggEBAEzHc0AOr+qs0OFvWMfcSMi7
O/aYlLS6f7Sos+lli69+61EcmCTJVarVeAVUsAoqmzBKDbeOpAK1hGX6/GGcXjR2
BmuU0hUKyX9l1lwdMKU45BayH/riElwnvAyj2GxKoPpdIjlHns4SAITOCUx9NfpM
agd7kjolton0ZQ5DI/2a43PkqHv1lY4Dp60wJlxit9U68bsGOycCJ/BsAyrPROb2
D1MkpMBIdfHc8uxRywM3/l9buFX8yrrMUGOYKgfjDwdzbj0iwIixoGpHL7IfeBtu
dvGO/g2rEhbtAP+xIgOR3GvzqjZh30er3no7zjDMn65tTME18Aq3tBQY7vPDKms=
-----END CERTIFICATE-----
-----BEGIN PRIVATE KEY-----
MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC4t293WjIM1BET
iqG9Qmn+vIvv/3E0ZD3QSb9nDgWpNtQnUM2NDb8e9xi83+Uygd+OwQhzW2EShiVw
22HZhadtP1ngR5GO0UtwHdkOZc8seurvT8Tce4SSIqgYBefFVPhN6PyPqPEDSKDk
/sLQoqtzcJKfsxgSZkt9q8zBFfW3CsUszK5H0YRflwERHQ8DPb3z4OlkW/2/r79O
rr1cHMN/dEaay2rrRnwXWkXXVWJCACiRkUU6mQL00RVtSRXCFTsZTfogO6j+8Y69
7VD+/KjJpbtDF7B61EdnIH73mStrHVFuRvNOMh7FObAvJRW7SyjBDsi7JNmxCEnD
l4Lpu4NrAgMBAAECggEAaFuqbAHXOQwuwZ2XFzgIblTTsrncmT7w9VZU/sIbTKif
X771AnX7vmDX5w2PjeN2DE7emV3NEAwd5w7qz1wFZWFfQ6jrgYaZWjRixxGZ5IVl
aeLlU7OtCGrwEPJ1KTWCO3IgDoHh+Hr1+6o7Imhk+QlmrTcfqHWGvO9s9MGVWt2S
RLAnSTFiOe5brdJnmlqq1sKZmnLmpydBaPUOYpZGAgRasrjdMZB+lZOazd1x23/5
GAcm0rDREMnO9b2Jt+TNEZHT6d5KpVoExztZEZj8QCLXoic/SpFIqHGtpNlQXa+d
BVqgQbIYjO8ldldxZ8YIyJDVF+9e/uBBwu6jBIIsEQKBgQDspEHCyyuh4LG+7BbZ
eXlsfCxPTM6K9w31ZwHAwRtAuGqrOrE+pFJG9CEsFZbAI1aOGmZZdjexuSMcOlXl
TIVJTQHoFtoGEsanYEXO4O1t02Ab/DCYSpXusXUraRBRPpsTC77Sh5mxLUNd23d9
NhnDBuwChAmC+IYexjkXeqPYFwKBgQDH08PEd+2PVo4MD8UVKUlEcgoyCr6ESiyp
HfYyhhfd5x3DbZLoKCkunDfBs/hakQk8DA2nn4tl4ZjfmzXmX0EBx+E5YTdYshW7
ZcjN5x64B5PEOAR/NZA6agNlp3XGXXXgX+gnN6pgE49eVU22nZ4G+QBKD6NcCviB
LBPUxMbvzQKBgHgZYRqonGtaqzsXfP1AjmSFnMNeWtDiU95BOf2Gw/sT3WcrsXr2
UJ+cFR3XkxvOk4YpVdp/igKT0ILqBGAMdvTdtWMB/gLpEpMt5B/7veRoS7XIRy1z
ZSawP6QZfWOOX4vKAT29/j2SmEcRNFKC245EfBFGy8EBuqfxuFX3MyJfAoGBAJ0y
tjsErVmpma1baosvI3g4zlR3p1CimWehLmCopHXorr1iocMIdP0535L+ZU258y3N
vaA0HpFTW9PsYgaMwLMJ7uAY3lVkIzx84e849i2HqHMgLkl0dbW+WFXL2xblxylv
yU2wuNNED/EB4lTawcpycAvTKYvrBXt4lVE4S9exAoGAGl6vZV3zyw4jpIw4uDfk
LTPYUrghFDDGKExyeOnC/W9pqR2veqzfBz02C3jqwhewoqgAcnNc2sg0rJmM+6Oz
Z2mmGZTHO9xR++7+W7e8AkQBbS6TB8a+7yNcM4USLP+b9sX5N+8gFhFs9tG7j/no
G44qLsJ/yve7/QsOA37uEMs=
-----END PRIVATE KEY-----
examples/web_server/web_server.c
deleted
100644 → 0
View file @
30b80dc5
// Copyright (c) 2004-2013 Sergey Lyubka
// Copyright (c) 2013-2014 Cesanta Software Limited
#undef UNICODE // Use ANSI WinAPI functions
#undef _UNICODE // Use multibyte encoding on Windows
#define _MBCS // Use multibyte encoding on Windows
#define _WIN32_WINNT 0x500 // Enable MIIM_BITMAP
#define _CRT_SECURE_NO_WARNINGS // Disable deprecation warning in VS2005
#define _XOPEN_SOURCE 600 // For PATH_MAX on linux
#undef WIN32_LEAN_AND_MEAN // Let windows.h always include winsock2.h
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <string.h>
#include <errno.h>
#include <limits.h>
#include <stddef.h>
#include <stdarg.h>
#include <ctype.h>
#include <time.h>
#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
#ifndef sleep
#define sleep(x) Sleep((x) * 1000)
#endif
#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>
#ifdef IOS
#include <ifaddrs.h>
#endif
#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)
#ifndef MVER
#define MVER MONGOOSE_VERSION
#endif
static
int
exit_flag
;
static
char
server_name
[
50
];
// Set by init_server_name()
static
char
s_config_file
[
PATH_MAX
];
// Set by process_command_line_arguments
static
struct
mg_server
*
server
;
// Set by start_mongoose()
static
const
char
*
s_default_document_root
=
"."
;
static
const
char
*
s_default_listening_port
=
"8080"
;
static
char
**
s_argv
=
{
NULL
};
static
void
set_options
(
char
*
argv
[]);
#if !defined(CONFIG_FILE)
#define CONFIG_FILE "mongoose.conf"
#endif
/* !CONFIG_FILE */
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
;
}
}
static
void
vnotify
(
const
char
*
fmt
,
va_list
ap
,
int
must_exit
)
{
vfprintf
(
stderr
,
fmt
,
ap
);
fputc
(
'\n'
,
stderr
);
if
(
must_exit
)
{
exit
(
EXIT_FAILURE
);
}
}
static
void
notify
(
const
char
*
fmt
,
...)
{
va_list
ap
;
va_start
(
ap
,
fmt
);
vnotify
(
fmt
,
ap
,
0
);
va_end
(
ap
);
}
static
void
die
(
const
char
*
fmt
,
...)
{
va_list
ap
;
va_start
(
ap
,
fmt
);
vnotify
(
fmt
,
ap
,
1
);
va_end
(
ap
);
}
static
void
show_usage_and_exit
(
void
)
{
const
char
**
names
;
int
i
;
fprintf
(
stderr
,
"Mongoose version %s (c) Sergey Lyubka, built on %s
\n
"
,
MVER
,
__DATE__
);
fprintf
(
stderr
,
"Usage:
\n
"
);
#if !defined(MONGOOSE_NO_AUTH) && !defined(MONGOOSE_NO_FILESYSTEM)
fprintf
(
stderr
,
" mongoose -A <htpasswd_file> <realm> <user> <passwd>
\n
"
);
#endif
fprintf
(
stderr
,
" mongoose [config_file]
\n
"
);
fprintf
(
stderr
,
" mongoose [-option value ...]
\n
"
);
fprintf
(
stderr
,
"
\n
OPTIONS:
\n
"
);
names
=
mg_get_valid_option_names
();
for
(
i
=
0
;
names
[
i
]
!=
NULL
;
i
+=
2
)
{
fprintf
(
stderr
,
" -%s %s
\n
"
,
names
[
i
],
names
[
i
+
1
]
==
NULL
?
"<empty>"
:
names
[
i
+
1
]);
}
exit
(
EXIT_FAILURE
);
}
#define EV_HANDLER NULL
static
char
*
sdup
(
const
char
*
str
)
{
char
*
p
;
if
((
p
=
(
char
*
)
malloc
(
strlen
(
str
)
+
1
))
!=
NULL
)
{
strcpy
(
p
,
str
);
}
return
p
;
}
static
void
set_option
(
char
**
options
,
const
char
*
name
,
const
char
*
value
)
{
int
i
;
for
(
i
=
0
;
i
<
MAX_OPTIONS
-
3
;
i
++
)
{
if
(
options
[
i
]
==
NULL
)
{
options
[
i
]
=
sdup
(
name
);
options
[
i
+
1
]
=
sdup
(
value
);
options
[
i
+
2
]
=
NULL
;
break
;
}
else
if
(
!
strcmp
(
options
[
i
],
name
))
{
free
(
options
[
i
+
1
]);
options
[
i
+
1
]
=
sdup
(
value
);
break
;
}
}
if
(
i
==
MAX_OPTIONS
-
3
)
{
die
(
"%s"
,
"Too many options specified"
);
}
}
static
void
process_command_line_arguments
(
char
*
argv
[],
char
**
options
)
{
char
line
[
MAX_CONF_FILE_LINE_SIZE
],
opt
[
sizeof
(
line
)],
val
[
sizeof
(
line
)],
*
p
,
cpath
[
PATH_MAX
];
FILE
*
fp
=
NULL
;
size_t
i
,
cmd_line_opts_start
=
1
,
line_no
=
0
;
// Should we use a config file ?
if
(
argv
[
1
]
!=
NULL
&&
argv
[
1
][
0
]
!=
'-'
)
{
snprintf
(
cpath
,
sizeof
(
cpath
),
"%s"
,
argv
[
1
]);
cmd_line_opts_start
=
2
;
}
else
if
((
p
=
strrchr
(
argv
[
0
],
DIRSEP
))
==
NULL
)
{
// No command line flags specified. Look where binary lives
snprintf
(
cpath
,
sizeof
(
cpath
),
"%s"
,
CONFIG_FILE
);
}
else
{
snprintf
(
cpath
,
sizeof
(
cpath
),
"%.*s%c%s"
,
(
int
)
(
p
-
argv
[
0
]),
argv
[
0
],
DIRSEP
,
CONFIG_FILE
);
}
abs_path
(
cpath
,
s_config_file
,
sizeof
(
s_config_file
));
fp
=
fopen
(
s_config_file
,
"r"
);
// If config file was set in command line and open failed, die
if
(
cmd_line_opts_start
==
2
&&
fp
==
NULL
)
{
die
(
"Cannot open config file %s: %s"
,
s_config_file
,
strerror
(
errno
));
}
// Load config file settings first
if
(
fp
!=
NULL
)
{
fprintf
(
stderr
,
"Loading config file %s
\n
"
,
s_config_file
);
// Loop over the lines in config file
while
(
fgets
(
line
,
sizeof
(
line
),
fp
)
!=
NULL
)
{
line_no
++
;
// Ignore empty lines and comments
for
(
i
=
0
;
isspace
(
*
(
unsigned
char
*
)
&
line
[
i
]);
)
i
++
;
if
(
line
[
i
]
==
'#'
||
line
[
i
]
==
'\0'
)
{
continue
;
}
if
(
sscanf
(
line
,
"%s %[^
\r\n
#]"
,
opt
,
val
)
!=
2
)
{
printf
(
"%s: line %d is invalid, ignoring it:
\n
%s"
,
s_config_file
,
(
int
)
line_no
,
line
);
}
else
{
set_option
(
options
,
opt
,
val
);
}
}
fclose
(
fp
);
}
// 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.
for
(
i
=
cmd_line_opts_start
;
argv
[
i
]
!=
NULL
;
i
+=
2
)
{
if
(
argv
[
i
][
0
]
!=
'-'
||
argv
[
i
+
1
]
==
NULL
)
{
show_usage_and_exit
();
}
set_option
(
options
,
&
argv
[
i
][
1
],
argv
[
i
+
1
]);
}
}
}
static
void
init_server_name
(
void
)
{
const
char
*
descr
=
""
;
snprintf
(
server_name
,
sizeof
(
server_name
),
"Mongoose web server v.%s%s"
,
MVER
,
descr
);
}
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
)
{
int
i
;
for
(
i
=
0
;
options
[
i
]
!=
NULL
;
i
++
)
if
(
!
strcmp
(
options
[
i
],
option_name
))
return
options
[
i
+
1
];
return
NULL
;
}
static
void
*
serving_thread_func
(
void
*
param
)
{
struct
mg_server
*
srv
=
(
struct
mg_server
*
)
param
;
while
(
exit_flag
==
0
)
{
mg_poll_server
(
srv
,
1000
);
}
return
NULL
;
}
static
int
path_exists
(
const
char
*
path
,
int
is_dir
)
{
file_stat_t
st
;
return
path
==
NULL
||
(
stat
(
path
,
&
st
)
==
0
&&
((
S_ISDIR
(
st
.
st_mode
)
?
1
:
0
)
==
is_dir
));
}
static
void
verify_existence
(
char
**
options
,
const
char
*
name
,
int
is_dir
)
{
const
char
*
path
=
get_option
(
options
,
name
);
if
(
!
path_exists
(
path
,
is_dir
))
{
notify
(
"Invalid path for %s: [%s]: (%s). Make sure that path is either "
"absolute, or it is relative to mongoose executable."
,
name
,
path
,
strerror
(
errno
));
}
}
static
void
set_absolute_path
(
char
*
options
[],
const
char
*
option_name
)
{
char
path
[
PATH_MAX
],
abs
[
PATH_MAX
],
*
option_value
;
const
char
*
p
;
// 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 mongoose executable lives
// be the relative directory for everything.
// Extract mongoose executable directory into path.
if
((
p
=
strrchr
(
s_config_file
,
DIRSEP
))
==
NULL
)
{
getcwd
(
path
,
sizeof
(
path
));
}
else
{
snprintf
(
path
,
sizeof
(
path
),
"%.*s"
,
(
int
)
(
p
-
s_config_file
),
s_config_file
);
}
strncat
(
path
,
"/"
,
sizeof
(
path
)
-
1
);
strncat
(
path
,
option_value
,
sizeof
(
path
)
-
1
);
// Absolutize the path, and set the option
abs_path
(
path
,
abs
,
sizeof
(
abs
));
set_option
(
options
,
option_name
,
abs
);
}
}
#if !defined(MONGOOSE_NO_AUTH) && !defined(MONGOOSE_NO_FILESYSTEM)
int
modify_passwords_file
(
const
char
*
fname
,
const
char
*
domain
,
const
char
*
user
,
const
char
*
pass
)
{
int
found
;
char
line
[
512
],
u
[
512
],
d
[
512
],
ha1
[
33
],
tmp
[
PATH_MAX
];
FILE
*
fp
,
*
fp2
;
found
=
0
;
fp
=
fp2
=
NULL
;
// Regard empty password as no password - remove user record.
if
(
pass
!=
NULL
&&
pass
[
0
]
==
'\0'
)
{
pass
=
NULL
;
}
(
void
)
snprintf
(
tmp
,
sizeof
(
tmp
),
"%s.tmp"
,
fname
);
// Create the file if does not exist
if
((
fp
=
fopen
(
fname
,
"a+"
))
!=
NULL
)
{
fclose
(
fp
);
}
// Open the given file and temporary file
if
((
fp
=
fopen
(
fname
,
"r"
))
==
NULL
)
{
return
0
;
}
else
if
((
fp2
=
fopen
(
tmp
,
"w+"
))
==
NULL
)
{
fclose
(
fp
);
return
0
;
}
// Copy the stuff to temporary file
while
(
fgets
(
line
,
sizeof
(
line
),
fp
)
!=
NULL
)
{
if
(
sscanf
(
line
,
"%[^:]:%[^:]:%*s"
,
u
,
d
)
!=
2
)
{
continue
;
}
if
(
!
strcmp
(
u
,
user
)
&&
!
strcmp
(
d
,
domain
))
{
found
++
;
if
(
pass
!=
NULL
)
{
mg_md5
(
ha1
,
user
,
":"
,
domain
,
":"
,
pass
,
NULL
);
fprintf
(
fp2
,
"%s:%s:%s
\n
"
,
user
,
domain
,
ha1
);
}
}
else
{
fprintf
(
fp2
,
"%s"
,
line
);
}
}
// If new user, just add it
if
(
!
found
&&
pass
!=
NULL
)
{
mg_md5
(
ha1
,
user
,
":"
,
domain
,
":"
,
pass
,
NULL
);
fprintf
(
fp2
,
"%s:%s:%s
\n
"
,
user
,
domain
,
ha1
);
}
// Close files
fclose
(
fp
);
fclose
(
fp2
);
// Put the temp file in place of real file
remove
(
fname
);
rename
(
tmp
,
fname
);
return
1
;
}
#endif
static
void
start_mongoose
(
int
argc
,
char
*
argv
[])
{
s_argv
=
argv
;
if
((
server
=
mg_create_server
(
NULL
,
EV_HANDLER
))
==
NULL
)
{
die
(
"%s"
,
"Failed to start Mongoose."
);
}
#if !defined(MONGOOSE_NO_AUTH) && !defined(MONGOOSE_NO_FILESYSTEM)
// Edit passwords file if -A option is specified
if
(
argc
>
1
&&
!
strcmp
(
argv
[
1
],
"-A"
))
{
if
(
argc
!=
6
)
{
show_usage_and_exit
();
}
exit
(
modify_passwords_file
(
argv
[
2
],
argv
[
3
],
argv
[
4
],
argv
[
5
])
?
EXIT_SUCCESS
:
EXIT_FAILURE
);
}
#endif
// Show usage if -h or --help options are specified
if
(
argc
==
2
&&
(
!
strcmp
(
argv
[
1
],
"-h"
)
||
!
strcmp
(
argv
[
1
],
"--help"
)))
{
show_usage_and_exit
();
}
set_options
(
argv
);
}
static
void
set_options
(
char
*
argv
[])
{
char
*
options
[
MAX_OPTIONS
];
int
i
;
options
[
0
]
=
NULL
;
set_option
(
options
,
"document_root"
,
s_default_document_root
);
set_option
(
options
,
"listening_port"
,
s_default_listening_port
);
// Update config based on command line arguments
process_command_line_arguments
(
argv
,
options
);
// Make sure we have absolute paths for files and directories
// https://github.com/valenok/mongoose/issues/181
set_absolute_path
(
options
,
"document_root"
);
set_absolute_path
(
options
,
"dav_auth_file"
);
set_absolute_path
(
options
,
"cgi_interpreter"
);
set_absolute_path
(
options
,
"access_log_file"
);
set_absolute_path
(
options
,
"global_auth_file"
);
set_absolute_path
(
options
,
"ssl_certificate"
);
if
(
!
path_exists
(
get_option
(
options
,
"document_root"
),
1
))
{
set_option
(
options
,
"document_root"
,
s_default_document_root
);
set_absolute_path
(
options
,
"document_root"
);
notify
(
"Setting document_root to [%s]"
,
mg_get_option
(
server
,
"document_root"
));
}
// Make extra verification for certain options
verify_existence
(
options
,
"document_root"
,
1
);
verify_existence
(
options
,
"cgi_interpreter"
,
0
);
verify_existence
(
options
,
"ssl_certificate"
,
0
);
for
(
i
=
0
;
options
[
i
]
!=
NULL
;
i
+=
2
)
{
const
char
*
msg
=
mg_set_option
(
server
,
options
[
i
],
options
[
i
+
1
]);
if
(
msg
!=
NULL
)
{
notify
(
"Failed to set option [%s] to [%s]: %s"
,
options
[
i
],
options
[
i
+
1
],
msg
);
if
(
!
strcmp
(
options
[
i
],
"listening_port"
))
{
mg_set_option
(
server
,
"listening_port"
,
s_default_listening_port
);
notify
(
"Setting %s to [%s]"
,
options
[
i
],
s_default_listening_port
);
}
}
free
(
options
[
i
]);
free
(
options
[
i
+
1
]);
}
// Change current working directory to document root. This way,
// scripts can use relative paths.
chdir
(
mg_get_option
(
server
,
"document_root"
));
#if 0
// Add an ability to pass listening socket to mongoose
{
const char *env = getenv("MONGOOSE_LISTENING_SOCKET");
if (env != NULL && atoi(env) > 0 ) {
mg_set_listening_socket(server, atoi(env));
}
}
#endif
// 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
[])
{
init_server_name
();
start_mongoose
(
argc
,
argv
);
printf
(
"%s serving [%s] on port %s
\n
"
,
server_name
,
mg_get_option
(
server
,
"document_root"
),
mg_get_option
(
server
,
"listening_port"
));
fflush
(
stdout
);
// Needed, Windows terminals might not be line-buffered
serving_thread_func
(
server
);
printf
(
"Exiting on signal %d ..."
,
exit_flag
);
fflush
(
stdout
);
mg_destroy_server
(
&
server
);
printf
(
"%s
\n
"
,
" done."
);
return
EXIT_SUCCESS
;
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment