first import of old cilux linux platform code
[cilux] / src / platform / linux / cilux.c
diff --git a/src/platform/linux/cilux.c b/src/platform/linux/cilux.c
new file mode 100644 (file)
index 0000000..009d621
--- /dev/null
@@ -0,0 +1,73 @@
+
+#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);
+               }
+       }
+}
+
+/* -------------------------------------------------------------------------- */
+
+