sync with master
authorJinkun Jang <jinkun.jang@samsung.com>
Sun, 17 Mar 2013 04:29:14 +0000 (13:29 +0900)
committerJinkun Jang <jinkun.jang@samsung.com>
Sun, 17 Mar 2013 04:29:14 +0000 (13:29 +0900)
packaging/system-server.spec
ss_mmc_handler.c

index df0ac47..a7d87e2 100755 (executable)
@@ -2,7 +2,7 @@
 Name:       system-server
 Summary:    System server
 Version:    0.1.65
-Release:    3
+Release:    4
 Group:      Framework/system
 License:    Apache License, Version 2.0
 Source0:    system-server-%{version}.tar.gz
index 27ac1c4..f52d630 100644 (file)
@@ -19,7 +19,6 @@
 #include <sys/mount.h>
 #include <errno.h>
 #include <vconf.h>
-#include <devman.h>
 #include <fcntl.h>
 #include <dirent.h>
 #include <sysman.h>
 #define MOVINAND_DEV           "/dev/mmcblk0p1"
 #define FORMAT_MMC             PREFIX"/sbin/mkfs.vfat "
 #define FORMAT_MOVINAND                PREFIX"/bin/movi_format.sh"
+
 #define FS_VFAT_MOUNT_OPT  "uid=0,gid=0,dmask=0000,fmask=0111,iocharset=iso8859-1,utf8,shortname=mixed,smackfsroot=*,smackfsdef=*"
 
+#define MMC_PARENT_PATH     "/opt/storage"
+
+#define BUF_LEN             20
+
+#define MMC_32GB_SIZE           61315072
+
+static const char *vfat_arg[] = {
+       "/sbin/mkfs.vfat",
+       NULL, NULL,
+};
+
 int mmc_status;
 int ss_mmc_inserted(void);
 static int __umount_fs(void);
 
+static int exec_process(const char **argv)
+{
+       int pid;
+       int i;
+       int r;
+
+       if (!argv)
+               return -1;
+
+       pid = fork();
+       if (pid == -1)
+               return -1;
+
+       if (!pid) {
+               for (i = 0; i < _NSIG; ++i)
+                       signal(i, SIG_DFL);
+               r = execv(argv[0], argv);
+               if (r == -1) {
+                       PRT_TRACE_ERR("execv() error");
+                       exit(EXIT_FAILURE);
+               }
+       }
+
+       return pid;
+}
+
 int get_mmcblk_num()
 {
        DIR *dp;
@@ -99,12 +136,119 @@ int get_mmcblk_num()
        return -1;
 }
 
