[PATCH] Add flash_lock and flash_unlock applets.

Thierry Reding thierry.reding at avionic-design.de
Wed May 20 07:46:34 UTC 2009


Signed-off-by: Thierry Reding <thierry.reding at avionic-design.de>
---
 include/applets.h        |    2 +
 include/usage.h          |   10 ++++++
 miscutils/Config.in      |   14 ++++++++
 miscutils/Kbuild         |    2 +
 miscutils/flash_lock.c   |   80 ++++++++++++++++++++++++++++++++++++++++++++++
 miscutils/flash_unlock.c |   56 ++++++++++++++++++++++++++++++++
 6 files changed, 164 insertions(+), 0 deletions(-)
 create mode 100644 miscutils/flash_lock.c
 create mode 100644 miscutils/flash_unlock.c

diff --git a/include/applets.h b/include/applets.h
index 91f92e6..783ab5a 100644
--- a/include/applets.h
+++ b/include/applets.h
@@ -155,6 +155,8 @@ IF_FDISK(APPLET(fdisk, _BB_DIR_SBIN, _BB_SUID_NEVER))
 IF_FEATURE_GREP_FGREP_ALIAS(APPLET_ODDNAME(fgrep, grep, _BB_DIR_BIN, _BB_SUID_NEVER, fgrep))
 IF_FIND(APPLET_NOEXEC(find, find, _BB_DIR_USR_BIN, _BB_SUID_NEVER, find))
 IF_FINDFS(APPLET(findfs, _BB_DIR_SBIN, _BB_SUID_MAYBE))
