Loading cpio/mkbootfs.c +88 −2 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> Loading Loading @@ -34,13 +35,48 @@ 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) { 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) { Loading Loading @@ -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++; Loading Loading @@ -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){ Loading Loading
cpio/mkbootfs.c +88 −2 Original line number Diff line number Diff line Loading @@ -3,6 +3,7 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> #include <ctype.h> #include <sys/types.h> #include <sys/stat.h> Loading Loading @@ -34,13 +35,48 @@ 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) { 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) { Loading Loading @@ -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++; Loading Loading @@ -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){ Loading