+static int check_mount_state(void)
+{
+       struct stat parent_stat, mount_stat;
+       char parent_path[PATH_MAX];
+       char mount_path[PATH_MAX];
+
+       snprintf(parent_path, sizeof(parent_path), "%s", MMC_PARENT_PATH);
+       snprintf(mount_path, sizeof(mount_path), "%s", MMC_MOUNT_POINT);
+
+       if (stat(mount_path, &mount_stat) != 0 || stat(parent_path, &parent_stat) != 0) {
+               PRT_TRACE_ERR("get stat error");
+               return 0;
+       }
+
+       if (mount_stat.st_dev == parent_stat.st_dev) {
+               PRT_TRACE_ERR("state : UNMOUNT");
+               return 0;
+       }
+
+       PRT_TRACE_ERR("state : MOUNT");
+       return 1;
+}
+
+static int create_partition(const char *dev_path)
+{
+       int r;
+
+       r = system("printf \"n\\n\\n\\n\\n\\nw\" | fdisk /dev/mmcblk1");
+       if (WIFSIGNALED(r) && (WTERMSIG(r) == SIGINT || WTERMSIG(r) == SIGQUIT || WEXITSTATUS(r)))
+               return -1;
+
+       return 0;
+}
+
+static int format_mmc(const char *path)
+{
+       int mkfs_pid;
+       char buf[NAME_MAX];
+
+       if (path == NULL) {
+               PRT_TRACE_ERR("Invalid parameter");
+               return -1;
+       }
+
+       vfat_arg[1] = path;
+
+       mkfs_pid = exec_process(vfat_arg);
+
+       if (mkfs_pid < 0) {
+               PRT_TRACE_ERR("%s fail");
+               return -1;
+       }
+
+       snprintf(buf, sizeof(buf), "%s%d", "/proc/", mkfs_pid);
+       PRT_TRACE_ERR("child process : %s", buf);
+       while (1) {
+               sleep(1);
+               PRT_TRACE_ERR("formatting....");
+               if (access(buf, R_OK) != 0)
+                       break;
+       }
+
+       return 0;
+}
+
+static int format_exec(int blknum)
+{
+       char dev_mmcblk[NAME_MAX];
+       char dev_mmcblkp[NAME_MAX];
+       int r;
+
+       if (check_mount_state() == 1) {
+               PRT_TRACE_ERR("Mounted, will be unmounted");
+               r = __umount_fs();
+               if (r != 0) {
+                       PRT_TRACE_ERR("unmount_mmc fail");
+                       vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT, VCONFKEY_SYSMAN_MMC_FORMAT_FAILED);
+                       return -1;
+               }
+       }
+
+       snprintf(dev_mmcblk, sizeof(dev_mmcblk), "%s%d", MMC_DEV, blknum);
+       snprintf(dev_mmcblkp, sizeof(dev_mmcblkp), "%sp1", dev_mmcblk);
+       if (access(dev_mmcblkp, R_OK) < 0) {
+               PRT_TRACE_ERR("%s is not valid, create the primary partition", dev_mmcblkp);
+               r = create_partition(dev_mmcblk);
+               if (r < 0) {
+                       PRT_TRACE_ERR("create_partition failed");
+                       vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT, VCONFKEY_SYSMAN_MMC_FORMAT_FAILED);
+                       heynoti_publish("mmcblk_remove");
+                       return -1;
+               }
+       }
+
+       r = format_mmc(dev_mmcblkp);
+       if (r < 0) {
+               PRT_TRACE_ERR("format_mmc fail");
+               vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT, VCONFKEY_SYSMAN_MMC_FORMAT_FAILED);
+               heynoti_publish("mmcblk_remove");
+               return -1;
+       }
+
+       PRT_TRACE_ERR("Format Successful");
+       vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT, VCONFKEY_SYSMAN_MMC_FORMAT_COMPLETED);
+       return 0;
+}
+
 static int ss_mmc_format(keynode_t *key_nodes, void *data)
 {
        PRT_TRACE_ERR("mmc format called");
        __umount_fs();
        vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS, VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS_NOW);
-       device_set_property(DEVTYPE_MMC, MMC_PROP_FORMAT, 0);
+       format_exec(get_mmcblk_num());
        vconf_set_int(VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS, VCONFKEY_SYSMAN_MMC_FORMAT_PROGRESS_NONE);
        ss_mmc_inserted();
        return 0;
@@ -156,6 +300,7 @@ int ss_mmc_init()
 static int __mount_fs(char *path, const char *fs_name, const char *mount_data)
 {
        int ret, retry = 0;
+
        do {
                if ((ret = mount(path, MMC_MOUNT_POINT, fs_name, 0, mount_data)) == 0) {
                        PRT_TRACE("Mounted mmc card\n");
@@ -195,11 +340,11 @@ static int __mmc_mount_fs(void)
        }
        close(fd);
 
-               if (__mount_fs(buf, "vfat", FS_VFAT_MOUNT_OPT) != 0)
-                       return errno;
+       if (__mount_fs(buf, "vfat", FS_VFAT_MOUNT_OPT) != 0)
+               return errno;
        return 0;
-}
 
+}
 int ss_mmc_inserted(void)
 {
        int r = 0;
@@ -236,7 +381,6 @@ mount_fail:
        mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED;
        return 0;
 }
-
 static int __umount_fs(void)
 {
        int ret;
@@ -246,7 +390,6 @@ static int __umount_fs(void)
        mmc_status = VCONFKEY_SYSMAN_MMC_REMOVED;
        return ret;
 }
-
 int ss_mmc_removed()
 {
        int mmc_err = 0;