diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2015-04-02 00:03:47 -0700 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2015-04-02 00:03:47 -0700 |
commit | fa3be045a68eb6874f31f43a0ce79a8183cdde6d (patch) | |
tree | 2d76562474009d9d7964e98ed9040bc7988f6b5f | |
parent | 82f8a71a45eebd7637fe822447b9936e31cc7185 (diff) | |
download | bluez-fa3be045a68eb6874f31f43a0ce79a8183cdde6d.tar.gz |
tools: Add simple utility for creating CPIO / initramfs images
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile.tools | 1 | ||||
-rw-r--r-- | tools/create-image.c | 204 |
3 files changed, 206 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore index 9fca46c4c..5173c3a76 100644 --- a/.gitignore +++ b/.gitignore @@ -81,6 +81,7 @@ tools/obexctl tools/gatt-service tools/btgatt-client tools/btgatt-server +tools/create-image tools/test-runner tools/check-selftest tools/mcaptest diff --git a/Makefile.tools b/Makefile.tools index 7eefecc16..b8dd90a4b 100644 --- a/Makefile.tools +++ b/Makefile.tools @@ -226,6 +226,7 @@ noinst_PROGRAMS += tools/bdaddr tools/avinfo tools/avtest \ tools/btiotest tools/bneptest tools/mcaptest \ tools/cltest tools/oobtest tools/seq2bseq \ tools/ibeacon tools/btgatt-client tools/btgatt-server \ + tools/create-image \ tools/test-runner tools/check-selftest tools_bdaddr_SOURCES = tools/bdaddr.c src/oui.h src/oui.c diff --git a/tools/create-image.c b/tools/create-image.c new file mode 100644 index 000000000..c2342790a --- /dev/null +++ b/tools/create-image.c @@ -0,0 +1,204 @@ +/* + * + * BlueZ - Bluetooth protocol stack for Linux + * + * Copyright (C) 2012-2014 Intel Corporation. All rights reserved. + * + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <stdio.h> +#include <fcntl.h> +#include <unistd.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> +#include <sys/stat.h> +#include <sys/mman.h> +#include <sys/param.h> + +/* + * The "new" ASCII format uses 8-byte hexadecimal fields for all numbers and + * separates device numbers into separate fields for major and minor numbers. + * + * struct cpio_newc_header { + * char c_magic[6]; + * char c_ino[8]; + * char c_mode[8]; + * char c_uid[8]; + * char c_gid[8]; + * char c_nlink[8]; + * char c_mtime[8]; + * char c_filesize[8]; + * char c_devmajor[8]; + * char c_devminor[8]; + * char c_rdevmajor[8]; + * char c_rdevminor[8]; + * char c_namesize[8]; + * char c_check[8]; + * }; + * + */ + +#define HDR_FMT "%s%08X%08X%08X%08X%08X%08X%08zX%08X%08X%08X%08X%08X%08X%s" + +#define HDR_MAGIC "070701" + +static unsigned int ino_cnt = 721; + +#define REG_EXE S_IFREG | \ + S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH + +static const struct { + const char *source; + const char *target; + mode_t mode; +} file_list[] = { + { "tools/test-runner", "init", REG_EXE }, + { } +}; + +static void write_block(FILE *fp, const char *pathname, unsigned int ino, + mode_t mode, const char *name) +{ + int i, pad, namelen = strlen(name); + struct stat st; + void *map; + int fd; + + if (!pathname) { + fd = -1; + map = NULL; + st.st_size = 0; + goto done; + } + + fd = open(pathname, O_RDONLY | O_CLOEXEC); + if (fd < 0) { + fd = -1; + map = NULL; + st.st_size = 0; + goto done; + } + + if (fstat(fd, &st) < 0) { + close(fd); + fd = -1; + map = NULL; + st.st_size = 0; + goto done; + } + + map = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (!map || map == MAP_FAILED) { + close(fd); + fd = -1; + map = NULL; + st.st_size = 0; + } + +done: + fprintf(fp, HDR_FMT, HDR_MAGIC, ino, mode, 0, 0, 1, 0, + st.st_size, 0, 0, 0, 0, namelen + 1, 0, name); + + pad = 4 - ((110 + namelen) % 4); + for (i = 0; i < pad; i++) + fputc(0, fp); + + if (st.st_size > 0) { + fwrite(map, st.st_size, 1, fp); + + pad = 3 - ((st.st_size + 3) % 4); + for (i = 0; i < pad; i++) + fputc(0, fp); + + munmap(map, st.st_size); + close(fd); + } +} + +static void usage(void) +{ + printf("create-image - CPIO image creation utility\n" + "Usage:\n"); + printf("\tcreate-image [options]\n"); + printf("Options:\n" + "\t-o, --output <image> Output CPIO image\n" + "\t-h, --help Show help options\n"); +} + +static const struct option main_options[] = { + { "output", required_argument, NULL, 'o' }, + { "version", no_argument, NULL, 'v' }, + { "help", no_argument, NULL, 'h' }, + { } +}; + +int main(int argc, char *argv[]) +{ + const char *output_pathname = NULL; + FILE *fp; + int i; + + for (;;) { + int opt; + + opt = getopt_long(argc, argv, "o:vh", main_options, NULL); + if (opt < 0) + break; + + switch (opt) { + case 'o': + output_pathname = optarg; + break; + case 'v': + printf("%s\n", VERSION); + return EXIT_SUCCESS; + case 'h': + usage(); + return EXIT_SUCCESS; + default: + return EXIT_FAILURE; + } + } + + if (argc - optind > 0) { + fprintf(stderr, "Invalid command line parameters\n"); + return EXIT_FAILURE; + } + + if (!output_pathname) { + fprintf(stderr, "Failed to specify output file\n"); + return EXIT_FAILURE; + } + + fp = fopen(output_pathname, "we"); + + for (i = 0; file_list[i].source; i++) + write_block(fp, file_list[i].source, ino_cnt++, + file_list[i].mode, file_list[i].target); + + write_block(fp, NULL, ino_cnt++, 0, "TRAILER!!!"); + + fclose(fp); + + return EXIT_SUCCESS; +} |