system: supports sync and unmount function for rebooting 15/52315/2
authorJinhyung Choi <jinh0.choi@samsung.com>
Sat, 21 Nov 2015 03:26:39 +0000 (12:26 +0900)
committerJinhyung Choi <jinh0.choi@samsung.com>
Mon, 23 Nov 2015 12:49:28 +0000 (21:49 +0900)
Change-Id: I039233b7e54bdf6af3d21b25ae8394481643f6c6
Signed-off-by: Jinhyung Choi <jinh0.choi@samsung.com>
include/emuld.h
src/common.cpp
src/emuld.cpp

index 78d287a76d9e13324bfc37b094eafa54194f35f4..33c1bb0983b5bdcf23072fe8f020f2fceabc1f29 100644 (file)
@@ -226,6 +226,7 @@ void dbus_send(const char* device, const char* target, const char* option);
 #define MSG_GROUP_HDS       100
 bool valid_hds_path(char* path);
 int try_mount(char* tag, char* path);
+void hds_unmount_all(void);
 
 #define IJTYPE_SUSPEND      "suspend"
 #define IJTYPE_HDS          "hds"
index c17247536029581d7458a4b2b47bd83b18783457..e38e3945a750b8f405ced027d2a74a270bcd30b8 100644 (file)
@@ -129,6 +129,11 @@ int parse_val(char *buff, unsigned char data, char *parsbuf)
     return 0;
 }
 
+enum emuld_system_action {
+    EMULD_SYSTEM_ACTION_FORCE_CLOSE,
+    EMULD_SYSTEM_ACTION_REBOOT
+};
+
 void powerdown_by_force(void)
 {
     struct timeval now;
@@ -154,17 +159,28 @@ void powerdown_by_force(void)
 
 void msgproc_system(ijcommand* ijcmd)
 {
-    LOGDEBUG("msgproc_system");
+    int action = ijcmd->msg.action;
+    LOGDEBUG("msgproc_system with %d action", action);
 
-    LOGINFO("/etc/rc.d/rc.shutdown, sync, reboot(RB_POWER_OFF)");
+    if (action == EMULD_SYSTEM_ACTION_FORCE_CLOSE) {
+        LOGINFO("/etc/rc.d/rc.shutdown, sync, reboot(RB_POWER_OFF)");
 
-    sync();
+        sync();
+
+        systemcall("/etc/rc.d/rc.shutdown &");
+
+        gettimeofday(&tv_start_poweroff, NULL);
 
-    systemcall("/etc/rc.d/rc.shutdown &");
+        powerdown_by_force();
+    } else if (action == EMULD_SYSTEM_ACTION_REBOOT) {
+        LOGINFO("sync, unmount all hds");
 
-    gettimeofday(&tv_start_poweroff, NULL);
+        sync();
 
-    powerdown_by_force();
+        hds_unmount_all();
+    } else {
+        LOGERR("unknown system action %d", action);
+    }
 }
 
 static int lock_state = SUSPEND_UNLOCK;
@@ -910,6 +926,13 @@ int try_mount(char* tag, char* path)
     return ret;
 }
 
+void hds_unmount_all(void)
+{
+    char tmp[MAX_DATA_BUF];
+    snprintf(tmp, sizeof(tmp), "%s", "umount -a -t 9p");
+    systemcall(tmp);
+}
+
 static bool get_tag_path(char* data, char** tag, char** path)
 {
     char token[] = "\n";
index 29ed78ee3ce9343e579806968727871376ae24d1..e095cfeac68b68d4b4bc585ab8b7057ff2353119 100644 (file)
@@ -375,6 +375,9 @@ static void boot_done(void *data, DBusMessage *msg)
 static void sig_handler(int signo)
 {
     LOGINFO("received signal: %d. EXIT!", signo);
+
+    hds_unmount_all();
+
     _exit(0);
 }
 
@@ -432,6 +435,8 @@ void* handling_network(void* data)
 
     stop_listen();
 
+    hds_unmount_all();
+
     exit(0);
 }