Modify the sdk groups routine for sdb shell/sync service. 11/67511/2
authorKim Gunsoo <gunsoo83.kim@samsung.com>
Wed, 27 Apr 2016 05:51:55 +0000 (14:51 +0900)
committerKim Gunsoo <gunsoo83.kim@samsung.com>
Wed, 27 Apr 2016 07:41:30 +0000 (16:41 +0900)
- Add the groups for sdbd shell/sync default group.
  ("priv_externalstorage", "priv_externalstorage_appdata", "priv_mediastorage")
- Modify the sdk group init routine that receives group infomation
  from platform.

Change-Id: I7273df2e05f65a62953e7e4f6003e3bc928aaae4
Signed-off-by: Kim Gunsoo <gunsoo83.kim@samsung.com>
src/sdb.c
src/sdb.h

index 61b5bc4..793d8ec 100644 (file)
--- a/src/sdb.c
+++ b/src/sdb.c
@@ -77,7 +77,13 @@ struct group_info
     const char *name;
     gid_t gid;
 };
-struct group_info g_default_groups[] = { {"log", -1}, {NULL, -1}};
+struct group_info g_default_groups[] = {
+    {"priv_externalstorage", -1},
+    {"priv_externalstorage_appdata", -1},
+    {"priv_mediastorage", -1},
+    {"log", -1},
+    {NULL, -1}
+};
 #define SDB_DEFAULT_GROUPS_CNT  ((sizeof(g_default_groups)/sizeof(g_default_groups[0]))-1)
 
 int is_init_sdk_userinfo = 0;
@@ -1435,7 +1441,7 @@ static int sdbd_set_groups() {
                 break;
             }
         }
