installd.h revision d93707342a61e66bc3eb2145628158452f577f42
163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar/* 263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** 363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** Copyright 2008, The Android Open Source Project 463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** 563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** Licensed under the Apache License, Version 2.0 (the "License"); 663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** you may not use this file except in compliance with the License. 763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** You may obtain a copy of the License at 863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** 963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** http://www.apache.org/licenses/LICENSE-2.0 1063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** 1163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** Unless required by applicable law or agreed to in writing, software 1263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** distributed under the License is distributed on an "AS IS" BASIS, 1363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** See the License for the specific language governing permissions and 1563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar** limitations under the License. 1663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar*/ 1763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 1863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define LOG_TAG "installd" 1963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 2063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <stdio.h> 2163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <stdlib.h> 2263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <stdint.h> 2363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <inttypes.h> 2463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <sys/stat.h> 2563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <dirent.h> 2663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <unistd.h> 2763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <ctype.h> 2863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <fcntl.h> 2963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <errno.h> 3063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <utime.h> 3163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <sys/socket.h> 3263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <sys/types.h> 3363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <sys/wait.h> 3463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 3563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <cutils/fs.h> 3663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <cutils/sockets.h> 3763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <cutils/log.h> 3863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <cutils/properties.h> 3963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <cutils/multiuser.h> 4063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 4163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <private/android_filesystem_config.h> 4263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 4363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#if INCLUDE_SYS_MOUNT_FOR_STATFS 4463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <sys/mount.h> 4563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#else 4663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#include <sys/statfs.h> 4763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#endif 4863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 4963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define SOCKET_PATH "installd" 5063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 5163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 5263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar/* elements combined with a valid package name to form paths */ 5363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 5463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define PRIMARY_USER_PREFIX "data/" 5563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define SECONDARY_USER_PREFIX "user/" 5663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 5763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define PKG_DIR_POSTFIX "" 5863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 5963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define PKG_LIB_POSTFIX "/lib" 6063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 6163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define CACHE_DIR_POSTFIX "/cache" 6263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 6363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define APP_SUBDIR "app/" // sub-directory under ANDROID_DATA 6463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 6563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define APP_LIB_SUBDIR "app-lib/" // sub-directory under ANDROID_DATA 6663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 6763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define MEDIA_SUBDIR "media/" // sub-directory under ANDROID_DATA 6863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 6963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar/* other handy constants */ 7063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 7163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define PRIVATE_APP_SUBDIR "app-private/" // sub-directory under ANDROID_DATA 7263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 7363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define DALVIK_CACHE_PREFIX "/data/dalvik-cache/" 7463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define DALVIK_CACHE_POSTFIX "/classes.dex" 7563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 7663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define UPDATE_COMMANDS_DIR_PREFIX "/system/etc/updatecmds/" 7763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 7863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define IDMAP_PREFIX "/data/resource-cache/" 7963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define IDMAP_SUFFIX "@idmap" 8063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 8163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define PKG_NAME_MAX 128 /* largest allowed package name */ 8263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar#define PKG_PATH_MAX 256 /* max size of any path we use */ 8363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 8463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar/* data structures */ 8563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 8663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyartypedef struct { 8763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar char* path; 8863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar size_t len; 8963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar} dir_rec_t; 9063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 9163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyartypedef struct { 9263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar size_t count; 9363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar dir_rec_t* dirs; 9463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar} dir_rec_array_t; 9563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 9663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarextern dir_rec_t android_app_dir; 9763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarextern dir_rec_t android_app_private_dir; 9863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarextern dir_rec_t android_app_lib_dir; 9963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarextern dir_rec_t android_data_dir; 10063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarextern dir_rec_t android_asec_dir; 10163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarextern dir_rec_t android_media_dir; 10263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarextern dir_rec_array_t android_system_dirs; 10363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 10463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyartypedef struct cache_dir_struct { 10563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar struct cache_dir_struct* parent; 10663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar int32_t childCount; 10763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar int32_t hiddenCount; 10863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar int32_t deleted; 10963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar char name[]; 11063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar} cache_dir_t; 11163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 11263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyartypedef struct { 11363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar cache_dir_t* dir; 11463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar time_t modTime; 11563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar char name[]; 11663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar} cache_file_t; 11763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 11863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyartypedef struct { 11963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar size_t numDirs; 12063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar size_t availDirs; 12163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar cache_dir_t** dirs; 12263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar size_t numFiles; 12363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar size_t availFiles; 12463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar cache_file_t** files; 12563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar size_t numCollected; 12663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar void* memBlocks; 12763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar int8_t* curMemBlockAvail; 12863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar int8_t* curMemBlockEnd; 12963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar} cache_t; 13063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 13163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar/* util.c */ 13263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 13363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint create_pkg_path_in_dir(char path[PKG_PATH_MAX], 13463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar const dir_rec_t* dir, 13563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar const char* pkgname, 13663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar const char* postfix); 13763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 13863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint create_pkg_path(char path[PKG_PATH_MAX], 13963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar const char *pkgname, 14063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar const char *postfix, 14163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar userid_t userid); 14263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 14363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint create_user_path(char path[PKG_PATH_MAX], 14463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar userid_t userid); 14563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 14663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint create_user_media_path(char path[PKG_PATH_MAX], userid_t userid); 14763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 14863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint create_move_path(char path[PKG_PATH_MAX], 14963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar const char* pkgname, 15063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar const char* leaf, 15163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar userid_t userid); 15263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 15363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint is_valid_package_name(const char* pkgname); 15463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 15563d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint create_cache_path(char path[PKG_PATH_MAX], const char *src); 15663d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 15763d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint delete_dir_contents(const char *pathname, 15863d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar int also_delete_dir, 15963d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar const char *ignore); 16063d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 16163d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint delete_dir_contents_fd(int dfd, const char *name); 16263d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 16363d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyarint lookup_media_dir(char basepath[PATH_MAX], const char *dir); 16463d478953393b1a2ea3b68d298b1d5fc64542e7bYigit Boyar 165int64_t data_disk_free(); 166 167cache_t* start_cache_collection(); 168 169void add_cache_files(cache_t* cache, const char *basepath, const char *cachedir); 170 171void clear_cache_files(cache_t* cache, int64_t free_size); 172 173void finish_cache_collection(cache_t* cache); 174 175int validate_system_app_path(const char* path); 176 177int get_path_from_env(dir_rec_t* rec, const char* var); 178 179int get_path_from_string(dir_rec_t* rec, const char* path); 180 181int copy_and_append(dir_rec_t* dst, const dir_rec_t* src, const char* suffix); 182 183int validate_apk_path(const char *path); 184 185int append_and_increment(char** dst, const char* src, size_t* dst_size); 186 187char *build_string2(char *s1, char *s2); 188char *build_string3(char *s1, char *s2, char *s3); 189 190int ensure_dir(const char* path, mode_t mode, uid_t uid, gid_t gid); 191int ensure_media_user_dirs(userid_t userid); 192int create_profile_file(const char *pkgname, gid_t gid); 193void remove_profile_file(const char *pkgname); 194 195/* commands.c */ 196 197int install(const char *pkgname, uid_t uid, gid_t gid, const char *seinfo); 198int uninstall(const char *pkgname, userid_t userid); 199int renamepkg(const char *oldpkgname, const char *newpkgname); 200int fix_uid(const char *pkgname, uid_t uid, gid_t gid); 201int delete_user_data(const char *pkgname, userid_t userid); 202int make_user_data(const char *pkgname, uid_t uid, userid_t userid, const char* seinfo); 203int delete_user(userid_t userid); 204int delete_cache(const char *pkgname, userid_t userid); 205int move_dex(const char *src, const char *dst); 206int rm_dex(const char *path); 207int protect(char *pkgname, gid_t gid); 208int get_size(const char *pkgname, userid_t userid, const char *apkpath, const char *libdirpath, 209 const char *fwdlock_apkpath, const char *asecpath, int64_t *codesize, 210 int64_t *datasize, int64_t *cachesize, int64_t *asecsize); 211int free_cache(int64_t free_size); 212int dexopt(const char *apk_path, uid_t uid, int is_public, const char *pkgName); 213int movefiles(); 214int linklib(const char* target, const char* source, int userId); 215int idmap(const char *target_path, const char *overlay_path, uid_t uid); 216