int main(int argc, char * const argv[]) { int fd; struct blkpg_partition part; struct blkpg_ioctl_arg arg; process_options(argc, argv); fd = open(mtddev, O_RDWR | O_CLOEXEC); if (fd == -1) sys_errmsg_die("Cannot open %s", mtddev); memset(&part, 0, sizeof(part)); memset(&arg, 0, sizeof(arg)); arg.datalen = sizeof(part); arg.data = ∂ switch (command) { case COMMAND_ADD: part.start = start_addr; part.length = length; strncpy(part.devname, part_name, sizeof(part.devname)); arg.op = BLKPG_ADD_PARTITION; break; case COMMAND_DEL: part.pno = part_no; arg.op = BLKPG_DEL_PARTITION; break; } if (ioctl(fd, BLKPG, &arg)) sys_errmsg_die("Failed to issue BLKPG ioctl"); close(fd); /* Exit happy */ return EXIT_SUCCESS; }
int main(int argc, char **argv) { int fd, opt, recurse = 0, want_ctime = 0; struct stat st; char *scratch, *dir = NULL, *file = NULL; size_t ssize = 0; char *buf; while ((opt = getopt(argc, argv, "rd:f:t")) > 0) { switch (opt) { case 'd': dir = optarg; break; case 'f': file = optarg; break; case 'r': recurse++; break; case 't': want_ctime++; break; default: fprintf(stderr, "Usage: %s <image> [-d|-f] < path >\n", PROGRAM_NAME); exit(EXIT_FAILURE); } } fd = open(argv[optind], O_RDONLY); if (fd == -1) sys_errmsg_die("%s", argv[optind]); if (fstat(fd, &st)) sys_errmsg_die("%s", argv[optind]); buf = xmalloc((size_t) st.st_size); if (read(fd, buf, st.st_size) != (ssize_t) st.st_size) sys_errmsg_die("%s", argv[optind]); if (dir) lsdir(buf, st.st_size, dir, recurse, want_ctime); if (file) { scratch = xmalloc(SCRATCH_SIZE); catfile(buf, st.st_size, file, scratch, SCRATCH_SIZE, &ssize); free(scratch); } if (!dir && !file) lsdir(buf, st.st_size, "/", 1, want_ctime); free(buf); exit(EXIT_SUCCESS); }
int main(int argc, char *argv[]) { int fd, request; struct mtd_info_user mtdInfo; struct erase_info_user mtdLockInfo; long count; int ret = 0; process_args(argc, argv); /* Get the device info to compare to command line sizes */ fd = open(dev, O_RDWR); if (fd < 0) sys_errmsg_die("could not open: %s", dev); if (ioctl(fd, MEMGETINFO, &mtdInfo)) sys_errmsg_die("could not get mtd info: %s", dev); /* Make sure user options are valid */ if (offs_s) { mtdLockInfo.start = simple_strtol(offs_s, &ret); if (ret) errmsg_die("bad offset"); } else { mtdLockInfo.start = 0; } if (mtdLockInfo.start >= mtdInfo.size) errmsg_die("%#x is beyond device size %#x", mtdLockInfo.start, mtdInfo.size); if (count_s) { count = simple_strtol(count_s, &ret); if (ret) errmsg_die("bad count"); if (count == -1) mtdLockInfo.length = mtdInfo.size; else mtdLockInfo.length = mtdInfo.erasesize * count; } else { mtdLockInfo.length = mtdInfo.size; } if (mtdLockInfo.start + mtdLockInfo.length > mtdInfo.size) errmsg_die("range is more than device supports: %#x + %#x > %#x", mtdLockInfo.start, mtdLockInfo.length, mtdInfo.size); /* Finally do the operation */ switch (req) { case REQUEST_LOCK: request = MEMLOCK; break; case REQUEST_UNLOCK: request = MEMUNLOCK; break; case REQUEST_ISLOCKED: request = MEMISLOCKED; break; default: errmsg_die("unknown request type: %d", req); break; } ret = ioctl(fd, request, &mtdLockInfo); if (ret < 0) sys_errmsg_die("could not %s device: %s\n", flash_msg[req], dev); if (req == REQUEST_ISLOCKED) { printf("Device: %s\n", dev); printf("Start: %#0x\n", mtdLockInfo.start); printf("Len: %#0x\n", mtdLockInfo.length); printf("Lock status: %s\n", ret ? "locked" : "unlocked"); printf("Return code: %d\n", ret); } return 0; }