Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5d9e5efb authored by Mark Salyzyn's avatar Mark Salyzyn
Browse files

libcutils: add fs_config_generate

Bug: 19908228
Change-Id: Icb0e189a86758bb779b9bdf7c0d92216d297869f
parent 68651148
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -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
+21 −0
Original line number Diff line number Diff line
@@ -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;
}