diff options
author | Mark Salyzyn <salyzyn@google.com> | 2015-04-16 00:10:35 +0000 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2015-04-16 00:10:35 +0000 |
commit | c130d96e9cf786d17196a400a07fb4e6e221a07c (patch) | |
tree | d8bbbb5689e9b7760b9324b84c217e3d43ae4ba9 | |
parent | a134c4145b15bc459736f4935600560fccb291fa (diff) | |
parent | e1b87e1a0ee5d9b774fde68df8593b2fdeca4bb2 (diff) | |
download | system_core-c130d96e9cf786d17196a400a07fb4e6e221a07c.zip system_core-c130d96e9cf786d17196a400a07fb4e6e221a07c.tar.gz system_core-c130d96e9cf786d17196a400a07fb4e6e221a07c.tar.bz2 |
am e1b87e1a: am 48257704: Merge "libcutils: add fs_config_generate"
* commit 'e1b87e1a0ee5d9b774fde68df8593b2fdeca4bb2':
libcutils: add fs_config_generate
-rw-r--r-- | include/private/android_filesystem_config.h | 2 | ||||
-rw-r--r-- | libcutils/fs_config.c | 21 |
2 files changed, 23 insertions, 0 deletions
diff --git a/include/private/android_filesystem_config.h b/include/private/android_filesystem_config.h index fed81f8..02fe2b5 100644 --- a/include/private/android_filesystem_config.h +++ b/include/private/android_filesystem_config.h @@ -215,6 +215,8 @@ __BEGIN_DECLS void fs_config(const char *path, int dir, unsigned *uid, unsigned *gid, unsigned *mode, uint64_t *capabilities); +ssize_t fs_config_generate(char *buffer, size_t length, const struct fs_path_config *pc); + __END_DECLS #endif diff --git a/libcutils/fs_config.c b/libcutils/fs_config.c index bdb24dc..7fd66cd 100644 --- a/libcutils/fs_config.c +++ b/libcutils/fs_config.c @@ -63,6 +63,8 @@ static inline uint64_t get8LE(const uint8_t* src) return ((uint64_t) high << 32) | (uint64_t) low; } +#define ALIGN(x, alignment) ( ((x) + ((alignment) - 1)) & ~((alignment) - 1) ) + /* Rules for directories. ** These rules are applied based on "first match", so they ** should start with the most specific path and work their @@ -261,3 +263,22 @@ void fs_config(const char *path, int dir, *mode = (*mode & (~07777)) | pc->mode; *capabilities = pc->capabilities; } + +ssize_t fs_config_generate(char *buffer, size_t length, const struct fs_path_config *pc) +{ + struct fs_path_config_from_file *p = (struct fs_path_config_from_file *)buffer; + size_t len = ALIGN(sizeof(*p) + strlen(pc->prefix) + 1, sizeof(uint64_t)); + + if ((length < len) || (len > UINT16_MAX)) { + return -ENOSPC; + } + memset(p, 0, len); + uint16_t host_len = len; + p->len = get2LE((const uint8_t *)&host_len); + p->mode = get2LE((const uint8_t *)&(pc->mode)); + p->uid = get2LE((const uint8_t *)&(pc->uid)); + p->gid = get2LE((const uint8_t *)&(pc->gid)); + p->capabilities = get8LE((const uint8_t *)&(pc->capabilities)); + strcpy(p->prefix, pc->prefix); + return len; +} |