installd.h revision f62d2851a83f6976e22932e09c35013a6bb0c3f3
15fd6d3161cc7407718c7e230f94db421543273b8Kenny Root/*
25fd6d3161cc7407718c7e230f94db421543273b8Kenny Root**
35fd6d3161cc7407718c7e230f94db421543273b8Kenny Root** Copyright 2008, The Android Open Source Project
45fd6d3161cc7407718c7e230f94db421543273b8Kenny Root**
55fd6d3161cc7407718c7e230f94db421543273b8Kenny Root** Licensed under the Apache License, Version 2.0 (the "License");
65fd6d3161cc7407718c7e230f94db421543273b8Kenny Root** you may not use this file except in compliance with the License.
75fd6d3161cc7407718c7e230f94db421543273b8Kenny Root** You may obtain a copy of the License at
85fd6d3161cc7407718c7e230f94db421543273b8Kenny Root**
95fd6d3161cc7407718c7e230f94db421543273b8Kenny Root**     http://www.apache.org/licenses/LICENSE-2.0
105fd6d3161cc7407718c7e230f94db421543273b8Kenny Root**
115fd6d3161cc7407718c7e230f94db421543273b8Kenny Root** Unless required by applicable law or agreed to in writing, software
125fd6d3161cc7407718c7e230f94db421543273b8Kenny Root** distributed under the License is distributed on an "AS IS" BASIS,
135fd6d3161cc7407718c7e230f94db421543273b8Kenny Root** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
145fd6d3161cc7407718c7e230f94db421543273b8Kenny Root** See the License for the specific language governing permissions and
155fd6d3161cc7407718c7e230f94db421543273b8Kenny Root** limitations under the License.
165fd6d3161cc7407718c7e230f94db421543273b8Kenny Root*/
175fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
185fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define LOG_TAG "installd"
195fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
205fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <stdio.h>
215fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <stdlib.h>
225fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <stdint.h>
235fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <inttypes.h>
245fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <sys/stat.h>
255fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <dirent.h>
265fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <unistd.h>
275fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <ctype.h>
285fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <fcntl.h>
295fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <errno.h>
305fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <utime.h>
315fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <sys/socket.h>
325fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <sys/types.h>
335fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <sys/wait.h>
345fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
355fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <cutils/fs.h>
365fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <cutils/sockets.h>
375fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <cutils/log.h>
385fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <cutils/properties.h>
395fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <cutils/multiuser.h>
40e470637963d50a324984bd11da04a60fc6980c12Kenny Root
41e470637963d50a324984bd11da04a60fc6980c12Kenny Root#include <private/android_filesystem_config.h>
42e470637963d50a324984bd11da04a60fc6980c12Kenny Root
435fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#if INCLUDE_SYS_MOUNT_FOR_STATFS
44e470637963d50a324984bd11da04a60fc6980c12Kenny Root#include <sys/mount.h>
455fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#else
465fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#include <sys/statfs.h>
475fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#endif
485fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
495fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define SOCKET_PATH "installd"
505fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
515fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
525fd6d3161cc7407718c7e230f94db421543273b8Kenny Root/* elements combined with a valid package name to form paths */
535fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
545fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define PRIMARY_USER_PREFIX    "data/"
555fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define SECONDARY_USER_PREFIX  "user/"
565fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
575fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define PKG_DIR_POSTFIX        ""
585fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
595fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define PKG_LIB_POSTFIX        "/lib"
605fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
615fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define CACHE_DIR_POSTFIX      "/cache"
625fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
635fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define APP_SUBDIR             "app/" // sub-directory under ANDROID_DATA
645fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
655fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define APP_LIB_SUBDIR         "app-lib/" // sub-directory under ANDROID_DATA
665fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
675fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define MEDIA_SUBDIR           "media/" // sub-directory under ANDROID_DATA
685fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
695fd6d3161cc7407718c7e230f94db421543273b8Kenny Root/* other handy constants */
705fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
715fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define PRIVATE_APP_SUBDIR     "app-private/" // sub-directory under ANDROID_DATA
725fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
735fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define DALVIK_CACHE_PREFIX    "/data/dalvik-cache/"
745fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define DALVIK_CACHE_POSTFIX   "/classes.dex"
755fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
765fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define UPDATE_COMMANDS_DIR_PREFIX  "/system/etc/updatecmds/"
775fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
785fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define PKG_NAME_MAX  128   /* largest allowed package name */
795fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define PKG_PATH_MAX  256   /* max size of any path we use */
805fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
815fd6d3161cc7407718c7e230f94db421543273b8Kenny Root#define PER_USER_RANGE ((uid_t)100000)   /* range of uids per user
825fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                                            uid = persona * PER_USER_RANGE + appid */
835fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
845fd6d3161cc7407718c7e230f94db421543273b8Kenny Root/* data structures */
855fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
865fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottypedef struct {
875fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    char* path;
885fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    size_t len;
895fd6d3161cc7407718c7e230f94db421543273b8Kenny Root} dir_rec_t;
905fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
915fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottypedef struct {
925fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    size_t count;
935fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    dir_rec_t* dirs;
945fd6d3161cc7407718c7e230f94db421543273b8Kenny Root} dir_rec_array_t;
955fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
965fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootextern dir_rec_t android_app_dir;
975fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootextern dir_rec_t android_app_private_dir;
985fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootextern dir_rec_t android_app_lib_dir;
995fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootextern dir_rec_t android_data_dir;
1005fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootextern dir_rec_t android_asec_dir;
1015fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootextern dir_rec_t android_media_dir;
1025fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootextern dir_rec_array_t android_system_dirs;
1035fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1045fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottypedef struct cache_dir_struct {
1055fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    struct cache_dir_struct* parent;
1065fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    int32_t childCount;
1075fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    int32_t hiddenCount;
1085fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    int32_t deleted;
1095fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    char name[];
1105fd6d3161cc7407718c7e230f94db421543273b8Kenny Root} cache_dir_t;
1115fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1125fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottypedef struct {
1135fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    cache_dir_t* dir;
1145fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    time_t modTime;
1155fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    char name[];
1165fd6d3161cc7407718c7e230f94db421543273b8Kenny Root} cache_file_t;
1175fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1185fd6d3161cc7407718c7e230f94db421543273b8Kenny Roottypedef struct {
1195fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    size_t numDirs;
1205fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    size_t availDirs;
1215fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    cache_dir_t** dirs;
1225fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    size_t numFiles;
1235fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    size_t availFiles;
1245fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    cache_file_t** files;
1255fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    size_t numCollected;
1265fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    void* memBlocks;
1275fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    int8_t* curMemBlockAvail;
1285fd6d3161cc7407718c7e230f94db421543273b8Kenny Root    int8_t* curMemBlockEnd;
1295fd6d3161cc7407718c7e230f94db421543273b8Kenny Root} cache_t;
1305fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1315fd6d3161cc7407718c7e230f94db421543273b8Kenny Root/* util.c */
1325fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1335fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint create_pkg_path_in_dir(char path[PKG_PATH_MAX],
1345fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                                const dir_rec_t* dir,
1355fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                                const char* pkgname,
1365fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                                const char* postfix);
1375fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1385fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint create_pkg_path(char path[PKG_PATH_MAX],
1395fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                    const char *pkgname,
1405fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                    const char *postfix,
1415fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                    uid_t persona);
1425fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1435fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint create_persona_path(char path[PKG_PATH_MAX],
1445fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                    uid_t persona);
1455fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1465fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint create_persona_media_path(char path[PKG_PATH_MAX], userid_t userid);
1475fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1485fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint create_move_path(char path[PKG_PATH_MAX],
1495fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                     const char* pkgname,
1505fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                     const char* leaf,
1515fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                     uid_t persona);
1525fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1535fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint is_valid_package_name(const char* pkgname);
1545fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1555fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint create_cache_path(char path[PKG_PATH_MAX], const char *src);
1565fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1575fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint delete_dir_contents(const char *pathname,
1585fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                        int also_delete_dir,
1595fd6d3161cc7407718c7e230f94db421543273b8Kenny Root                        const char *ignore);
1605fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1615fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint delete_dir_contents_fd(int dfd, const char *name);
1625fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1635fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint lookup_media_dir(char basepath[PATH_MAX], const char *dir);
1645fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1655fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint64_t data_disk_free();
1665fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1675fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootcache_t* start_cache_collection();
1685fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1695fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootvoid add_cache_files(cache_t* cache, const char *basepath, const char *cachedir);
1705fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1715fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootvoid clear_cache_files(cache_t* cache, int64_t free_size);
1725fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1735fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootvoid finish_cache_collection(cache_t* cache);
1745fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1755fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint validate_system_app_path(const char* path);
1765fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1775fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint get_path_from_env(dir_rec_t* rec, const char* var);
1785fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1795fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint get_path_from_string(dir_rec_t* rec, const char* path);
1805fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1815fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint copy_and_append(dir_rec_t* dst, const dir_rec_t* src, const char* suffix);
1825fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1835fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint validate_apk_path(const char *path);
1845fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1855fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint append_and_increment(char** dst, const char* src, size_t* dst_size);
1865fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1875fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootchar *build_string2(char *s1, char *s2);
1885fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootchar *build_string3(char *s1, char *s2, char *s3);
1895fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1905fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint ensure_dir(const char* path, mode_t mode, uid_t uid, gid_t gid);
1915fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint ensure_media_user_dirs(userid_t userid);
1925fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1935fd6d3161cc7407718c7e230f94db421543273b8Kenny Root/* commands.c */
1945fd6d3161cc7407718c7e230f94db421543273b8Kenny Root
1955fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint install(const char *pkgname, uid_t uid, gid_t gid);
1965fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint uninstall(const char *pkgname, uid_t persona);
1975fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint renamepkg(const char *oldpkgname, const char *newpkgname);
1985fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint fix_uid(const char *pkgname, uid_t uid, gid_t gid);
1995fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint delete_user_data(const char *pkgname, uid_t persona);
2005fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint make_user_data(const char *pkgname, uid_t uid, uid_t persona);
2015fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint delete_persona(uid_t persona);
2025fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint delete_cache(const char *pkgname, uid_t persona);
2035fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint move_dex(const char *src, const char *dst);
2045fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint rm_dex(const char *path);
2055fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint protect(char *pkgname, gid_t gid);
2065fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint get_size(const char *pkgname, int persona, const char *apkpath, const char *fwdlock_apkpath,
2075fd6d3161cc7407718c7e230f94db421543273b8Kenny Root             const char *asecpath, int64_t *codesize, int64_t *datasize, int64_t *cachesize,
2085fd6d3161cc7407718c7e230f94db421543273b8Kenny Root             int64_t *asecsize);
2095fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint free_cache(int64_t free_size);
2105fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint dexopt(const char *apk_path, uid_t uid, int is_public);
2115fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint movefiles();
2125fd6d3161cc7407718c7e230f94db421543273b8Kenny Rootint linklib(const char* target, const char* source, int userId);
2135fd6d3161cc7407718c7e230f94db421543273b8Kenny Root