-        if (group_match == 0) {
+        if (group_match == 0 && g_default_groups[i].gid != -1) {
             group_ids[ngroups + added_group_cnt] = g_default_groups[i].gid;
             added_group_cnt ++;
         }
@@ -1462,7 +1468,25 @@ static int sdbd_get_user_pwd(const char* user_name, struct passwd* pwd, char* bu
             D("Not found passwd : username(%s)\n", user_name);
         } else {
             errno = ret;
-            D("failed to getpwuid_r\n");
+            D("failed to getpwnam_r\n");
+        }
+        return -1;
+    }
+
+    return 0;
+}
+
+static int sdbd_get_group(const char* group_name, struct group* grp, char* buf, size_t bufsize) {
+    struct group *result = NULL;
+    int ret = 0;
+
+    ret = getgrnam_r(group_name, grp, buf, bufsize, &result);
+    if (result == NULL) {
+        if (ret == 0) {
+            D("Not found group : groupname(%s)\n", group_name);
+        } else {
+            errno = ret;
+            D("failed to getgrnam_r\n");
         }
         return -1;
     }
@@ -1478,26 +1502,25 @@ int set_sdk_user_privileges() {
 
     if (sdbd_set_groups() < 0) {
         D("set groups failed (errno: %d)\n", errno);
-        return -1;
     }
 
     if (setgid(g_sdk_group_id) != 0) {
         D("set group id failed (errno: %d)\n", errno);
-        return -1;
     }
 
     if (setuid(g_sdk_user_id) != 0) {
         D("set user id failed (errno: %d)\n", errno);
-        return -1;
     }
 
     if (chdir(g_sdk_home_dir) < 0) {
         D("unable to change working directory to %s\n", g_sdk_home_dir);
-        return -1;
     }
 
     // TODO: use pam later
-    putenv(g_sdk_home_dir_env);
+    if (g_sdk_home_dir_env) {
+        putenv(g_sdk_home_dir_env);
+    }
+
     return 0;
 }
 
@@ -1721,38 +1744,48 @@ static void load_sdbd_plugin() {
     D("using sdbd plugin interface.(%s)\n", SDBD_PLUGIN_PATH);
 }
 
+#define SDB_PW_GR_DEFAULT_SIZE  (16*1024)
 static long get_passwd_bufsize() {
     long bufsize = 0;
 
     bufsize = sysconf(_SC_GETPW_R_SIZE_MAX);
     if(bufsize < 0) {
-        bufsize = (16*1024);
+        bufsize = SDB_PW_GR_DEFAULT_SIZE;
+    }
+
+    return bufsize;
+}
+
+static long get_group_bufsize() {
+    long bufsize = 0;
+
+    bufsize = sysconf(_SC_GETGR_R_SIZE_MAX);
+    if(bufsize < 0) {
+        bufsize = SDB_PW_GR_DEFAULT_SIZE;
     }
 
     return bufsize;
 }
 
 static int init_sdb_default_groups() {
-    struct passwd pwd;
+    struct group grp;
     char *buf = NULL;
     long bufsize = 0;
     int i = 0;
 
-    bufsize = get_passwd_bufsize();
+    bufsize = get_group_bufsize();
     buf = malloc(bufsize);
     if (buf == NULL) {
-        D("failed to allocate passwd buf(%ld)\n", bufsize);
+        D("failed to allocate gruop buf(%ld)\n", bufsize);
         return -1;
     }
 
     for (i = 0; g_default_groups[i].name != NULL; i++) {
         memset(buf, 0, bufsize);
-        if (sdbd_get_user_pwd(g_default_groups[i].name, &pwd, buf, bufsize) == 0) {
-            g_default_groups[i].gid = pwd.pw_gid;
+        if (sdbd_get_group(g_default_groups[i].name, &grp, buf, bufsize) == 0) {
+            g_default_groups[i].gid = grp.gr_gid;
         } else {
-            D("get user passwd info.(errno: %d)\n", errno);
-            free(buf);
-            return -1;
+            D("failed get group info.(errno: %d)\n", errno);
         }
     }
 
@@ -1760,6 +1793,12 @@ static int init_sdb_default_groups() {
     return 0;
 }
 
+static void set_static_userinfo() {
+    g_sdk_user_id = STATIC_SDK_USER_ID;
+    g_sdk_group_id = STATIC_SDK_GROUP_ID;
+    g_sdk_home_dir = STATIC_SDK_HOME_DIR;
+}
+
 static int init_sdk_userinfo() {
     struct passwd pwd;
     char *buf = NULL;
@@ -1769,42 +1808,36 @@ static int init_sdk_userinfo() {
         return 0;
     }
 
+    if (init_sdb_default_groups() < 0) {
+        D("failed to initialize default groups.\n");
+    }
+
     bufsize = get_passwd_bufsize();
     buf = malloc(bufsize);
     if (buf == NULL) {
         D("failed to allocate passwd buf(%ld)\n", bufsize);
-        return -1;
-    }
+        set_static_userinfo();
+    } else {
+        if (sdbd_get_user_pwd(SDK_USER_NAME, &pwd, buf, bufsize) < 0) {
+            D("get user passwd info.(errno: %d)\n", errno);
+            set_static_userinfo();
+        } else {
+            D("username=%s, uid=%d, gid=%d, dir=%s\n", pwd.pw_name, pwd.pw_uid, pwd.pw_gid, pwd.pw_dir);
 
-    if (sdbd_get_user_pwd(SDK_USER_NAME, &pwd, buf, bufsize) < 0) {
-        D("get user passwd info.(errno: %d)\n", errno);
+            g_sdk_user_id = pwd.pw_uid;
+            g_sdk_group_id = pwd.pw_gid;
+            g_sdk_home_dir = strdup(pwd.pw_dir);
+        }
         free(buf);
-        return -1;
-    }
-    D("username=%s, uid=%d, gid=%d, dir=%s\n", pwd.pw_name, pwd.pw_uid, pwd.pw_gid, pwd.pw_dir);
-
-    g_sdk_user_id = pwd.pw_uid;
-    g_sdk_group_id = pwd.pw_gid;
-    g_sdk_home_dir = strdup(pwd.pw_dir);
-
-    free(buf);
-
-    if (init_sdb_default_groups() < 0) {
-        D("failed to initialize default groups.\n");
-        free(g_sdk_home_dir);
-        g_sdk_home_dir = NULL;
-        return -1;
     }
 
     int env_size = strlen("HOME=") + strlen(g_sdk_home_dir) + 1;
     g_sdk_home_dir_env = malloc(env_size);
-    if(g_sdk_home_dir_env == 0) {
+    if(g_sdk_home_dir_env == NULL) {
         D("failed to allocate for home dir env string\n");
-        free(g_sdk_home_dir);
-        g_sdk_home_dir = NULL;
-        return -1;
+    } else {
+        snprintf(g_sdk_home_dir_env, env_size, "HOME=%s", g_sdk_home_dir);
     }
-    snprintf(g_sdk_home_dir_env, env_size, "HOME=%s", g_sdk_home_dir);
 
     is_init_sdk_userinfo = 1;
     return 0;
index dd0fe23..7e3d1f1 100644 (file)
--- a/src/sdb.h
+++ b/src/sdb.h
@@ -385,6 +385,9 @@ int booting_done; // 0: platform booting is in progess 1: platform booting is do
 
 #define SDK_USER_NAME   tzplatform_getenv(TZ_SDK_USER_NAME)
 #define SDK_TOOL_PATH   tzplatform_getenv(TZ_SDK_TOOLS)
+#define STATIC_SDK_USER_ID      5001
+#define STATIC_SDK_GROUP_ID     100
+#define STATIC_SDK_HOME_DIR     "/home/owner"
 extern uid_t g_sdk_user_id;
 extern gid_t g_sdk_group_id;
 extern char* g_sdk_home_dir;