sdcard: Arrange source codes
authorMunkyu Im <munkyu.im@samsung.com>
Wed, 22 Oct 2014 09:27:38 +0000 (18:27 +0900)
committerMunkyu Im <munkyu.im@samsung.com>
Thu, 23 Oct 2014 07:16:37 +0000 (16:16 +0900)
 - handle filelock fd/handle
 - add removed codes by merging tizen branch

Change-Id: Ic3f0c41cdb490eee81c28acd8fd65a56b416117a
Signed-off-by: Munkyu Im <munkyu.im@samsung.com>
tizen/src/ecs/ecs_msg_injector.c
tizen/src/util/osutil-win32.c
tizen/src/util/osutil.c
tizen/src/util/osutil.h

index c0296abae801af634c48a1b316695cdfbb902ce0..6a030b3261fe1b991050aec474696a45b89ca1a3 100644 (file)
@@ -38,6 +38,7 @@
 #include "emul_state.h"
 #include "ecs.h"
 #include "debug_ch.h"
+#include "util/osutil.h"
 
 MULTI_DEBUG_CHANNEL(qemu, ecs);
 
@@ -46,6 +47,44 @@ static int guest_connection = 0;
 
 extern QemuMutex mutex_location_data;
 static char location_data[MAX_INJECTOR_REQ_DATA];
+static void send_gen_injector_ntf(const char* cmd, int cmdlen, int grp, int act, char* on)
+{
+    int msglen = 0, datalen = 0;
+    type_length length  = 0;
+    type_group group = grp;
+    type_action action = act;
+
+    if (cmd == NULL || cmdlen > 10)
+        return;
+
+    if (on == NULL) {
+        msglen = 14;
+    } else {
+        datalen = strlen(on);
+        length  = (unsigned short)datalen;
+
+        msglen = datalen + 15;
+    }
+
+    char* status_msg = (char*) malloc(msglen);
+    if(!status_msg)
+        return;
+
+    memset(status_msg, 0, msglen);
+
+    memcpy(status_msg, cmd, cmdlen);
+    memcpy(status_msg + 10, &length, sizeof(unsigned short));
+    memcpy(status_msg + 12, &group, sizeof(unsigned char));
+    memcpy(status_msg + 13, &action, sizeof(unsigned char));
+
+    if (on != NULL) {
+        memcpy(status_msg + 14, on, datalen);
+    }
+
+    send_injector_ntf(status_msg, msglen);
+
+    free(status_msg);
+}
 
 static void msgproc_injector_ans(ECS_Client* ccli, const char* category, bool succeed)
 {
@@ -291,67 +330,86 @@ char *get_tizen_sdk_data_path(void)
     return get_old_tizen_sdk_data_path();
 }
 
