flash_lock_unlock.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. /* vi: set sw=4 ts=4: */
  2. /* Ported to busybox from mtd-utils.
  3. *
  4. * Licensed under GPLv2, see file LICENSE in this source tree.
  5. */
  6. //config:config FLASH_LOCK
  7. //config: bool "flash_lock"
  8. //config: default n # doesn't build on Ubuntu 8.04
  9. //config: help
  10. //config: The flash_lock binary from mtd-utils as of git head 5ec0c10d0. This
  11. //config: utility locks part or all of the flash device.
  12. //config:
  13. //config:config FLASH_UNLOCK
  14. //config: bool "flash_unlock"
  15. //config: default n # doesn't build on Ubuntu 8.04
  16. //config: help
  17. //config: The flash_unlock binary from mtd-utils as of git head 5ec0c10d0. This
  18. //config: utility unlocks part or all of the flash device.
  19. // APPLET_ODDNAME:name main location suid_type help
  20. //applet:IF_FLASH_LOCK( APPLET_ODDNAME(flash_lock, flash_lock_unlock, BB_DIR_USR_SBIN, BB_SUID_DROP, flash_lock))
  21. //applet:IF_FLASH_UNLOCK(APPLET_ODDNAME(flash_unlock, flash_lock_unlock, BB_DIR_USR_SBIN, BB_SUID_DROP, flash_unlock))
  22. //kbuild:lib-$(CONFIG_FLASH_LOCK) += flash_lock_unlock.o
  23. //kbuild:lib-$(CONFIG_FLASH_UNLOCK) += flash_lock_unlock.o
  24. //usage:#define flash_lock_trivial_usage
  25. //usage: "MTD_DEVICE OFFSET SECTORS"
  26. //usage:#define flash_lock_full_usage "\n\n"
  27. //usage: "Lock part or all of an MTD device. If SECTORS is -1, then all sectors\n"
  28. //usage: "will be locked, regardless of the value of OFFSET"
  29. //usage:
  30. //usage:#define flash_unlock_trivial_usage
  31. //usage: "MTD_DEVICE"
  32. //usage:#define flash_unlock_full_usage "\n\n"
  33. //usage: "Unlock an MTD device"
  34. #include "libbb.h"
  35. #include <mtd/mtd-user.h>
  36. int flash_lock_unlock_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
  37. int flash_lock_unlock_main(int argc UNUSED_PARAM, char **argv)
  38. {
  39. /* note: fields in these structs are 32-bits.
  40. * apparently we can't win anything by using off_t
  41. * or long long's for offset and/or sectors vars. */
  42. struct mtd_info_user info;
  43. struct erase_info_user lock;
  44. unsigned long offset;
  45. long sectors;
  46. int fd;
  47. #define do_lock (ENABLE_FLASH_LOCK && (!ENABLE_FLASH_UNLOCK || (applet_name[6] == 'l')))
  48. if (!argv[1])
  49. bb_show_usage();
  50. /* parse offset and number of sectors to lock */
  51. offset = 0;
  52. sectors = -1;
  53. if (do_lock) {
  54. if (!argv[2] || !argv[3])
  55. bb_show_usage();
  56. offset = xstrtoul(argv[2], 0);
  57. sectors = xstrtol(argv[3], 0);
  58. }
  59. fd = xopen(argv[1], O_RDWR);
  60. xioctl(fd, MEMGETINFO, &info);
  61. lock.start = 0;
  62. lock.length = info.size;
  63. if (do_lock) {
  64. unsigned long size = info.size - info.erasesize;
  65. if (offset > size) {
  66. bb_error_msg_and_die("%lx is beyond device size %lx\n",
  67. offset, size);
  68. }
  69. if (sectors == -1) {
  70. sectors = info.size / info.erasesize;
  71. } else {
  72. // isn't this useless?
  73. unsigned long num = info.size / info.erasesize;
  74. if (sectors > num) {
  75. bb_error_msg_and_die("%ld are too many "
  76. "sectors, device only has "
  77. "%ld\n", sectors, num);
  78. }
  79. }
  80. lock.start = offset;
  81. lock.length = sectors * info.erasesize;
  82. xioctl(fd, MEMLOCK, &lock);
  83. } else {
  84. xioctl(fd, MEMUNLOCK, &lock);
  85. }
  86. return EXIT_SUCCESS;
  87. }