diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 16:00:00 +0200 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2008-10-21 16:00:00 +0200 |
commit | 23580ca27a0a8109312fdd36cc363ad1f4719889 (patch) | |
tree | 0bb90eaa72f8df110162499f756b5cbfb7d49235 /test_roots.c | |
download | android_bootable_recovery-23580ca27a0a8109312fdd36cc363ad1f4719889.tar android_bootable_recovery-23580ca27a0a8109312fdd36cc363ad1f4719889.tar.gz android_bootable_recovery-23580ca27a0a8109312fdd36cc363ad1f4719889.tar.bz2 android_bootable_recovery-23580ca27a0a8109312fdd36cc363ad1f4719889.tar.lz android_bootable_recovery-23580ca27a0a8109312fdd36cc363ad1f4719889.tar.xz android_bootable_recovery-23580ca27a0a8109312fdd36cc363ad1f4719889.tar.zst android_bootable_recovery-23580ca27a0a8109312fdd36cc363ad1f4719889.zip |
Diffstat (limited to 'test_roots.c')
-rw-r--r-- | test_roots.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/test_roots.c b/test_roots.c new file mode 100644 index 000000000..f49f55e21 --- /dev/null +++ b/test_roots.c @@ -0,0 +1,81 @@ +/* + * Copyright (C) 2007 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <sys/stat.h> +#include "roots.h" +#include "common.h" + +#define CANARY_FILE "/system/build.prop" +#define CANARY_FILE_ROOT_PATH "SYSTEM:build.prop" + +int +file_exists(const char *path) +{ + struct stat st; + int ret; + ret = stat(path, &st); + if (ret == 0) { + return S_ISREG(st.st_mode); + } + return 0; +} + +int +test_roots() +{ + int ret; + + /* Make sure that /system isn't mounted yet. + */ + if (file_exists(CANARY_FILE)) return -__LINE__; + if (is_root_path_mounted(CANARY_FILE_ROOT_PATH)) return -__LINE__; + + /* Try to mount the root. + */ + ret = ensure_root_path_mounted(CANARY_FILE_ROOT_PATH); + if (ret < 0) return -__LINE__; + + /* Make sure we can see the file now and that we know the root is mounted. + */ + if (!file_exists(CANARY_FILE)) return -__LINE__; + if (!is_root_path_mounted(CANARY_FILE_ROOT_PATH)) return -__LINE__; + + /* Make sure that the root path corresponds to the regular path. + */ + struct stat st1, st2; + char buf[128]; + const char *path = translate_root_path(CANARY_FILE_ROOT_PATH, + buf, sizeof(buf)); + if (path == NULL) return -__LINE__; + ret = stat(CANARY_FILE, &st1); + if (ret != 0) return -__LINE__; + ret = stat(path, &st2); + if (ret != 0) return -__LINE__; + if (st1.st_dev != st2.st_dev || st1.st_ino != st2.st_ino) return -__LINE__; + + /* Try to unmount the root. + */ + ret = ensure_root_path_unmounted(CANARY_FILE_ROOT_PATH); + if (ret < 0) return -__LINE__; + + /* Make sure that we can't see the file anymore and that + * we don't think the root is mounted. + */ + if (file_exists(CANARY_FILE)) return -__LINE__; + if (is_root_path_mounted(CANARY_FILE_ROOT_PATH)) return -__LINE__; + + return 0; +} |