--- /dev/null
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <pwd.h>
+#include <grp.h>
+
+#include <platform.h>
+#include <container.h>
+#include "version.h"
+
+/* -------------------------------------------------------------------------- */
+
+static void re_exec_as_other();
+
+/* -------------------------------------------------------------------------- */
+
+int main(int argc, char* argv[])
+{
+ c_init(0, cilux_version, cilux_ciux, 0);
+ re_exec_as_other();
+ c_run(0);
+
+ return 0;
+}
+
+void re_exec_as_other()
+{
+ char* other="other";
+ uid_t uid=0;
+ gid_t gid=0;
+ if(getuid()==0){
+ struct passwd* pw=getpwnam(other);
+ if(!pw){ printf("fail: getpwnam(\"%s\");\n", other); exit(1); }
+ uid=pw->pw_uid;
+ gid=pw->pw_gid;
+ }
+
+ pid_t pid=fork();
+ switch(pid){
+ case 0:
+ break;
+ case -1:
+ printf("Failed to fork\n");
+ exit(1);
+ default:
+ printf("pid %d\n", pid);
+ exit(0);
+ }
+ setsid();
+
+ if(getuid()==0){
+ if(setgroups(0,0)== -1){
+ printf("fail: setgroups(0,0)\n");
+ exit(1);
+ }
+ if(setgid(gid)== -1){
+ printf("fail: setgid(%d)\n", gid);
+ exit(1);
+ }
+ if(initgroups(other, gid)== -1){
+ printf("fail: initgroups(\"%s\",%d)\n", other, gid);
+ exit(1);
+ }
+ if(setuid(uid)== -1){
+ printf("fail: setuid(%d)\n", uid);
+ exit(1);
+ }
+ }
+}
+
+/* -------------------------------------------------------------------------- */
+
+