Compare commits
3 commits
Author | SHA1 | Date | |
---|---|---|---|
Mike Barnes | 5a9b2518be | ||
Mike Barnes | 47e075383f | ||
01f2503376 |
28
main.c
28
main.c
|
@ -20,7 +20,7 @@
|
||||||
#include "opts.h"
|
#include "opts.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
/* lenght of "gemini://" */
|
/* length of "gemini://" */
|
||||||
#define GEMINI_PART 9
|
#define GEMINI_PART 9
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -121,12 +121,21 @@ drop_privileges(const char *user, const char *path)
|
||||||
chrooted = 1;
|
chrooted = 1;
|
||||||
echdir("/");
|
echdir("/");
|
||||||
/* drop privileges */
|
/* drop privileges */
|
||||||
|
#if defined (__OpenBSD__) || defined(__FreeBSD__)
|
||||||
if (setgroups(1, &pw->pw_gid) ||
|
if (setgroups(1, &pw->pw_gid) ||
|
||||||
setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
|
setresgid(pw->pw_gid, pw->pw_gid, pw->pw_gid) ||
|
||||||
setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid)) {
|
setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid)) {
|
||||||
errlog("dropping privileges to user %s (uid=%i) failed",
|
errlog("dropping privileges to user %s (uid=%i) failed",
|
||||||
user, pw->pw_uid);
|
user, pw->pw_uid);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (setgroups(1, &pw->pw_gid) ||
|
||||||
|
setgid(pw->pw_gid) ||
|
||||||
|
setuid(pw->pw_uid)) {
|
||||||
|
errlog("dropping privileges to user %s (uid=%i) failed",
|
||||||
|
user, pw->pw_uid);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#ifdef __OpenBSD__
|
#ifdef __OpenBSD__
|
||||||
/*
|
/*
|
||||||
|
@ -236,14 +245,14 @@ display_file(const char *fname)
|
||||||
while ((nread = fread(buffer, 1, sizeof(buffer), fd)) != 0)
|
while ((nread = fread(buffer, 1, sizeof(buffer), fd)) != 0)
|
||||||
fwrite(buffer, 1, nread, stdout);
|
fwrite(buffer, 1, nread, stdout);
|
||||||
goto closefd; /* close file descriptor */
|
goto closefd; /* close file descriptor */
|
||||||
syslog(LOG_DAEMON, "path served %s", fname);
|
syslog(LOG_INFO, "path served %s", fname);
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
/* return an error code and no content */
|
/* return an error code and no content */
|
||||||
status_error(51, "file not found");
|
status_error(51, "file not found");
|
||||||
syslog(LOG_DAEMON, "path invalid %s", fname);
|
syslog(LOG_INFO, "path invalid %s", fname);
|
||||||
goto closefd;
|
goto closefd;
|
||||||
|
|
||||||
redirect:
|
redirect:
|
||||||
|
@ -252,7 +261,7 @@ redirect:
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
status_redirect(30, target);
|
status_redirect(30, target);
|
||||||
syslog(LOG_DAEMON, "redirection from %s to %s", fname, target);
|
syslog(LOG_INFO, "redirection from %s to %s", fname, target);
|
||||||
|
|
||||||
closefd:
|
closefd:
|
||||||
if (S_ISREG(sb.st_mode) != 0)
|
if (S_ISREG(sb.st_mode) != 0)
|
||||||
|
@ -267,7 +276,7 @@ autoindex(const char *path)
|
||||||
int n = 0;
|
int n = 0;
|
||||||
struct dirent **namelist; /* this must be freed at last */
|
struct dirent **namelist; /* this must be freed at last */
|
||||||
|
|
||||||
syslog(LOG_DAEMON, "autoindex: %s", path);
|
syslog(LOG_INFO, "autoindex: %s", path);
|
||||||
|
|
||||||
/* use alphasort to always have the same order on every system */
|
/* use alphasort to always have the same order on every system */
|
||||||
if ((n = scandir(path, &namelist, NULL, alphasort)) < 0) {
|
if ((n = scandir(path, &namelist, NULL, alphasort)) < 0) {
|
||||||
|
@ -356,6 +365,10 @@ main(int argc, char **argv)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* set logging options and defaults
|
||||||
|
*/
|
||||||
|
openlog("vger", LOG_PID, LOG_DAEMON);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* do chroot if an user is supplied
|
* do chroot if an user is supplied
|
||||||
|
@ -398,7 +411,7 @@ main(int argc, char **argv)
|
||||||
errlog("request «%s» doesn't match gemini://",
|
errlog("request «%s» doesn't match gemini://",
|
||||||
request);
|
request);
|
||||||
}
|
}
|
||||||
syslog(LOG_DAEMON, "request %s", request);
|
syslog(LOG_INFO, "request %s", request);
|
||||||
|
|
||||||
/* remove the gemini:// part */
|
/* remove the gemini:// part */
|
||||||
memmove(request, request + GEMINI_PART, strlen(request) + 1 - GEMINI_PART);
|
memmove(request, request + GEMINI_PART, strlen(request) + 1 - GEMINI_PART);
|
||||||
|
@ -506,5 +519,8 @@ file_to_stdout:
|
||||||
/* regular file to stdout */
|
/* regular file to stdout */
|
||||||
display_file(file);
|
display_file(file);
|
||||||
|
|
||||||
|
/* end logging */
|
||||||
|
closelog();
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
8
utils.c
8
utils.c
|
@ -8,7 +8,7 @@
|
||||||
|
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined( _NetBSD__) || defined(__DragonFly__)
|
#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined( __NetBSD__) || defined(__DragonFly__)
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#else
|
#else
|
||||||
#include <bsd/string.h>
|
#include <bsd/string.h>
|
||||||
|
@ -25,7 +25,7 @@ void
|
||||||
eunveil(const char *path, const char *permissions)
|
eunveil(const char *path, const char *permissions)
|
||||||
{
|
{
|
||||||
if (unveil(path, permissions) == -1) {
|
if (unveil(path, permissions) == -1) {
|
||||||
syslog(LOG_DAEMON, "unveil on %s failed", path);
|
syslog(LOG_ERR, "unveil on %s failed", path);
|
||||||
err(1, "unveil on %s failed", path);
|
err(1, "unveil on %s failed", path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ void
|
||||||
epledge(const char *promises, const char *execpromises)
|
epledge(const char *promises, const char *execpromises)
|
||||||
{
|
{
|
||||||
if (pledge(promises, execpromises) == -1) {
|
if (pledge(promises, execpromises) == -1) {
|
||||||
syslog(LOG_DAEMON, "pledge failed for: %s", promises);
|
syslog(LOG_ERR, "pledge failed for: %s", promises);
|
||||||
err(1, "pledge failed for: %s", promises);
|
err(1, "pledge failed for: %s", promises);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -89,6 +89,6 @@ errlog(const char *format, ...)
|
||||||
vsnprintf(e, sizeof(e), format, ap);
|
vsnprintf(e, sizeof(e), format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
|
||||||
syslog(LOG_DAEMON, "%s", e);
|
syslog(LOG_ERR, "%s", e);
|
||||||
err(1, "%s", e);
|
err(1, "%s", e);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue