Add mysql database stuff
[public/pyceo-broken.git] / src / util.c
index 6b0a5b4..e693b19 100644 (file)
@@ -8,15 +8,21 @@
 #include <syslog.h>
 #include <errno.h>
 #include <grp.h>
+#include <pwd.h>
 
 #include "util.h"
 #include "strbuf.h"
 
 static int log_stderr = 1;
+static int log_maxprio = LOG_DEBUG;
 
-void init_log(const char *ident, int option, int facility) {
+void init_log(const char *ident, int option, int facility, int lstderr) {
     openlog(ident, option, facility);
-    log_stderr = isatty(STDERR_FILENO);
+    log_stderr = lstderr || isatty(STDERR_FILENO);
+}
+
+void log_set_maxprio(int prio) {
+    log_maxprio = prio;
 }
 
 static void errmsg(int prio, const char *prefix, const char *fmt, va_list args) {
@@ -27,7 +33,7 @@ static void errmsg(int prio, const char *prefix, const char *fmt, va_list args)
     strbuf_addch(&msg, '\n');
 
     syslog(prio, "%s", msg.buf);
-    if (log_stderr)
+    if (log_stderr && prio <= log_maxprio)
         fputs(msg.buf, stderr);
 
     strbuf_release(&msg);
@@ -41,7 +47,7 @@ static void errmsgpe(int prio, const char *prefix, const char *fmt, va_list args
     strbuf_addf(&msg, ": %s\n", strerror(errno));
 
     syslog(prio, "%s", msg.buf);
-    if (log_stderr)
+    if (log_stderr && prio <= log_maxprio)
         fputs(msg.buf, stderr);
 
     strbuf_release(&msg);
@@ -98,7 +104,7 @@ void logmsg(int priority, const char *msg, ...) {
     vsyslog(priority, msg, args);
     va_end(args);
     va_start(args, msg);
-    if (log_stderr) {
+    if (log_stderr && priority <= log_maxprio) {
         vfprintf(stderr, msg, args);
         fputc('\n', stderr);
     }
@@ -168,6 +174,10 @@ void full_write(int fd, const void *buf, size_t count) {
 }
 
 int spawnvem(const char *path, char *const *argv, char *const *envp, const struct strbuf *output, struct strbuf *input, int cap_stderr) {
+    return spawnvemu(path, argv, envp, output, input, cap_stderr, NULL);
+}
+
+int spawnvemu(const char *path, char *const *argv, char *const *envp, const struct strbuf *output, struct strbuf *input, int cap_stderr, char *user) {
     int pid, wpid, status;
     int tochild[2];
     int fmchild[2];
@@ -192,6 +202,18 @@ int spawnvem(const char *path, char *const *argv, char *const *envp, const struc
         close(tochild[1]);
         close(fmchild[0]);
         close(fmchild[1]);
+
+        if (user) {
+            struct passwd *pw = getpwnam(user);
+            if (!pw)
+                fatalpe("getpwnam: %s", user);
+            if (initgroups(user, pw->pw_gid))
+                fatalpe("initgroups: %s", user);
+            if (setregid(pw->pw_gid, pw->pw_gid))
+                fatalpe("setregid: %s", user);
+            if (setreuid(pw->pw_uid, pw->pw_uid))
+                fatalpe("setreuid");
+        }
         execve(path, argv, envp);
         fatalpe("execve");
     } else {