7 extern const char **environ;
10 #define ZONE "kratochvil.vellum.cz"
12 #define SETUID 0 /* user UID */
13 #define SETGID 0 /* group GID */
14 #define PERMITTED_ENV_LIST "PWD"
15 #define EXEC_PATHNAME "/usr/sbin/ndc"
16 #define EXEC_ARGV "/usr/sbin/ndc","reload",ZONE,NULL
19 #ifndef G_GNUC_NORETURN
20 #if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4)
21 #define G_GNUC_NORETURN __attribute__((noreturn))
23 #define G_GNUC_NORETURN
24 #endif /* !__GNUC__ */
25 #endif /* !G_GNUC_NORETURN */
27 #define EXITLOG(msg...) do {\
28 openlog("pserverchroot",LOG_PID,LOG_DAEMON); \
29 syslog(LOG_CRIT,msg); \
34 #define LENGTH(x) (sizeof((x))/sizeof(*(x)))
36 #define FUNCCHK(funcname,args...) do { \
37 if (errno=0,funcname(args)) \
38 funcfail( #funcname ); \
41 static void funcfail(const char *funcname) G_GNUC_NORETURN;
42 static void funcfail(const char *funcname)
44 EXITLOG("Unable to %s(2): %s",funcname,strerror(errno));
47 int main(int argc,char **argv)
50 const char *allowed[]={ PERMITTED_ENV_LIST };
51 const char **allp,**envp;
55 for (envp=environ;*envp;envp++) {
58 if ((s=strchr(dup,'='))) *s='\0';
59 for (allp=allowed;allp<allowed+LENGTH(allowed);allp++)
60 if (!strcmp(dup,*allp)) goto ok;
62 EXITLOG("Unable to clean environment for 'ndc': %s",*envp);
67 FUNCCHK(setenv,"PATH","/usr/bin",1);
69 FUNCCHK(setgid,SETGID);
70 FUNCCHK(setuid,SETUID);
71 errno=0,execl(EXEC_PATHNAME,EXEC_ARGV);