8 #define SETUID 503 /* "pserver" user UID */
9 #define SETGID 503 /* "pserver" group GID */
10 #define CHROOT_DIR "/home/lace/pserver"
11 #define EXEC_PATHNAME "/usr/bin/cvs"
14 #ifndef G_GNUC_NORETURN
15 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
16 #define G_GNUC_NORETURN __attribute__((noreturn))
18 #define G_GNUC_NORETURN
19 #endif /* !__GNUC__ */
20 #endif /* !G_GNUC_NORETURN */
22 #define EXITLOG(msg...) do {\
23 openlog("pserverchroot",LOG_PID,LOG_DAEMON); \
24 syslog(LOG_CRIT,msg); \
29 #define LENGTH(x) (sizeof((x))/sizeof(*(x)))
31 #define FUNCCHK(funcname,args...) do { \
32 if (errno=0,funcname(args)) \
33 funcfail( #funcname ); \
36 static void funcfail(const char *funcname) G_GNUC_NORETURN;
37 static void funcfail(const char *funcname)
39 EXITLOG("Unable to %s(2): %s",funcname,strerror(errno));
42 int main(int argc,char **argv)
45 FUNCCHK(setenv,"PATH","/usr/bin",1);
46 FUNCCHK(chroot,CHROOT_DIR);
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);