#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); /* 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); syslog(LOG_DAEMON, "path:%s", path); /* *** from here, cgi didn't run *** * check if path available */ check_path(path, sizeof(path), virtualhost, strlen(hostname)); /* split dir and filename */ split_dir_file(path, dir, sizeof(dir), file, sizeof(file)); syslog(LOG_DAEMON, "dir:%s", dir); syslog(LOG_DAEMON, "file:%s", file); /* go to dir */ echdir(dir); /* regular file to stdout */ display_file(file); stop(EXIT_SUCCESS, NULL); }