+IF_FLASH_LOCK(APPLET(flash_lock, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
+IF_FLASH_UNLOCK(APPLET(flash_unlock, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
 IF_FLASH_ERASEALL(APPLET(flash_eraseall, _BB_DIR_USR_SBIN, _BB_SUID_NEVER))
 IF_FOLD(APPLET(fold, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
 IF_FREE(APPLET(free, _BB_DIR_USR_BIN, _BB_SUID_NEVER))
diff --git a/include/usage.h b/include/usage.h
index 1e327fb..45b2ac7 100644
--- a/include/usage.h
+++ b/include/usage.h
@@ -1248,6 +1248,16 @@
        "$ find / -name passwd\n" \
        "/etc/passwd\n"
 
+#define flash_lock_trivial_usage \
+       "MTD_DEVICE"
+#define flash_lock_full_usage "\n\n" \
+       "lock an MTD device"
+
+#define flash_unlock_trivial_usage \
+       "MTD_DEVICE"
+#define flash_unlock_full_usage "\n\n" \
+       "unlock an MTD device"
+
 #define flash_eraseall_trivial_usage \
        "[-jq] MTD_DEVICE"
 #define flash_eraseall_full_usage "\n\n" \
diff --git a/miscutils/Config.in b/miscutils/Config.in
index 7feaf4a..06ff51a 100644
--- a/miscutils/Config.in
+++ b/miscutils/Config.in
@@ -250,6 +250,20 @@ config FBSPLASH
 	    "NN" (ASCII decimal number) - percentage to show on progress bar
 	    "exit" - well you guessed it
 
+config FLASH_LOCK
+	bool "flash_lock"
+	default n
+	help
+	  The flash_lock binary from mtd-utils as of git head 5ec0c10d0. This
+	  utility locks part or all of the flash device.
+
+config FLASH_UNLOCK
+	bool "flash_unlock"
+	default n
+	help
+	  The flash_unlock binary from mtd-utils as of git head 5ec0c10d0. This
+	  utility unlocks part or all of the flash device.
+
 config FLASH_ERASEALL
 	bool "flash_eraseall"
 	default n
diff --git a/miscutils/Kbuild b/miscutils/Kbuild
index 23d7d8d..3098029 100644
--- a/miscutils/Kbuild
+++ b/miscutils/Kbuild
@@ -16,6 +16,8 @@ lib-$(CONFIG_DEVFSD)      += devfsd.o
 lib-$(CONFIG_DEVMEM)      += devmem.o
 lib-$(CONFIG_EJECT)       += eject.o
 lib-$(CONFIG_FBSPLASH)    += fbsplash.o
+lib-$(CONFIG_FLASH_LOCK)  += flash_lock.o
+lib-$(CONFIG_FLASH_UNLOCK) += flash_unlock.o
 lib-$(CONFIG_FLASH_ERASEALL)	+= flash_eraseall.o
 lib-$(CONFIG_IONICE)      += ionice.o
 lib-$(CONFIG_HDPARM)      += hdparm.o
diff --git a/miscutils/flash_lock.c b/miscutils/flash_lock.c
new file mode 100644
index 0000000..ae7ec22
--- /dev/null
+++ b/miscutils/flash_lock.c
@@ -0,0 +1,80 @@
+/*
+ * miscutils/flash_lock.c
+ *
+ * Ported to busybox from mtd-utils.
+ *
+ * This utility locks one or more sectors of flash device.
+ *
+ */
+
+#include "libbb.h"
+#include <mtd/mtd-user.h>
+
+int flash_lock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int flash_lock_main(int argc, char **argv)
+{
+	int fd;
+	struct mtd_info_user info;
+	struct erase_info_user lock;
+	int num_sectors;
+	int ofs;
+
+	/*
+	 * Parse command line options
+	 */
+	if (argc != 4) {
+		fprintf(stderr, "usage: %s MTD_DEVICE OFFSET SECTORS\n",
+				argv[0]);
+		return EXIT_FAILURE;
+	} else if (strncmp(argv[1], "/dev/mtd", 8) != 0) {
+		fprintf(stderr, "'%s' is not a MTD device.  Must specify mtd "
+				"device: /dev/mtd?\n", argv[1]);
+		return EXIT_FAILURE;
+	}
+
+	fd = xopen(argv[1], O_RDWR);
+	if (fd < 0) {
+		fprintf(stderr, "Could not open mtd device: %s\n", argv[1]);
+		return EXIT_FAILURE;
+	}
+
+	if (ioctl(fd, MEMGETINFO, &info)) {
+		fprintf(stderr, "Could not get MTD device info from %s\n",
+				argv[1]);
+		close(fd);
+		return EXIT_FAILURE;
+	}
+
+	sscanf(argv[2], "%x",&ofs);
+	sscanf(argv[3], "%d",&num_sectors);
+
+	if (ofs > (info.size - info.erasesize)) {
+		unsigned int size = info.size - info.erasesize;
+		fprintf(stderr, "%x is beyond device size %x\n", ofs, size);
+		return EXIT_FAILURE;
+	}
+
+	if (num_sectors == -1) {
+		num_sectors = info.size / info.erasesize;
+	} else {
+		if (num_sectors > (info.size / info.erasesize)) {
+			int sectors = info.size / info.erasesize;
+			fprintf(stderr, "%d are too many sectors, device "
+					"only has %d\n", num_sectors,
+					sectors);
+			return EXIT_FAILURE;
+		}
+	}
+
+	lock.start = ofs;
+	lock.length = num_sectors * info.erasesize;
+
+	if (ioctl(fd, MEMLOCK, &lock)) {
+		fprintf(stderr, "Could not lock MTD device: %s\n", argv[1]);
+		close(fd);
+		return EXIT_FAILURE;
+	}
+
+	return EXIT_SUCCESS;
+}
+
diff --git a/miscutils/flash_unlock.c b/miscutils/flash_unlock.c
new file mode 100644
index 0000000..a0a6f59
--- /dev/null
+++ b/miscutils/flash_unlock.c
@@ -0,0 +1,56 @@
+/*
+ * miscutils/flash_unlock.c
+ *
+ * Ported to busybox from mtd-utils.
+ *
+ * This utility unlock all sectors of flash device.
+ *
+ */
+
+#include "libbb.h"
+#include <mtd/mtd-user.h>
+
+int flash_unlock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+int flash_unlock_main(int argc UNUSED_PARAM, char **argv)
+{
+	int fd;
+	struct mtd_info_user info;
+	struct erase_info_user lock;
+
+	/*
+	 * Parse command line options
+	 */
+	if (argc != 2) {
+		fprintf(stderr, "usage: %s MTD_DEVICE\n", argv[0]);
+		return EXIT_FAILURE;
+	} else if (strncmp(argv[1], "/dev/mtd", 8) != 0) {
+		fprintf(stderr, "'%s' is not a MTD device.  Must specify "
+				"mtd device: /dev/mtd?\n", argv[1]);
+		return EXIT_FAILURE;
+	}
+
+	fd = xopen(argv[1], O_RDWR);
+	if (fd < 0) {
+		fprintf(stderr, "Could not open mtd device: %s\n", argv[1]);
+		return EXIT_FAILURE;
+	}
+
+	if (ioctl(fd, MEMGETINFO, &info)) {
+		fprintf(stderr, "Could not get MTD device info from %s\n",
+				argv[1]);
+		close(fd);
+		return EXIT_FAILURE;
+	}
+
+	lock.start = 0;
+	lock.length = info.size;
+
+	if (ioctl(fd, MEMUNLOCK, &lock)) {
+		fprintf(stderr, "Could not unlock MTD device: %s\n", argv[1]);
+		close(fd);
+		return EXIT_FAILURE;
+	}
+
+	return EXIT_SUCCESS;
+}
+
-- 
1.6.3.1



More information about the busybox mailing list