88 lines
2.2 KiB
C
88 lines
2.2 KiB
C
#include "vger.c"
|
|
|
|
int
|
|
main(int argc, char **argv)
|
|
{
|
|
char request[GEMINI_REQUEST_MAX] = {'\0'};
|
|
char user[_SC_LOGIN_NAME_MAX] = {'\0'};
|
|
char hostname[GEMINI_REQUEST_MAX] = {'\0'};
|
|
char path[GEMINI_REQUEST_MAX] = {'\0'};
|
|
char query[GEMINI_REQUEST_MAX] = {'\0'};
|
|
char chroot_dir[PATH_MAX] = DEFAULT_CHROOT;
|
|
char file[FILENAME_MAX] = DEFAULT_INDEX;
|
|
char dir[PATH_MAX] = {'\0'};
|
|
int option = 0;
|
|
int virtualhost = 0;
|
|
|
|
/*
|
|
* request : contain the whole request from client : gemini://...\r\n
|
|
* user : username, used in drop_privileges()
|
|
* hostname : extracted from hostname. used with virtualhosts and cgi SERVER_NAME
|
|
* query : file requested in cgi : gemini://...?query
|
|
* file : file basename to display. Emtpy is a directory has been requested
|
|
* dir : directory requested. vger will chdir() in to find file
|
|
*/
|
|
|
|
while ((option = getopt(argc, argv, ":d:l:m:u:c:vi")) != -1) {
|
|
switch (option) {
|
|
case 'd':
|
|
estrlcpy(chroot_dir, optarg, sizeof(chroot_dir));
|
|
break;
|
|
case 'l':
|
|
estrlcpy(lang, "lang=", sizeof(lang));
|
|
estrlcat(lang, optarg, sizeof(lang));
|
|
break;
|
|
case 'm':
|
|
estrlcpy(default_mime, optarg, sizeof(default_mime));
|
|
break;
|
|
case 'u':
|
|
estrlcpy(user, optarg, sizeof(user));
|
|
break;
|
|
case 'c':
|
|
estrlcpy(cgi_dir, optarg, sizeof(cgi_dir));
|
|
break;
|
|
case 'v':
|
|
virtualhost = 1;
|
|
break;
|
|
case 'i':
|
|
doautoidx = 1;
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* do chroot if an user is supplied
|
|
*/
|
|
drop_privileges(user, chroot_dir, cgi_dir);
|
|
|
|
read_request(request);
|
|
split_request(request, hostname, path, query);
|
|
set_path(path, sizeof(path), virtualhost, hostname);
|
|
//get_query(path, query, sizeof(query));
|
|
|
|
/* percent decode */
|
|
uridecode(query);
|
|
uridecode(path);
|
|
|
|
/* is it cgi ? */
|
|
if (*cgi_dir)
|
|
if (do_cgi(chroot_dir, cgi_dir, path, hostname, query) == 0)
|
|
stop(EXIT_SUCCESS, NULL);
|
|
|
|
/* *** from here, cgi didn't run ***
|
|
* check if path available
|
|
*/
|
|
check_path(path, sizeof(path), hostname, virtualhost);
|
|
|
|
/* split dir and filename */
|
|
split_dir_file(path, dir, sizeof(dir), file, sizeof(file));
|
|
|
|
/* go to dir */
|
|
echdir(dir);
|
|
|
|
/* regular file to stdout */
|
|
display_file(file);
|
|
|
|
stop(EXIT_SUCCESS, NULL);
|
|
}
|