+/* -------------------------------------------------------------------------- */
+
#include <kernelplat.h>
#include <container.h>
#include <version.h>
/* -------------------------------------------------------------------------- */
+static void cilux_terminate(void);
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);
+ c_init(cilux_version, cilux_ciux, cilux_terminate);
+
+ re_exec_as_other();
+ c_run(0);
- return 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);
- }
- }
+ 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);
+ }
+ }
+}
+
+void cilux_terminate(void)
+{
+ c_running(0);
+ exit(0);
}
/* -------------------------------------------------------------------------- */