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