tools: create a new tool for more efficient jffs2 padding
SVN-Revision: 27355
This commit is contained in:
		| @@ -16,7 +16,7 @@ tools-$(CONFIG_GCC_VERSION_4_5) += mpc libelf | |||||||
| endif | endif | ||||||
| tools-y += m4 libtool autoconf automake flex bison pkg-config sed mklibs | tools-y += m4 libtool autoconf automake flex bison pkg-config sed mklibs | ||||||
| tools-y += sstrip ipkg-utils genext2fs e2fsprogs mtd-utils mkimage | tools-y += sstrip ipkg-utils genext2fs e2fsprogs mtd-utils mkimage | ||||||
| tools-y += firmware-utils patch-cmdline quilt yaffs2 flock | tools-y += firmware-utils patch-cmdline quilt yaffs2 flock padjffs2 | ||||||
| tools-y += mm-macros xorg-macros xfce-macros missing-macros xz cmake | tools-y += mm-macros xorg-macros xfce-macros missing-macros xz cmake | ||||||
| tools-$(CONFIG_TARGET_orion_generic) += wrt350nv2-builder upslug2 | tools-$(CONFIG_TARGET_orion_generic) += wrt350nv2-builder upslug2 | ||||||
| tools-$(CONFIG_TARGET_x86) += qemu | tools-$(CONFIG_TARGET_x86) += qemu | ||||||
|   | |||||||
							
								
								
									
										36
									
								
								tools/padjffs2/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								tools/padjffs2/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,36 @@ | |||||||
