From 2ebbfb2eda46299a06b79552e84eac9f0d39b0d8 Mon Sep 17 00:00:00 2001 From: "pr.jung" Date: Tue, 27 Feb 2018 17:31:51 +0900 Subject: [PATCH] Call GetStatvfs dbus method for external storage size Change-Id: I43f8f7ec1b8f4214c6d03d64f5667449e3b94d55 Signed-off-by: pr.jung --- src/statvfs.c | 26 +++------------- src/storage-external-dbus.c | 75 +++++++++++++++++++++++++++++++++++++++++++++ src/storage-external-dbus.h | 23 ++++++++++++++ 3 files changed, 102 insertions(+), 22 deletions(-) diff --git a/src/statvfs.c b/src/statvfs.c index 7b50dc4..e920cb6 100644 --- a/src/statvfs.c +++ b/src/statvfs.c @@ -37,24 +37,6 @@ #define EXTERNAL_MEMORY_NODE "sdcard" #define STORAGE_CONF_FILE "/etc/storage/libstorage.conf" -/* it's for 32bit file offset */ -struct statvfs_32 { - unsigned long int f_bsize; - unsigned long int f_frsize; - unsigned long int f_blocks; - unsigned long int f_bfree; - unsigned long int f_bavail; - unsigned long int f_files; - unsigned long int f_ffree; - unsigned long int f_favail; - unsigned long int f_fsid; -#ifdef _STATVFSBUF_F_UNUSED - int __f_unused; -#endif - unsigned long int f_flag; - unsigned long int f_namemax; - int __f_spare[6]; -}; #define MAX_LINE 128 #define MAX_SECTION 64 @@ -254,7 +236,7 @@ API int storage_get_internal_memory_size(struct statvfs *buf) ret = get_memory_size(tzplatform_getenv(TZ_SYS_HOME), &temp); if (ret || temp.f_bsize == 0) { - _E("fail to get memory size"); //LCOV_EXCL_LINE + _E("fail to get memory size %d", ret); //LCOV_EXCL_LINE return -errno; //LCOV_EXCL_LINE System Error } @@ -362,10 +344,10 @@ int storage_get_external_memory_size_with_path(char *path, struct statvfs *buf) if (!mount_check(ext_path)) goto out_nodev; - ret = get_memory_size(ext_path, &temp); + ret = storage_ext_get_statvfs(ext_path, &temp); if (ret) { _E("fail to get memory size"); //LCOV_EXCL_LINE - return -errno; //LCOV_EXCL_LINE System Error + return ret; //LCOV_EXCL_LINE System Error } memcpy(buf, &temp, sizeof(temp)); @@ -406,7 +388,7 @@ int storage_get_external_memory_size64_with_path(char *path, struct statvfs *buf if (!mount_check(ext_path)) goto out_nodev; - ret = statvfs(ext_path, buf); + ret = storage_ext_get_statvfs_size64(ext_path, buf); if (ret) { //LCOV_EXCL_START System Error _E("fail to get memory size"); diff --git a/src/storage-external-dbus.c b/src/storage-external-dbus.c index dcd1e9e..4568371 100755 --- a/src/storage-external-dbus.c +++ b/src/storage-external-dbus.c @@ -24,7 +24,9 @@ #include #include #include +#include #include +#include #include "log.h" #include "storage-external-dbus.h" @@ -32,6 +34,7 @@ #define CHECK_STR(a) (a ? a : "") #define STORAGE_EXT_GET_LIST "GetDeviceList" +#define STORAGE_EXT_GET_STATVFS "GetStatvfs" #define STORAGE_EXT_DEVICE_CHANGED "DeviceChanged" #define STORAGE_EXT_DEVICE_ADDED "DeviceAdded" @@ -211,6 +214,78 @@ out: return ret; } +int storage_ext_get_statvfs(char *path, struct statvfs_32 *buf) +{ + GVariant *result; + guint64 bsize, frsize, blocks, bfree, bavail, files, ffree, favail, fsid, flag, namemax; + + assert(buf); + + memset(buf, 0, sizeof(struct statvfs_32)); + + result = dbus_method_call_sync(STORAGE_EXT_BUS_NAME, + STORAGE_EXT_PATH_STORAGE, + STORAGE_EXT_IFACE_STORAGE, + STORAGE_EXT_GET_STATVFS, + g_variant_new("(s)", path)); + if (!result) { + _E("Failed to get storage_ext device info"); //LCOV_EXCL_LINE + return -EIO; + } + + g_variant_get(result, "(ttttttttttt)", + &bsize, &frsize, &blocks, + &bfree, &bavail, &files, + &ffree, &favail, &fsid, + &flag, &namemax); +// %llu bsize, frsize, blocks, bfree, bavail, files, ffree, favail, fsid, flag, namemax + + buf->f_bsize = (unsigned long)bsize; + buf->f_frsize = (unsigned long)frsize; + buf->f_blocks = (unsigned long)blocks; + buf->f_bfree = (unsigned long)bfree; + buf->f_bavail = (unsigned long)bavail; + buf->f_files = (unsigned long)files; + buf->f_ffree = (unsigned long)ffree; + buf->f_favail = (unsigned long)favail; + buf->f_fsid = (unsigned long)fsid; + buf->f_flag = (unsigned long)flag; + buf->f_namemax = (unsigned long)namemax; + +// %lu buf->f_bsize, buf->f_frsize, buf->f_blocks, buf->f_bfree, buf->f_bavail, buf->f_files, buf->f_ffree, buf->f_favail, buf->f_fsid, buf->f_flag, buf->f_namemax + return 0; +} + +int storage_ext_get_statvfs_size64(char *path, struct statvfs *buf) +{ + GVariant *result; + + assert(buf); + + memset(buf, 0, sizeof(struct statvfs)); + + result = dbus_method_call_sync(STORAGE_EXT_BUS_NAME, + STORAGE_EXT_PATH_STORAGE, + STORAGE_EXT_IFACE_STORAGE, + STORAGE_EXT_GET_STATVFS, + g_variant_new("(s)", path)); + if (!result) { + _E("Failed to get storage_ext device info"); //LCOV_EXCL_LINE + return -EIO; + } + + g_variant_get(result, "(ttttttttttt)", + &(buf->f_bsize), &(buf->f_frsize), &(buf->f_blocks), + &(buf->f_bfree), &(buf->f_bavail), &(buf->f_files), + &(buf->f_ffree), &(buf->f_favail), &(buf->f_fsid), + &(buf->f_flag), &(buf->f_namemax)); + +// %lu buf->f_bsize, buf->f_frsize, buf->f_fsid, buf->f_flag, buf->f_namemax +// %llu buf->f_blocks, buf->f_bfree, buf->f_bavail, buf->f_files, buf->f_ffree, buf->f_favail + + return 0; +} + //LCOV_EXCL_START Not called Callback static void storage_ext_device_changed(GVariant *params, enum storage_ext_state state, gpointer user_data) { diff --git a/src/storage-external-dbus.h b/src/storage-external-dbus.h index c37881b..195d72e 100644 --- a/src/storage-external-dbus.h +++ b/src/storage-external-dbus.h @@ -28,6 +28,8 @@ #define STORAGE_EXT_BUS_NAME "org.tizen.system.storage" #define STORAGE_EXT_PATH_MANAGER "/Org/Tizen/System/Storage/Block/Manager" #define STORAGE_EXT_IFACE_MANAGER STORAGE_EXT_BUS_NAME".BlockManager" +#define STORAGE_EXT_PATH_STORAGE "/Org/Tizen/System/Storage/Storage" +#define STORAGE_EXT_IFACE_STORAGE STORAGE_EXT_BUS_NAME".storage" enum mount_state { STORAGE_EXT_UNMOUNTED, @@ -72,12 +74,33 @@ typedef struct _storage_ext_device { int storage_id; } storage_ext_device; +/* it's for 32bit file offset */ +struct statvfs_32 { + unsigned long int f_bsize; + unsigned long int f_frsize; + unsigned long int f_blocks; + unsigned long int f_bfree; + unsigned long int f_bavail; + unsigned long int f_files; + unsigned long int f_ffree; + unsigned long int f_favail; + unsigned long int f_fsid; +#ifdef _STATVFSBUF_F_UNUSED + int __f_unused; +#endif + unsigned long int f_flag; + unsigned long int f_namemax; + int __f_spare[6]; +}; + typedef int (*storage_ext_changed_cb)(storage_ext_device *dev, enum storage_ext_state state, void *data); int storage_ext_is_supported(void); void storage_ext_release_device(storage_ext_device **dev); void storage_ext_release_list(dd_list **list); int storage_ext_get_list(dd_list **list); +int storage_ext_get_statvfs(char *path, struct statvfs_32 *buf); +int storage_ext_get_statvfs_size64(char *path, struct statvfs *buf); int storage_ext_register_device_change(storage_ext_changed_cb func, void *data); void storage_ext_unregister_device_change(storage_ext_changed_cb func); -- 2.7.4