Switch installd to compile as C++.
This is the minimal change needed to switch it over to C++, which paves the way for using more robust utilities like std::string. Change-Id: I80ed6280146875eb6ddbbb340c05450388ca13f0
This commit is contained in:
parent
e23a13299a
commit
19803807cd
@ -1,6 +1,6 @@
|
|||||||
LOCAL_PATH := $(call my-dir)
|
LOCAL_PATH := $(call my-dir)
|
||||||
|
|
||||||
common_src_files := commands.c utils.c
|
common_src_files := commands.cpp utils.cpp
|
||||||
common_cflags := -Wall -Werror
|
common_cflags := -Wall -Werror
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -23,7 +23,7 @@ include $(CLEAR_VARS)
|
|||||||
LOCAL_MODULE := installd
|
LOCAL_MODULE := installd
|
||||||
LOCAL_MODULE_TAGS := optional
|
LOCAL_MODULE_TAGS := optional
|
||||||
LOCAL_CFLAGS := $(common_cflags)
|
LOCAL_CFLAGS := $(common_cflags)
|
||||||
LOCAL_SRC_FILES := installd.c $(common_src_files)
|
LOCAL_SRC_FILES := installd.cpp $(common_src_files)
|
||||||
LOCAL_SHARED_LIBRARIES := libcutils liblog libselinux
|
LOCAL_SHARED_LIBRARIES := libcutils liblog libselinux
|
||||||
LOCAL_STATIC_LIBRARIES := libdiskusage
|
LOCAL_STATIC_LIBRARIES := libdiskusage
|
||||||
LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
|
LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
/*
|
/*
|
||||||
** Copyright 2008, The Android Open Source Project
|
** Copyright 2008, The Android Open Source Project
|
||||||
**
|
**
|
||||||
** Licensed under the Apache License, Version 2.0 (the "License");
|
** Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
** you may not use this file except in compliance with the License.
|
** you may not use this file except in compliance with the License.
|
||||||
** You may obtain a copy of the License at
|
** You may obtain a copy of the License at
|
||||||
**
|
**
|
||||||
** http://www.apache.org/licenses/LICENSE-2.0
|
** http://www.apache.org/licenses/LICENSE-2.0
|
||||||
**
|
**
|
||||||
** Unless required by applicable law or agreed to in writing, software
|
** Unless required by applicable law or agreed to in writing, software
|
||||||
** distributed under the License is distributed on an "AS IS" BASIS,
|
** distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
** See the License for the specific language governing permissions and
|
** See the License for the specific language governing permissions and
|
||||||
** limitations under the License.
|
** limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ static int do_dexopt(char **arg, char reply[REPLY_MAX] __unused)
|
|||||||
{
|
{
|
||||||
/* apk_path, uid, is_public, pkgname, instruction_set, vm_safe_mode, should_relocate
|
/* apk_path, uid, is_public, pkgname, instruction_set, vm_safe_mode, should_relocate
|
||||||
debuggable, outputPath */
|
debuggable, outputPath */
|
||||||
return dexopt(arg[0], atoi(arg[1]), atoi(arg[2]), arg[3], arg[4], atoi(arg[5]), 0,
|
return dexopt(arg[0], atoi(arg[1]), atoi(arg[2]), arg[3], arg[4], atoi(arg[5]), 0,
|
||||||
atoi(arg[6]), arg[7]);
|
atoi(arg[6]), arg[7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,7 +205,7 @@ struct cmdinfo cmds[] = {
|
|||||||
|
|
||||||
static int readx(int s, void *_buf, int count)
|
static int readx(int s, void *_buf, int count)
|
||||||
{
|
{
|
||||||
char *buf = _buf;
|
char *buf = (char *) _buf;
|
||||||
int n = 0, r;
|
int n = 0, r;
|
||||||
if (count < 0) return -1;
|
if (count < 0) return -1;
|
||||||
while (n < count) {
|
while (n < count) {
|
||||||
@ -226,7 +226,7 @@ static int readx(int s, void *_buf, int count)
|
|||||||
|
|
||||||
static int writex(int s, const void *_buf, int count)
|
static int writex(int s, const void *_buf, int count)
|
||||||
{
|
{
|
||||||
const char *buf = _buf;
|
const char *buf = (const char *) _buf;
|
||||||
int n = 0, r;
|
int n = 0, r;
|
||||||
if (count < 0) return -1;
|
if (count < 0) return -1;
|
||||||
while (n < count) {
|
while (n < count) {
|
||||||
@ -353,14 +353,14 @@ int initialize_globals() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the android external app directory.
|
// Get the android external app directory.
|
||||||
if (get_path_from_string(&android_mnt_expand_dir, "/mnt/expand") < 0) {
|
if (get_path_from_string(&android_mnt_expand_dir, "/mnt/expand/") < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Take note of the system and vendor directories.
|
// Take note of the system and vendor directories.
|
||||||
android_system_dirs.count = 4;
|
android_system_dirs.count = 4;
|
||||||
|
|
||||||
android_system_dirs.dirs = calloc(android_system_dirs.count, sizeof(dir_rec_t));
|
android_system_dirs.dirs = (dir_rec_t*) calloc(android_system_dirs.count, sizeof(dir_rec_t));
|
||||||
if (android_system_dirs.dirs == NULL) {
|
if (android_system_dirs.dirs == NULL) {
|
||||||
ALOGE("Couldn't allocate array for dirs; aborting\n");
|
ALOGE("Couldn't allocate array for dirs; aborting\n");
|
||||||
return -1;
|
return -1;
|
||||||
@ -378,10 +378,10 @@ int initialize_globals() {
|
|||||||
android_system_dirs.dirs[1].path = build_string2(android_root_dir.path, PRIV_APP_SUBDIR);
|
android_system_dirs.dirs[1].path = build_string2(android_root_dir.path, PRIV_APP_SUBDIR);
|
||||||
android_system_dirs.dirs[1].len = strlen(android_system_dirs.dirs[1].path);
|
android_system_dirs.dirs[1].len = strlen(android_system_dirs.dirs[1].path);
|
||||||
|
|
||||||
android_system_dirs.dirs[2].path = "/vendor/app/";
|
android_system_dirs.dirs[2].path = strdup("/vendor/app/");
|
||||||
android_system_dirs.dirs[2].len = strlen(android_system_dirs.dirs[2].path);
|
android_system_dirs.dirs[2].len = strlen(android_system_dirs.dirs[2].path);
|
||||||
|
|
||||||
android_system_dirs.dirs[3].path = "/oem/app/";
|
android_system_dirs.dirs[3].path = strdup("/oem/app/");
|
||||||
android_system_dirs.dirs[3].len = strlen(android_system_dirs.dirs[3].path);
|
android_system_dirs.dirs[3].len = strlen(android_system_dirs.dirs[3].path);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
@ -192,8 +192,8 @@ int validate_apk_path(const char *path);
|
|||||||
|
|
||||||
int append_and_increment(char** dst, const char* src, size_t* dst_size);
|
int append_and_increment(char** dst, const char* src, size_t* dst_size);
|
||||||
|
|
||||||
char *build_string2(char *s1, char *s2);
|
char *build_string2(const char *s1, const char *s2);
|
||||||
char *build_string3(char *s1, char *s2, char *s3);
|
char *build_string3(const char *s1, const char *s2, const char *s3);
|
||||||
|
|
||||||
int ensure_dir(const char* path, mode_t mode, uid_t uid, gid_t gid);
|
int ensure_dir(const char* path, mode_t mode, uid_t uid, gid_t gid);
|
||||||
int ensure_media_user_dirs(userid_t userid);
|
int ensure_media_user_dirs(userid_t userid);
|
||||||
@ -227,7 +227,7 @@ int mark_boot_complete(const char *instruction_set);
|
|||||||
int movefiles();
|
int movefiles();
|
||||||
int linklib(const char* target, const char* source, int userId);
|
int linklib(const char* target, const char* source, int userId);
|
||||||
int idmap(const char *target_path, const char *overlay_path, uid_t uid);
|
int idmap(const char *target_path, const char *overlay_path, uid_t uid);
|
||||||
int restorecon_data();
|
int restorecon_data(const char* pkgName, const char* seinfo, uid_t uid);
|
||||||
int create_oat_dir(const char* oat_dir, const char *instruction_set);
|
int create_oat_dir(const char* oat_dir, const char *instruction_set);
|
||||||
int rm_package_dir(const char* apk_path);
|
int rm_package_dir(const char* apk_path);
|
||||||
int calculate_oat_file_path(char path[PKG_PATH_MAX], const char *oat_dir, const char *apk_path,
|
int calculate_oat_file_path(char path[PKG_PATH_MAX], const char *oat_dir, const char *apk_path,
|
||||||
|
@ -17,19 +17,18 @@
|
|||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define LOG_TAG "utils_test"
|
|
||||||
#include <utils/Log.h>
|
|
||||||
|
|
||||||
#include <gtest/gtest.h>
|
#include <gtest/gtest.h>
|
||||||
|
|
||||||
extern "C" {
|
|
||||||
#include "installd.h"
|
#include "installd.h"
|
||||||
}
|
|
||||||
|
#undef LOG_TAG
|
||||||
|
#define LOG_TAG "utils_test"
|
||||||
|
|
||||||
#define TEST_DATA_DIR "/data/"
|
#define TEST_DATA_DIR "/data/"
|
||||||
#define TEST_APP_DIR "/data/app/"
|
#define TEST_APP_DIR "/data/app/"
|
||||||
#define TEST_APP_PRIVATE_DIR "/data/app-private/"
|
#define TEST_APP_PRIVATE_DIR "/data/app-private/"
|
||||||
#define TEST_ASEC_DIR "/mnt/asec/"
|
#define TEST_ASEC_DIR "/mnt/asec/"
|
||||||
|
#define TEST_EXPAND_DIR "/mnt/expand/"
|
||||||
|
|
||||||
#define TEST_SYSTEM_DIR1 "/system/app/"
|
#define TEST_SYSTEM_DIR1 "/system/app/"
|
||||||
#define TEST_SYSTEM_DIR2 "/vendor/app/"
|
#define TEST_SYSTEM_DIR2 "/vendor/app/"
|
||||||
@ -49,25 +48,28 @@ namespace android {
|
|||||||
class UtilsTest : public testing::Test {
|
class UtilsTest : public testing::Test {
|
||||||
protected:
|
protected:
|
||||||
virtual void SetUp() {
|
virtual void SetUp() {
|
||||||
android_app_dir.path = TEST_APP_DIR;
|
android_app_dir.path = (char*) TEST_APP_DIR;
|
||||||
android_app_dir.len = strlen(TEST_APP_DIR);
|
android_app_dir.len = strlen(TEST_APP_DIR);
|
||||||
|
|
||||||
android_app_private_dir.path = TEST_APP_PRIVATE_DIR;
|
android_app_private_dir.path = (char*) TEST_APP_PRIVATE_DIR;
|
||||||
android_app_private_dir.len = strlen(TEST_APP_PRIVATE_DIR);
|
android_app_private_dir.len = strlen(TEST_APP_PRIVATE_DIR);
|
||||||
|
|
||||||
android_data_dir.path = TEST_DATA_DIR;
|
android_data_dir.path = (char*) TEST_DATA_DIR;
|
||||||
android_data_dir.len = strlen(TEST_DATA_DIR);
|
android_data_dir.len = strlen(TEST_DATA_DIR);
|
||||||
|
|
||||||
android_asec_dir.path = TEST_ASEC_DIR;
|
android_asec_dir.path = (char*) TEST_ASEC_DIR;
|
||||||
android_asec_dir.len = strlen(TEST_ASEC_DIR);
|
android_asec_dir.len = strlen(TEST_ASEC_DIR);
|
||||||
|
|
||||||
|
android_mnt_expand_dir.path = (char*) TEST_EXPAND_DIR;
|
||||||
|
android_mnt_expand_dir.len = strlen(TEST_EXPAND_DIR);
|
||||||
|
|
||||||
android_system_dirs.count = 2;
|
android_system_dirs.count = 2;
|
||||||
|
|
||||||
android_system_dirs.dirs = (dir_rec_t*) calloc(android_system_dirs.count, sizeof(dir_rec_t));
|
android_system_dirs.dirs = (dir_rec_t*) calloc(android_system_dirs.count, sizeof(dir_rec_t));
|
||||||
android_system_dirs.dirs[0].path = TEST_SYSTEM_DIR1;
|
android_system_dirs.dirs[0].path = (char*) TEST_SYSTEM_DIR1;
|
||||||
android_system_dirs.dirs[0].len = strlen(TEST_SYSTEM_DIR1);
|
android_system_dirs.dirs[0].len = strlen(TEST_SYSTEM_DIR1);
|
||||||
|
|
||||||
android_system_dirs.dirs[1].path = TEST_SYSTEM_DIR2;
|
android_system_dirs.dirs[1].path = (char*) TEST_SYSTEM_DIR2;
|
||||||
android_system_dirs.dirs[1].len = strlen(TEST_SYSTEM_DIR2);
|
android_system_dirs.dirs[1].len = strlen(TEST_SYSTEM_DIR2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -373,7 +375,7 @@ TEST_F(UtilsTest, CreatePkgPathInDir_ProtectedDir) {
|
|||||||
char path[PKG_PATH_MAX];
|
char path[PKG_PATH_MAX];
|
||||||
|
|
||||||
dir_rec_t dir;
|
dir_rec_t dir;
|
||||||
dir.path = "/data/app-private/";
|
dir.path = (char*) "/data/app-private/";
|
||||||
dir.len = strlen(dir.path);
|
dir.len = strlen(dir.path);
|
||||||
|
|
||||||
EXPECT_EQ(0, create_pkg_path_in_dir(path, &dir, "com.example.package", ".apk"))
|
EXPECT_EQ(0, create_pkg_path_in_dir(path, &dir, "com.example.package", ".apk"))
|
||||||
@ -432,7 +434,7 @@ TEST_F(UtilsTest, CopyAndAppend_Normal) {
|
|||||||
dir_rec_t dst;
|
dir_rec_t dst;
|
||||||
dir_rec_t src;
|
dir_rec_t src;
|
||||||
|
|
||||||
src.path = "/data/";
|
src.path = (char*) "/data/";
|
||||||
src.len = strlen(src.path);
|
src.len = strlen(src.path);
|
||||||
|
|
||||||
EXPECT_EQ(0, copy_and_append(&dst, &src, "app/"))
|
EXPECT_EQ(0, copy_and_append(&dst, &src, "app/"))
|
||||||
|
@ -61,7 +61,7 @@ int create_pkg_path(char path[PKG_PATH_MAX],
|
|||||||
userid_t userid)
|
userid_t userid)
|
||||||
{
|
{
|
||||||
size_t userid_len;
|
size_t userid_len;
|
||||||
char* userid_prefix;
|
const char* userid_prefix;
|
||||||
if (userid == 0) {
|
if (userid == 0) {
|
||||||
userid_prefix = PRIMARY_USER_PREFIX;
|
userid_prefix = PRIMARY_USER_PREFIX;
|
||||||
userid_len = 0;
|
userid_len = 0;
|
||||||
@ -106,7 +106,7 @@ int create_user_path(char path[PKG_PATH_MAX],
|
|||||||
userid_t userid)
|
userid_t userid)
|
||||||
{
|
{
|
||||||
size_t userid_len;
|
size_t userid_len;
|
||||||
char* userid_prefix;
|
const char* userid_prefix;
|
||||||
if (userid == 0) {
|
if (userid == 0) {
|
||||||
userid_prefix = PRIMARY_USER_PREFIX;
|
userid_prefix = PRIMARY_USER_PREFIX;
|
||||||
userid_len = 0;
|
userid_len = 0;
|
||||||
@ -516,7 +516,7 @@ static void* _cache_malloc(cache_t* cache, size_t len)
|
|||||||
int8_t* res = cache->curMemBlockAvail;
|
int8_t* res = cache->curMemBlockAvail;
|
||||||
int8_t* nextPos = res + len;
|
int8_t* nextPos = res + len;
|
||||||
if (cache->memBlocks == NULL || nextPos > cache->curMemBlockEnd) {
|
if (cache->memBlocks == NULL || nextPos > cache->curMemBlockEnd) {
|
||||||
int8_t* newBlock = malloc(CACHE_BLOCK_SIZE);
|
int8_t* newBlock = (int8_t*) malloc(CACHE_BLOCK_SIZE);
|
||||||
if (newBlock == NULL) {
|
if (newBlock == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@ -1000,7 +1000,7 @@ int get_path_from_string(dir_rec_t* rec, const char* path) {
|
|||||||
// Add space for slash and terminating null.
|
// Add space for slash and terminating null.
|
||||||
size_t dst_size = path_len + 2;
|
size_t dst_size = path_len + 2;
|
||||||
|
|
||||||
rec->path = malloc(dst_size);
|
rec->path = (char*) malloc(dst_size);
|
||||||
if (rec->path == NULL) {
|
if (rec->path == NULL) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1070,13 +1070,13 @@ int append_and_increment(char** dst, const char* src, size_t* dst_size) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *build_string2(char *s1, char *s2) {
|
char *build_string2(const char *s1, const char *s2) {
|
||||||
if (s1 == NULL || s2 == NULL) return NULL;
|
if (s1 == NULL || s2 == NULL) return NULL;
|
||||||
|
|
||||||
int len_s1 = strlen(s1);
|
int len_s1 = strlen(s1);
|
||||||
int len_s2 = strlen(s2);
|
int len_s2 = strlen(s2);
|
||||||
int len = len_s1 + len_s2 + 1;
|
int len = len_s1 + len_s2 + 1;
|
||||||
char *result = malloc(len);
|
char *result = (char *) malloc(len);
|
||||||
if (result == NULL) return NULL;
|
if (result == NULL) return NULL;
|
||||||
|
|
||||||
strcpy(result, s1);
|
strcpy(result, s1);
|
||||||
@ -1085,14 +1085,14 @@ char *build_string2(char *s1, char *s2) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *build_string3(char *s1, char *s2, char *s3) {
|
char *build_string3(const char *s1, const char *s2, const char *s3) {
|
||||||
if (s1 == NULL || s2 == NULL || s3 == NULL) return NULL;
|
if (s1 == NULL || s2 == NULL || s3 == NULL) return NULL;
|
||||||
|
|
||||||
int len_s1 = strlen(s1);
|
int len_s1 = strlen(s1);
|
||||||
int len_s2 = strlen(s2);
|
int len_s2 = strlen(s2);
|
||||||
int len_s3 = strlen(s3);
|
int len_s3 = strlen(s3);
|
||||||
int len = len_s1 + len_s2 + len_s3 + 1;
|
int len = len_s1 + len_s2 + len_s3 + 1;
|
||||||
char *result = malloc(len);
|
char *result = (char *) malloc(len);
|
||||||
if (result == NULL) return NULL;
|
if (result == NULL) return NULL;
|
||||||
|
|
||||||
strcpy(result, s1);
|
strcpy(result, s1);
|
Loading…
Reference in New Issue
Block a user