Merge "add -f option to mkbootfs to load file perms from file" into jb-dev

This commit is contained in:
Doug Zongker 2012-05-04 16:29:44 -07:00 committed by Android (Google) Code Review
commit 0375fd133a
1 changed files with 88 additions and 2 deletions

View File

@ -3,6 +3,7 @@
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
@ -34,12 +35,47 @@ void die(const char *why, ...)
exit(1);
}
struct fs_config_entry {
char* name;
int uid, gid, mode;
};
static struct fs_config_entry* canned_config = NULL;
/* Each line in the canned file should be a path plus three ints (uid,
* gid, mode). */
#define CANNED_LINE_LENGTH (PATH_MAX+100)
static int verbose = 0;
static int total_size = 0;
static void fix_stat(const char *path, struct stat *s)
{
fs_config(path, S_ISDIR(s->st_mode), &s->st_uid, &s->st_gid, &s->st_mode);
if (canned_config) {
// Use the list of file uid/gid/modes loaded from the file
// given with -f.
struct fs_config_entry* empty_path_config = NULL;
struct fs_config_entry* p;
for (p = canned_config; p->name; ++p) {
if (!p->name[0]) {
empty_path_config = p;
}
if (strcmp(p->name, path) == 0) {
s->st_uid = p->uid;
s->st_gid = p->gid;
s->st_mode = p->mode | (s->st_mode & ~07777);
return;
}
}
s->st_uid = empty_path_config->uid;
s->st_gid = empty_path_config->gid;
s->st_mode = empty_path_config->mode | (s->st_mode & ~07777);
} else {
// Use the compiled-in fs_config() function.
fs_config(path, S_ISDIR(s->st_mode), &s->st_uid, &s->st_gid, &s->st_mode);
}
}
static void _eject(struct stat *s, char *out, int olen, char *data, unsigned datasize)
@ -79,7 +115,7 @@ static void _eject(struct stat *s, char *out, int olen, char *data, unsigned dat
total_size += 6 + 8*13 + olen + 1;
if(strlen(out) != olen) die("ACK!");
if(strlen(out) != (unsigned int)olen) die("ACK!");
while(total_size & 3) {
total_size++;
@ -235,11 +271,61 @@ void archive(const char *start, const char *prefix)
_archive_dir(in, out, strlen(in), strlen(out));
}
static void read_canned_config(char* filename)
{
int allocated = 8;
int used = 0;
canned_config =
(struct fs_config_entry*)malloc(allocated * sizeof(struct fs_config_entry));
char line[CANNED_LINE_LENGTH];
FILE* f = fopen(filename, "r");
if (f == NULL) die("failed to open canned file");
while (fgets(line, CANNED_LINE_LENGTH, f) != NULL) {
if (!line[0]) break;
if (used >= allocated) {
allocated *= 2;
canned_config = (struct fs_config_entry*)realloc(
canned_config, allocated * sizeof(struct fs_config_entry));
}
struct fs_config_entry* cc = canned_config + used;
if (isspace(line[0])) {
cc->name = strdup("");
cc->uid = atoi(strtok(line, " \n"));
} else {
cc->name = strdup(strtok(line, " \n"));
cc->uid = atoi(strtok(NULL, " \n"));
}
cc->gid = atoi(strtok(NULL, " \n"));
cc->mode = strtol(strtok(NULL, " \n"), NULL, 8);
++used;
}
if (used >= allocated) {
++allocated;
canned_config = (struct fs_config_entry*)realloc(
canned_config, allocated * sizeof(struct fs_config_entry));
}
canned_config[used].name = NULL;
fclose(f);
}
int main(int argc, char *argv[])
{
argc--;
argv++;
if (argc > 1 && strcmp(argv[0], "-f") == 0) {
read_canned_config(argv[1]);
argc -= 2;
argv += 2;
}
if(argc == 0) die("no directories to process?!");
while(argc-- > 0){