diff options
Diffstat (limited to 'core')
-rw-r--r-- | core/jni/android_os_FileUtils.cpp | 50 |
1 files changed, 40 insertions, 10 deletions
diff --git a/core/jni/android_os_FileUtils.cpp b/core/jni/android_os_FileUtils.cpp index b624a0d..e088a68 100644 --- a/core/jni/android_os_FileUtils.cpp +++ b/core/jni/android_os_FileUtils.cpp @@ -69,28 +69,58 @@ jint android_os_FileUtils_getVolumeUUID(JNIEnv* env, jobject clazz, jstring path const char *pathStr = env->GetStringUTFChars(path, NULL); ALOGD("Trying to get UUID for %s \n", pathStr); - uuid = blkid_get_tag_value(NULL, "UUID", pathStr); + char device[256]; + char mount_path[256]; + char rest[256]; + FILE *fp; + char line[1024]; + bool findDevice = false; + if (!(fp = fopen("/proc/mounts", "r"))) { + SLOGE("Error opening /proc/mounts (%s)", strerror(errno)); + return false; + } + + while(fgets(line, sizeof(line), fp)) { + line[strlen(line)-1] = '\0'; + sscanf(line, "%255s %255s %255s\n", device, mount_path, rest); + if (!strcmp(mount_path, pathStr)) { + findDevice = true; + break; + } + } + + fclose(fp); + + if (findDevice) { + uuid = blkid_get_tag_value(NULL, "UUID", device); + } else { + uuid = blkid_get_tag_value(NULL, "UUID", pathStr); + } if (uuid) { ALOGD("UUID for %s is %s\n", pathStr, uuid); - String8 s8uuid = (String8)uuid; - size_t len = s8uuid.length(); - String8 result; + int len = strlen(uuid); + char result[len]; if (len > 0) { - for (int i = 0; i > len; i++) + char * pCur = uuid; + int length = 0; + while (*pCur!='\0' && length < len) { - if (strncmp((const char *)s8uuid[i], (const char *)"-", 1) != 0) { - result.append((const char *)s8uuid[i]); + if ((*pCur) != '-') { + result[length] = (*pCur); } + pCur++; + length++; } - len = 0; + result[length] = '\0'; } - len = result.length(); + len = strlen(result); if (len > 0) { - return atoi(s8uuid); + char *pEnd = NULL; + return (int)strtol(result, &pEnd, 16); } else { ALOGE("Couldn't get UUID for %s\n", pathStr); } |