-static void handle_sdcard(char* dataBuf, size_t dataLen)
-{
+static char* get_sdcard_img_path(char* sdcard_img_name, size_t dataLen) {
+    char* sdcard_img_path = NULL;
+    char* sdcard_path = NULL;
+    if (sdcard_img_name == NULL || dataLen < 3) {
+        return NULL;
+    }
+    dataLen = dataLen - 3;
+    if (sdcard_img_name[dataLen] == '\n') {
+        sdcard_img_name[dataLen] = '\0';
+        TRACE("sdcard_img_name: %s\n", sdcard_img_name);
+    } else {
+        ERR("wrong sdcard message!\n");
+        return NULL;
+    }
 
-    char ret = 0;
+    sdcard_path = get_emulator_sdcard_path();
+    if (sdcard_path != NULL) {
+        sdcard_img_path = g_malloc(DEFAULTBUFLEN);
+        g_strlcpy(sdcard_img_path, sdcard_path, DEFAULTBUFLEN);
+        g_strlcat(sdcard_img_path, sdcard_img_name, DEFAULTBUFLEN);
+        TRACE("sdcard img path: [%s] length: %d\n", sdcard_img_path, strlen(sdcard_img_path));
+        g_free(sdcard_path);
+        return sdcard_img_path;
+    }
+    return NULL;
+}
 
+static int handle_sdcard(char* dataBuf, size_t dataLen)
+{
+    int err_no = 0;
+    char ret = 0;
     if (dataBuf != NULL){
         ret = dataBuf[0];
 
         if (ret == '0' ) {
             /* umount sdcard */
-            do_hotplug(DETACH_SDCARD, NULL, 0);
+            INFO("datalen: %d\n", dataLen);
+            char* sdcard_img_path = get_sdcard_img_path(dataBuf + 2, dataLen);
+            err_no = remove_sdcard_lock_os(sdcard_img_path);
+            if (errno == 0 && is_sdcard_attached()) {
+                do_hotplug(DETACH_SDCARD, NULL, 0);
+            } else {
+                ERR("failed to umount: %s\n", sdcard_img_path);
+                send_gen_injector_ntf(MSG_TYPE_SDCARD, 6, 11, err_no, NULL);
+                return err_no;
+            }
+            g_free(sdcard_img_path);
         } else if (ret == '1') {
             /* mount sdcard */
-            char sdcard_img_path[256];
-            char* sdcard_path = NULL;
-
-            sdcard_path = get_emulator_sdcard_path();
-            if (sdcard_path) {
-                g_strlcpy(sdcard_img_path, sdcard_path,
-                        sizeof(sdcard_img_path));
-
-                /* emulator_sdcard_img_path + sdcard img name */
-                char* sdcard_img_name = dataBuf+2;
-                if(dataLen > 3 && sdcard_img_name != NULL){
-                    char* pLinechange = strchr(sdcard_img_name, '\n');
-                    if(pLinechange != NULL){
-                        sdcard_img_name = g_strndup(sdcard_img_name, pLinechange - sdcard_img_name);
-                    }
-
-                    g_strlcat(sdcard_img_path, sdcard_img_name, sizeof(sdcard_img_path));
-                    TRACE("sdcard path: [%s]\n", sdcard_img_path);
-
-                    do_hotplug(ATTACH_SDCARD, sdcard_img_path, strlen(sdcard_img_path) + 1);
-
-                    /*if using strndup than free string*/
-                    if(pLinechange != NULL && sdcard_img_name!= NULL){
-                        free(sdcard_img_name);
-                    }
-
-                }
-
-                g_free(sdcard_path);
+            INFO("datalen: %d\n", dataLen);
+            char* sdcard_img_path = get_sdcard_img_path(dataBuf + 2, dataLen);
+            if ( !is_sdcard_attached() && make_sdcard_lock_os(sdcard_img_path)) {
+                do_hotplug(ATTACH_SDCARD, sdcard_img_path, strlen(sdcard_img_path) + 1);
+                send_gen_injector_ntf(MSG_TYPE_SDCARD, 6, 11, 0, NULL);
             } else {
-                ERR("failed to get sdcard path!!\n");
+                send_gen_injector_ntf(MSG_TYPE_SDCARD, 6, 11, 5, NULL);
+                return ERR_LCK;
             }
-        } else if(ret == '2'){
-            TRACE("sdcard status 2 bypass" );
-        }else {
+            g_free(sdcard_img_path);
+
+        } else if (ret == '2') {
+            TRACE("sdcard status 2 bypass\n" );
+        } else {
             ERR("!!! unknown command : %c\n", ret);
+            return ret;
         }
-
-    }else{
+    } else {
         ERR("!!! unknown data : %c\n", ret);
+        return ret;
     }
+    return ERR_SUCCESS;
 }
 
 static bool injector_req_sdcard(ECS_Client* ccli, ECS__InjectorReq* msg, char *cmd)
 {
     if (msg->has_data) {
         TRACE("msg(%zu) : %s\n", msg->data.len, msg->data.data);
-        handle_sdcard((char*) msg->data.data, msg->data.len);
+        if (handle_sdcard((char*) msg->data.data, msg->data.len) > 0) {
+            return false;
+        }
     } else {
         ERR("has no msg\n");
     }
@@ -397,8 +455,7 @@ static void send_status_injector_ntf(const char* cmd, int cmdlen, int act, char*
 
     send_injector_ntf(status_msg, msglen);
 
-    if (status_msg)
-        free(status_msg);
+    free(status_msg);
 }
 
 static bool injector_req_sensor(ECS_Client* ccli, ECS__InjectorReq* msg, char *cmd)
index affa738483416e699746c2505e75a41ff6fc8ad1..f4f1da1c547570aaaf54a332f116870f749ac504 100644 (file)
@@ -56,7 +56,7 @@ static char *g_pBuf;
 
 extern char tizen_target_img_path[];
 static char g_sdcard[256] = {0,};
-
+static sdcard_info info;
 static const char *pactempfile = ".autoproxy";
 
 void check_vm_lock_os(void)
@@ -412,6 +412,7 @@ bool make_sdcard_lock_os(char *sdcard)
     }
     INFO("Get file lock: %s\n", lock_file);
     strncpy(g_sdcard, sdcard, strlen(sdcard));
+    info.handle = hFile;
     return true;
 
 }
@@ -468,6 +469,8 @@ int remove_sdcard_lock_os(char *sdcard)
         return ERR_UNLCK;
     }
     INFO("unlock success: %s\n", lock_file);
+    CloseHandle(info.handle);
+
     return ERR_SUCCESS;
 
 }
index 9cac09709e42fb5259db1e54af4f0fe75ed32323..ab5c023c2bf9b4b0be7b28417f0675525c36ba3d 100644 (file)
@@ -42,7 +42,7 @@
 
 MULTI_DEBUG_CHANNEL(emulator, osutil);
 
-
+static sdcard_info info;
 const char *pac_tempfile = ".autoproxy";
 size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream)
 {
@@ -137,10 +137,9 @@ inline bool make_sdcard_lock_posix(char *sdcard)
         close(fd);
         return false;
     }
-
+    info.fd = fd;
     INFO("Get file lock: %s\n", lock_file);
     return true;
-
 }
 
 inline int remove_sdcard_lock_posix(char *sdcard)
@@ -172,6 +171,7 @@ inline int remove_sdcard_lock_posix(char *sdcard)
 
     INFO("unlock success: %s\n", lock_file);
     close(fd);
+    close(info.fd);
     return ERR_SUCCESS;
 }
 #endif
index 2c81001dc12080895dfabc0ef06d6dada30026a3..33de9c9e01b86808fadea94f0a84f94f841b2272 100644 (file)
@@ -71,6 +71,17 @@ bool make_sdcard_lock_os(char *sdcard);
 int remove_sdcard_lock_os(char *sdcard);
 
 void set_bin_path_os(char const *const);
+typedef struct sdcard_info
+{
+#ifndef CONFIG_WIN32
+    int fd;
+#else
+    HANDLE handle;
+#endif
+    char* lock_file; /* reserved for future use */
+}sdcard_info;
+
+
 #ifndef CONFIG_WIN32
 bool make_sdcard_lock_posix(char *sdcard);
 int remove_sdcard_lock_posix(char *sdcard);