|  | # | ||||||
|  | # Copyright (C) 2011 OpenWrt.org | ||||||
|  | # | ||||||
|  | # This is free software, licensed under the GNU General Public License v2. | ||||||
|  | # See /LICENSE for more information. | ||||||
|  | # | ||||||
|  |  | ||||||
|  | include $(TOPDIR)/rules.mk | ||||||
|  |  | ||||||
|  | PKG_NAME:=padjffs2 | ||||||
|  | PKG_VERSION:=1 | ||||||
|  |  | ||||||
|  | include $(INCLUDE_DIR)/host-build.mk | ||||||
|  |  | ||||||
|  | define Host/Prepare | ||||||
|  | 	mkdir -p $(HOST_BUILD_DIR) | ||||||
|  | 	$(CP) ./src/* $(HOST_BUILD_DIR)/ | ||||||
|  | 	find $(HOST_BUILD_DIR) -name .svn | $(XARGS) rm -rf | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Host/Configure | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Host/Compile | ||||||
|  | 	$(MAKE) CC="$(HOSTCC)" -C $(HOST_BUILD_DIR) | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Host/Install | ||||||
|  | 	$(CP) $(HOST_BUILD_DIR)/padjffs2 $(STAGING_DIR_HOST)/bin/ | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | define Host/Clean | ||||||
|  | 	rm -f $(STAGING_DIR_HOST)/bin/padjffs2 | ||||||
|  | endef | ||||||
|  |  | ||||||
|  | $(eval $(call HostBuild)) | ||||||
							
								
								
									
										15
									
								
								tools/padjffs2/src/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								tools/padjffs2/src/Makefile
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | CC = gcc | ||||||
|  | CFLAGS = | ||||||
|  | WFLAGS = -Wall -Werror | ||||||
|  | padjffs2-objs = padjffs2.o | ||||||
|  |  | ||||||
|  | all: padjffs2 | ||||||
|  |  | ||||||
|  | %.o: %.c | ||||||
|  | 	$(CC) $(CFLAGS) $(WFLAGS) -c -o $@ $< | ||||||
|  |  | ||||||
|  | padjffs2: $(padjffs2-objs) | ||||||
|  | 	$(CC) -o $@ $(padjffs2-objs) | ||||||
|  |  | ||||||
|  | clean: | ||||||
|  | 	rm -f padjffs2 *.o | ||||||
							
								
								
									
										155
									
								
								tools/padjffs2/src/padjffs2.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								tools/padjffs2/src/padjffs2.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,155 @@ | |||||||
|  | /* | ||||||
|  |  * Copyright (C) 2011 Gabor Juhos <juhosg@openwrt.org> | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or modify it | ||||||
|  |  * under the terms of the GNU General Public License version 2 as published | ||||||
|  |  * by the Free Software Foundation. | ||||||
|  |  * | ||||||
|  |  */ | ||||||
|  |  | ||||||
|  | #include <errno.h> | ||||||
|  | #include <fcntl.h> | ||||||
|  | #include <libgen.h> | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdint.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <unistd.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <sys/stat.h> | ||||||
|  |  | ||||||
|  | static char *progname; | ||||||
|  | static unsigned char eof_mark[4] = {0xde, 0xad, 0xc0, 0xde}; | ||||||
|  |  | ||||||
|  | #define ERR(fmt, ...) do { \ | ||||||
|  | 	fflush(0); \ | ||||||
|  | 	fprintf(stderr, "[%s] *** error: " fmt "\n", \ | ||||||
|  | 			progname, ## __VA_ARGS__ ); \ | ||||||
|  | } while (0) | ||||||
|  |  | ||||||
|  | #define ERRS(fmt, ...) do { \ | ||||||
|  | 	int save = errno; \ | ||||||
|  | 	fflush(0); \ | ||||||
|  | 	fprintf(stderr, "[%s] *** error: " fmt ", %s\n", \ | ||||||
|  | 			progname, ## __VA_ARGS__, strerror(save)); \ | ||||||
|  | } while (0) | ||||||
|  |  | ||||||
|  | #define BUF_SIZE	(64 * 1024) | ||||||
|  | #define ALIGN(_x,_y)	(((_x) + ((_y) - 1)) & ~((_y) - 1)) | ||||||
|  |  | ||||||
|  | static int pad_image(char *name, uint32_t pad_mask) | ||||||
|  | { | ||||||
|  | 	char *buf; | ||||||
|  | 	int fd; | ||||||
|  | 	ssize_t in_len; | ||||||
|  | 	ssize_t out_len; | ||||||
|  | 	int ret = -1; | ||||||
|  |  | ||||||
|  | 	buf = malloc(BUF_SIZE); | ||||||
|  | 	if (!buf) { | ||||||
|  | 		ERR("No memory for buffer"); | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	fd = open(name, O_RDWR); | ||||||
|  | 	if (fd < 0) { | ||||||
|  | 		ERRS("Unable to open %s", name); | ||||||
|  | 		goto free_buf; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	in_len = lseek(fd, 0, SEEK_END); | ||||||
|  | 	if (in_len < 0) | ||||||
|  | 		goto close; | ||||||
|  |  | ||||||
|  | 	memset(buf, '\xff', BUF_SIZE); | ||||||
|  |  | ||||||
|  | 	out_len = in_len; | ||||||
|  | 	while (pad_mask) { | ||||||
|  | 		uint32_t mask; | ||||||
|  | 		ssize_t t; | ||||||
|  | 		int i; | ||||||
|  |  | ||||||
|  | 		for (i = 10; i < 32; i++) { | ||||||
|  | 			mask = 1UL << i; | ||||||
|  | 			if (pad_mask & mask) | ||||||
|  | 				break; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		in_len = ALIGN(in_len, mask); | ||||||
|  |  | ||||||
|  | 		for (i = 10; i < 32; i++) { | ||||||
|  | 			mask = 1UL << i; | ||||||
|  | 			if ((in_len & (mask - 1)) == 0) | ||||||
|  | 				pad_mask &= ~mask; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		printf("padding image to %08x\n", in_len); | ||||||
|  |  | ||||||
|  | 		while (out_len < in_len) { | ||||||
|  | 			ssize_t len; | ||||||
|  |  | ||||||
|  | 			len = in_len - out_len; | ||||||
|  | 			if (len > BUF_SIZE) | ||||||
|  | 				len = BUF_SIZE; | ||||||
|  |  | ||||||
|  | 			t = write(fd, buf, len); | ||||||
|  | 			if (t != len) { | ||||||
|  | 				ERRS("Unable to write to %s", name); | ||||||
|  | 				goto close; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			out_len += len; | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		/* write out the JFFS end-of-filesystem marker */ | ||||||
|  | 		t = write(fd, eof_mark, 4); | ||||||
|  | 		if (t != 4) { | ||||||
|  | 			ERRS("Unable to write to %s", name); | ||||||
|  | 			goto close; | ||||||
|  | 		} | ||||||
|  | 		out_len += 4; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	ret = 0; | ||||||
|  |  | ||||||
|  | close: | ||||||
|  | 	close(fd); | ||||||
|  | free_buf: | ||||||
|  | 	free(buf); | ||||||
|  | out: | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | int main(int argc, char* argv[]) | ||||||
|  | { | ||||||
|  | 	uint32_t pad_mask; | ||||||
|  | 	int ret = EXIT_FAILURE; | ||||||
|  | 	int err; | ||||||
|  | 	int i; | ||||||
|  |  | ||||||
|  | 	progname = basename(argv[0]); | ||||||
|  |  | ||||||
|  | 	if (argc < 2) { | ||||||
|  | 		fprintf(stderr, | ||||||
|  | 			"Usage: %s file [pad0] [pad1] [padN]\n", | ||||||
|  | 			progname); | ||||||
|  | 		goto out; | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	pad_mask = 0; | ||||||
|  | 	for (i = 2; i < argc; i++) | ||||||
|  | 		pad_mask |= strtoul(argv[i], NULL, 0) * 1024; | ||||||
|  |  | ||||||
|  | 	if (pad_mask == 0) | ||||||
|  | 		pad_mask = (4 * 1024) | (8 * 1024) | (64 * 1024) | | ||||||
|  | 			   (128 * 1024); | ||||||
|  |  | ||||||
|  | 	err = pad_image(argv[1], pad_mask); | ||||||
|  | 	if (err) | ||||||
|  | 		goto out; | ||||||
|  |  | ||||||
|  | 	ret = EXIT_SUCCESS; | ||||||
|  |  | ||||||
|  | out: | ||||||
|  | 	return ret; | ||||||
|  | } | ||||||
		Reference in New Issue
	
	Block a user
	 Gabor Juhos
					Gabor Juhos