mocksetup: /unsafe+/hdd -> /quad
[nethome.git] / src / pserverchroot.c
1 #include <stdlib.h>
2 #include <syslog.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <errno.h>
6
7
8 #define SETUID 515 /* "pserver" user  UID */
9 #define SETGID 515 /* "pserver" group GID */
10 #define CHROOT_DIR "/home/pserver"
11 #define EXEC_PATHNAME "/usr/bin/cvs"
12
13
14 #ifndef G_GNUC_NORETURN
15 #if     __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
16 #define G_GNUC_NORETURN __attribute__((noreturn))
17 #else   /* !__GNUC__ */
18 #define G_GNUC_NORETURN
19 #endif  /* !__GNUC__ */
20 #endif  /* !G_GNUC_NORETURN */
21
22 #define EXITLOG(msg...) do {\
23         openlog("pserverchroot",LOG_PID,LOG_DAEMON); \
24         syslog(LOG_CRIT,msg); \
25         closelog(); \
26         exit(EXIT_FAILURE); \
27         } while (0)
28
29 #define LENGTH(x) (sizeof((x))/sizeof(*(x)))
30
31 #define FUNCCHK(funcname,args...) do { \
32         if (errno=0,funcname(args)) \
33                 funcfail( #funcname ); \
34         } while (0)
35
36 static void funcfail(const char *funcname) G_GNUC_NORETURN;
37 static void funcfail(const char *funcname)
38 {
39         EXITLOG("Unable to %s(2): %s",funcname,strerror(errno));
40 }
41
42 int main(int argc,char **argv)
43 {
44         FUNCCHK(clearenv);
45         FUNCCHK(setenv,"PATH","/usr/bin",1);
46         FUNCCHK(chroot,CHROOT_DIR);
47         FUNCCHK(chdir,"/");
48         FUNCCHK(setgid,SETGID);
49         FUNCCHK(setuid,SETUID);
50         if (!getuid() || !geteuid() || !getgid() || !getegid())
51                 EXITLOG("Privileges NOT dropped!: uid=%d,euid=%d,gid=%d,egid=%d",
52                                 getuid(),geteuid(),getgid(),getegid());
53         errno=0,execv(EXEC_PATHNAME,argv);
54         funcfail("execv");
55 }