revise making directory
when create directory recursively, change owner of parent directory
Change-Id: I5beda08252f050a6104699b28bcde26e0a6957f5
Signed-off-by: Sangyoon Jang <s89.jang@samsung.com>
#include <dlfcn.h>
#include <sys/smack.h>
#include <linux/limits.h>
#include <dlfcn.h>
#include <sys/smack.h>
#include <linux/limits.h>
#include <libxml/parser.h>
#include <libxml/xmlreader.h>
#include <libxml/parser.h>
#include <libxml/xmlreader.h>
static int _check_create_Cert_db( sqlite3 *certdb);
static int __exec_db_query(sqlite3 *db, char *query, sqlite_query_callback callback, void *data);
static int _check_create_Cert_db( sqlite3 *certdb);
static int __exec_db_query(sqlite3 *db, char *query, sqlite_query_callback callback, void *data);
-static int _mkdir(const char *dir, mode_t mode)
+static int _mkdir_for_user(const char* dir, uid_t uid, gid_t gid)
- char tmp[PATH_MAX];
- char *p = NULL;
- size_t len;
-
- snprintf(tmp, sizeof(tmp), "%s", dir);
- len = strlen(tmp);
- if(tmp[len - 1] == '/')
- tmp[len - 1] = 0;
- for(p = tmp + 1; *p; p++) {
- if(*p == '/') {
- *p = 0;
- ret = mkdir(tmp, mode);
- if (ret && errno != EEXIST)
- return ret;
- *p = '/';
+ char *fullpath;
+ char *subpath;
+
+ _LOGD("uid:%d gid:%d", uid, gid);
+ fullpath = strdup(dir);
+ subpath = dirname(fullpath);
+ if (strlen(subpath) > 1) {
+ ret = _mkdir_for_user(fullpath, uid, gid);
+ if (ret == -1) {
+ free(fullpath);
+ return ret;
- return mkdir(tmp, mode);
-}
-static void _mkdir_for_user(const char* dir, uid_t uid, gid_t gid) {
- int ret = 0;
+ ret = mkdir(dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
+ if (ret && errno != EEXIST) {
+ free(fullpath);
+ return ret;
+ } else if (ret && errno == EEXIST) {
+ free(fullpath);
+ return 0;
+ }
- ret = _mkdir(dir, S_IRWXU | S_IRGRP | S_IXGRP | S_IXOTH);
- if (ret == -1 && errno != EEXIST) {
- _LOGE("FAIL : to create directory %s %d", dir, errno);
- } else if (getuid() == ROOT_UID) {
+ if (getuid() == ROOT_UID) {
ret = chown(dir, uid, gid);
if (ret == -1)
ret = chown(dir, uid, gid);
if (ret == -1)
- _LOGE("FAIL : chown %s %d.%d, because %s", dir, uid, gid, strerror(errno));
+ _LOGE("FAIL : chown %s %d.%d, because %s", dir, uid,
+ gid, strerror(errno));
+
+ free(fullpath);
+
+ return 0;
}
static const char *_get_db_path(uid_t uid) {
}
static const char *_get_db_path(uid_t uid) {