Masanobu Yasui authored on 2008/12/24 18:29:28
Showing 1 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,68 @@
0
+/*
1
+ * mexit.c
2
+ * Copyright (C) 2008 KLab Inc.
3
+ */
4
+#include "makuosan.h"
5
+
6
+static void chexit()
7
+{
8
+  struct utsname uts;
9
+  char cwd[PATH_MAX];
10
+  if(moption.chroot){
11
+    if(uname(&uts) == -1){
12
+      return;
13
+    }
14
+    if(strcmp("Linux", uts.sysname)){
15
+      return;
16
+    }
17
+    /*----- chroot exit(linux only) -----*/
18
+    mtempname("",".MAKUOWORK",cwd);
19
+    mkdir(cwd,0700);
20
+    chroot(cwd);
21
+    rmdir(cwd);
22
+    chdir("..");
23
+    getcwd(cwd,PATH_MAX);
24
+    while(strcmp("/", cwd)){
25
+      chdir("..");
26
+      getcwd(cwd,PATH_MAX);
27
+    }
28
+    chroot(".");
29
+  }
30
+  return;
31
+}
32
+
33
+static void restoreguid()
34
+{
35
+  if(getuid() != geteuid())
36
+    seteuid(getuid());
37
+  if(getgid() != getegid())
38
+    setegid(getgid());
39
+}
40
+
41
+static void sock_clean()
42
+{
43
+  socklen_t namelen;
44
+  struct sockaddr_un addr;
45
+  /*----- unlink unix domain socket -----*/
46
+  namelen = sizeof(addr);
47
+  if(!getsockname(moption.lisocket, (struct sockaddr *)&addr, &namelen)){
48
+    if(addr.sun_family == AF_UNIX){
49
+      unlink(addr.sun_path);
50
+    }
51
+  }
52
+  /*----- close -----*/
53
+  close(moption.mcsocket);
54
+  close(moption.lisocket);
55
+}
56
+
57
+void mexit()
58
+{
59
+  lprintf(0, "%s: shutdown start\n", __func__);
60
+  msend_clean(); /* recv object free       */
61
+  mrecv_clean(); /* recv object free       */
62
+  restoreguid(); /* restore euid,egid      */
63
+  chexit();      /* exit chroot(LinuxOnly) */
64
+  sock_clean();  /* atoshimatsu            */
65
+  lprintf(0, "%s: shutdown complete\n", __func__);
66
+}
67
+