void usage(void) { int i; version(); printf("Usage: kexec [OPTION]... [kernel]\n" "Directly reboot into a new kernel\n" "\n" " -h, --help Print this help.\n" " -v, --version Print the version of kexec.\n" " -f, --force Force an immediate kexec,\n" " don't call shutdown.\n" " -x, --no-ifdown Don't bring down network interfaces.\n" " (if used, must be last option\n" " specified)\n" " -l, --load Load the new kernel into the\n" " current kernel.\n" " -p, --load-panic Load the new kernel for use on panic.\n" " -u, --unload Unload the current kexec target kernel.\n" " If capture kernel is being unloaded\n" " specify -p with -u.\n" " -e, --exec Execute a currently loaded kernel.\n" " -t, --type=TYPE Specify the new kernel is of this type.\n" " --mem-min=<addr> Specify the lowest memory address to\n" " load code into.\n" " --mem-max=<addr> Specify the highest memory address to\n" " load code into.\n" " --reuseinird Reuse initrd from first boot.\n" "\n" "Supported kernel file types and options: \n"); for (i = 0; i < file_types; i++) { printf("%s\n", file_type[i].name); file_type[i].usage(); } printf( "Architecture options: \n"); arch_usage(); printf("\n"); }
int main( int argc, char **argv, char **envp) { int i; unsigned long j; struct arch_flag *arch_flags; unsigned long narch_flags; enum bool all_archs; char **files; progname = argv[0]; arch_flags = NULL; narch_flags = 0; all_archs = FALSE; output = stdout; cmd_flags.nfiles = 0; cmd_flags.c = FALSE; cmd_flags.x = FALSE; cmd_flags.ofile_name = NULL; cmd_flags.ofile_path = NULL; files = allocate(sizeof(char *) * argc); for(i = 1; i < argc; i++){ if(argv[i][0] == '-'){ if(argv[i][1] == '\0'){ for( ; i < argc; i++) files[cmd_flags.nfiles++] = argv[i]; break; } if(strcmp(argv[i], "-arch") == 0){ if(i + 1 == argc){ error("missing argument(s) to %s option", argv[i]); usage(); } if(strcmp("all", argv[i+1]) == 0){ all_archs = TRUE; } else{ arch_flags = reallocate(arch_flags, (narch_flags + 1) * sizeof(struct arch_flag)); if(get_arch_from_flag(argv[i+1], arch_flags + narch_flags) == 0){ error("unknown architecture specification flag: " "%s %s", argv[i], argv[i+1]); arch_usage(); usage(); } narch_flags++; } i++; } else{ for(j = 1; argv[i][j] != '\0'; j++){ switch(argv[i][j]){ case 'c': cmd_flags.c = TRUE; break; case 'x': cmd_flags.x = TRUE; break; case 'n': cmd_flags.n = TRUE; break; case 'o': cmd_flags.o = TRUE; break; default: error("invalid argument -%c", argv[i][j]); usage(); } } if(cmd_flags.n == TRUE && cmd_flags.ofile_name == NULL){ if(i + 1 == argc){ error("missing arguments to -n"); usage(); } cmd_flags.ofile_name = upper_string(argv[i+1]); i += 1; } if(cmd_flags.o == TRUE && cmd_flags.ofile_path == NULL){ if(i + 1 == argc){ error("missing arguments to -o"); usage(); } cmd_flags.ofile_path = argv[i+1]; i += 1; } } continue; } files[cmd_flags.nfiles++] = argv[i]; } if (cmd_flags.ofile_name == NULL) { if (cmd_flags.nfiles == 0) cmd_flags.ofile_name = upper_string("a.out"); else cmd_flags.ofile_name = upper_string(files[0]); } if (cmd_flags.o == TRUE) { output = fopen(cmd_flags.ofile_path, "w"); if (output == NULL) { error("couldn't open output file %s\n",cmd_flags.ofile_path); output = stdout; } } for(j = 0; j < cmd_flags.nfiles; j++) ofile_process(files[j], arch_flags, narch_flags, all_archs, FALSE, FALSE, TRUE, nm, &cmd_flags); if(cmd_flags.nfiles == 0) ofile_process("a.out", arch_flags, narch_flags, all_archs, FALSE, FALSE, TRUE, nm, &cmd_flags); if (cmd_flags.ofile_name != NULL) free(cmd_flags.ofile_name); if(errors == 0) return(EXIT_SUCCESS); else return(EXIT_FAILURE); }
/* * The codesign_allocate(1) tool has the following usage: * * codesign_allocate -i oldfile -a arch size ... -o newfile * * Where the oldfile is a Mach-O file that is input for the dynamic linker * and it creates or adds an */ int main( int argc, char **argv, char **envp) { uint32_t i; char *input, *output, *endp; struct arch *archs; uint32_t narchs; progname = argv[0]; input = NULL; output = NULL; archs = NULL; narchs = 0; for(i = 1; i < argc; i++) { if(strcmp(argv[i], "-i") == 0) { if(i + 1 == argc) { error("missing argument to: %s option", argv[i]); usage(); } if(input != NULL) { error("more than one: %s option specified", argv[i]); usage(); } input = argv[i+1]; i++; } else if(strcmp(argv[i], "-o") == 0) { if(i + 1 == argc) { error("missing argument to: %s option", argv[i]); usage(); } if(output != NULL) { error("more than one: %s option specified", argv[i]); usage(); } output = argv[i+1]; i++; } else if(strcmp(argv[i], "-a") == 0) { if(i + 2 == argc) { error("missing argument(s) to: %s option", argv[i]); usage(); } else { arch_signs = reallocate(arch_signs, (narch_signs + 1) * sizeof(struct arch_sign)); if(get_arch_from_flag(argv[i+1], &(arch_signs[narch_signs].arch_flag)) == 0) { error("unknown architecture specification flag: " "%s %s %s", argv[i], argv[i+1], argv[i+2]); arch_usage(); usage(); } arch_signs[narch_signs].datasize = strtoul(argv[i+2], &endp, 0); if(*endp != '\0') fatal("size for '-a %s %s' not a proper number", argv[i+1], argv[i+2]); if((arch_signs[narch_signs].datasize % 16) != 0) fatal("size for '-a %s %s' not a multiple of 16", argv[i+1], argv[i+2]); arch_signs[narch_signs].found = FALSE; narch_signs++; i += 2; } } else if(strcmp(argv[i], "-A") == 0) { if(i + 3 == argc) { error("missing argument(s) to: %s option", argv[i]); usage(); } else { arch_signs = reallocate(arch_signs, (narch_signs + 1) * sizeof(struct arch_sign)); arch_signs[narch_signs].arch_flag.cputype = strtoul(argv[i+1], &endp, 0); if(*endp != '\0') fatal("cputype for '-A %s %s %s' not a proper number", argv[i+1], argv[i+2], argv[i+3]); arch_signs[narch_signs].arch_flag.cpusubtype = strtoul(argv[i+2], &endp, 0); if(*endp != '\0') fatal("cpusubtype for '-A %s %s %s' not a proper " "number", argv[i+1], argv[i+2], argv[i+3]); arch_signs[narch_signs].arch_flag.name = (char *) get_arch_name_from_types( arch_signs[narch_signs].arch_flag.cputype, arch_signs[narch_signs].arch_flag.cpusubtype); arch_signs[narch_signs].datasize = strtoul(argv[i+3], &endp, 0); if(*endp != '\0') fatal("size for '-A %s %s %s' not a proper number", argv[i+1], argv[i+2], argv[i+3]); if((arch_signs[narch_signs].datasize % 16) != 0) fatal("size for '-A %s %s %s' not a multiple of 16", argv[i+1], argv[i+2], argv[i+3]); arch_signs[narch_signs].found = FALSE; narch_signs++; i += 3; } } else { error("unknown flag: %s", argv[i]); usage(); } } if(input == NULL || output == NULL || narch_signs == 0) usage(); breakout(input, &archs, &narchs, FALSE); if(errors) exit(EXIT_FAILURE); checkout(archs, narchs); process(archs, narchs); for(i = 0; i < narch_signs; i++) { if(arch_signs[i].found == FALSE) fatal("input file: %s does not contain a matching architecture " "for specified '-a %s %u' option", input, arch_signs[i].arch_flag.name, arch_signs[i].datasize); } writeout(archs, narchs, output, 0777, TRUE, FALSE, FALSE, NULL); if(errors) return(EXIT_FAILURE); else return(EXIT_SUCCESS); }
/* * The ctf_insert(1) tool has the following usage: * * ctf_insert input -arch arch ctf_file ... -o output * * Where the input is a Mach-O file that is the ctf_file(s) are to be inserted * into and output is the file to be created. */ int main( int argc, char **argv, char **envp) { uint32_t i; char *input, *output, *contents; struct arch *archs; uint32_t narchs; struct stat stat_buf; int fd; progname = argv[0]; input = NULL; output = NULL; archs = NULL; narchs = 0; for(i = 1; i < argc; i++){ if(strcmp(argv[i], "-o") == 0){ if(i + 1 == argc){ error("missing argument to: %s option", argv[i]); usage(); } if(output != NULL){ error("more than one: %s option specified", argv[i]); usage(); } output = argv[i+1]; i++; } else if(strcmp(argv[i], "-arch") == 0){ if(i + 2 == argc){ error("missing argument(s) to: %s option", argv[i]); usage(); } else{ arch_ctfs = reallocate(arch_ctfs, (narch_ctfs + 1) * sizeof(struct arch_ctf)); if(get_arch_from_flag(argv[i+1], &(arch_ctfs[narch_ctfs].arch_flag)) == 0){ error("unknown architecture specification flag: " "%s %s %s", argv[i], argv[i+1], argv[i+2]); arch_usage(); usage(); } if((fd = open(argv[i+2], O_RDONLY, 0)) == -1) system_fatal("can't open file: %s", argv[i+2]); if(fstat(fd, &stat_buf) == -1) system_fatal("can't stat file: %s", argv[i+2]); /* * For some reason mapping files with zero size fails * so it has to be handled specially. */ contents = NULL; if(stat_buf.st_size != 0){ contents = mmap(0, stat_buf.st_size, PROT_READ|PROT_WRITE, MAP_FILE|MAP_PRIVATE, fd, 0); if((intptr_t)contents == -1) system_error("can't map file : %s", argv[i+2]); } arch_ctfs[narch_ctfs].filename = argv[i+2]; arch_ctfs[narch_ctfs].contents = contents; arch_ctfs[narch_ctfs].size = stat_buf.st_size; arch_ctfs[narch_ctfs].arch_found = FALSE; narch_ctfs++; i += 2; } } else{ if(input != NULL){ error("more than one input file file: %s specified", input); usage(); } input = argv[i]; } } if(input == NULL || output == NULL || narch_ctfs == 0) usage(); breakout(input, &archs, &narchs, FALSE); if(errors) exit(EXIT_FAILURE); checkout(archs, narchs); process(archs, narchs); for(i = 0; i < narch_ctfs; i++){ if(arch_ctfs[i].arch_found == FALSE) fatal("input file: %s does not contain a matching architecture " "for specified '-arch %s %s' option", input, arch_ctfs[i].arch_flag.name, arch_ctfs[i].filename); } writeout(archs, narchs, output, 0777, TRUE, FALSE, FALSE, FALSE, NULL); if(errors) return(EXIT_FAILURE); else return(EXIT_SUCCESS); }
int main( int argc, char **argv, char **envp) { int i; enum bool args_left; struct flags flag; struct arch_flag *arch_flags; unsigned long narch_flags; enum bool all_archs; progname = argv[0]; arch_flags = NULL; narch_flags = 0; all_archs = FALSE; flag.nfiles = 0; flag.m = FALSE; flag.l = FALSE; flag.x = FALSE; for(i = 1; i < argc; i++){ if(argv[i][0] == '-'){ if(argv[i][1] == '\0'){ flag.nfiles += argc - i - 1; break; } if(strcmp(argv[i], "-m") == 0){ flag.m = TRUE; continue; } if(strcmp(argv[i], "-l") == 0){ flag.l = TRUE; flag.m = TRUE; continue; } if(strcmp(argv[i], "-x") == 0){ flag.x = TRUE; flag.m = TRUE; continue; } if(strcmp(argv[i], "-arch") == 0){ if(i + 1 == argc){ error("missing argument(s) to %s option", argv[i]); usage(); } if(strcmp("all", argv[i+1]) == 0){ all_archs = TRUE; } else{ arch_flags = reallocate(arch_flags, (narch_flags + 1) * sizeof(struct arch_flag)); if(get_arch_from_flag(argv[i+1], arch_flags + narch_flags) == 0){ error("unknown architecture specification flag: " "%s %s", argv[i], argv[i+1]); arch_usage(); usage(); } narch_flags++; } i++; continue; } } flag.nfiles++; } if(flag.m == FALSE) printf("__TEXT\t__DATA\t__OBJC\tothers\tdec\thex\n"); args_left = TRUE; for (i = 1; i < argc; i++) { if(args_left == TRUE && argv[i][0] == '-'){ if(argv[i][1] == '\0'){ args_left = FALSE; continue; } if(strcmp(argv[i], "-m") == 0) continue; if(strcmp(argv[i], "-l") == 0) continue; if(strcmp(argv[i], "-x") == 0) continue; if(strcmp(argv[i], "-arch") == 0){ i++; continue; } } ofile_process(argv[i], arch_flags, narch_flags, all_archs, FALSE, TRUE, TRUE, size, &flag); } if(flag.nfiles == 0) ofile_process("a.out", arch_flags, narch_flags, all_archs, FALSE, TRUE, TRUE, size, &flag); if(errors == 0) return(EXIT_SUCCESS); else return(EXIT_FAILURE); }
int main( int argc, char **argv, char **envp) { struct flags flags; int i; uint32_t j, nfiles; char *endp; struct arch_flag *arch_flags; uint32_t narch_flags; enum bool all_archs, rest_args_files, use_member_syntax; struct stat stat_buf; progname = argv[0]; nfiles = 0; arch_flags = NULL; narch_flags = 0; all_archs = FALSE; flags.treat_as_data = FALSE; flags.print_offsets = FALSE; flags.offset_format = NULL; flags.all_sections = FALSE; flags.minimum_length = 4; rest_args_files = FALSE; for(i = 1; i < argc; i++){ if(rest_args_files == FALSE && argv[i][0] == '-'){ if(argv[i][1] == '\0') flags.treat_as_data = TRUE; else if(strcmp(argv[i], "--") == 0) rest_args_files = TRUE; else if(strcmp(argv[i], "-arch") == 0){ if(i + 1 == argc){ error("missing argument(s) to %s option", argv[i]); usage(); } if(strcmp("all", argv[i+1]) == 0){ all_archs = TRUE; } else{ arch_flags = reallocate(arch_flags, (narch_flags + 1) * sizeof(struct arch_flag)); if(get_arch_from_flag(argv[i+1], arch_flags + narch_flags) == 0){ error("unknown architecture specification flag: " "%s %s", argv[i], argv[i+1]); arch_usage(); usage(); } narch_flags++; } i++; } else if(strcmp(argv[i], "-n") == 0){ if(i + 1 == argc){ error("missing argument to %s option", argv[i]); usage(); } flags.minimum_length = strtoul(argv[i+1], &endp, 10); if(*endp != '\0'){ error("invalid decimal number in option: %s %s", argv[i], argv[i+1]); usage(); } i++; } else if(strcmp(argv[i], "-t") == 0){ if(i + 1 == argc){ error("missing argument to %s option", argv[i]); usage(); } if(argv[i+1][1] != '\0'){ error("invalid argument to option: %s %s", argv[i], argv[i+1]); usage(); } switch(argv[i+1][0]){ case 'd': flags.print_offsets = TRUE; flags.offset_format = "%d"; break; case 'o': flags.print_offsets = TRUE; flags.offset_format = "%o"; break; case 'x': flags.print_offsets = TRUE; flags.offset_format = "%x"; break; default: error("invalid argument to option: %s %s", argv[i], argv[i+1]); usage(); } i++; } else{ endp = NULL; for(j = 1; argv[i][j] != '\0' && endp == NULL; j++){ switch(argv[i][j]){ case 'o': flags.print_offsets = TRUE; flags.offset_format = "%7lu"; break; case 'a': flags.all_sections = TRUE; break; default: if(!isdigit(argv[i][j])){ error("unknown flag: %s", argv[i]); usage(); } flags.minimum_length = strtoul(argv[i]+j,&endp,10); if(*endp != '\0'){ error("invalid decimal number in flag: %s", argv[i]); usage(); } } } } } else{ nfiles++; } } /* * Process the file or stdin if there are no files. */ rest_args_files = FALSE; if(nfiles != 0){ for(i = 1; i < argc; i++){ if(argv[i][0] != '-' || rest_args_files == TRUE){ if(flags.treat_as_data == TRUE){ if(freopen(argv[i], "r", stdin) == NULL) system_error("can't open: %s", argv[i]); rewind(stdin); find(UINT_MAX, &flags); } else{ /* * If there's a filename that's an exact match then use * that, else fall back to the member syntax. */ if(stat(argv[i], &stat_buf) == 0) use_member_syntax = FALSE; else use_member_syntax = TRUE; ofile_process(argv[i], arch_flags, narch_flags, all_archs, TRUE, TRUE, use_member_syntax, ofile_processor,&flags); } } else if(strcmp(argv[i], "-arch") == 0 || strcmp(argv[i], "-n") == 0 || strcmp(argv[i], "-t") == 0) i++; else if(strcmp(argv[i], "--") == 0) rest_args_files = TRUE; } } else{ find(UINT_MAX, &flags); } if(errors == 0) return(EXIT_SUCCESS); else return(EXIT_FAILURE); }
int main( int argc, char **argv, char **envp) { int i; struct cmd_flags cmd_flags; unsigned long j, table_size; struct arch_flag *arch_flags; unsigned long narch_flags; enum bool all_archs; char **files; progname = argv[0]; arch_flags = NULL; narch_flags = 0; all_archs = FALSE; cmd_flags.nfiles = 0; cmd_flags.rldtype = FALSE; cmd_flags.detail = FALSE; cmd_flags.verification = FALSE; cmd_flags.trey = FALSE; cmd_flags.check_dynamic_binary = TRUE; files = allocate(sizeof(char *) * argc); for(i = 1; i < argc; i++){ if(argv[i][0] == '-'){ if(argv[i][1] == '\0'){ for( ; i < argc; i++) files[cmd_flags.nfiles++] = argv[i]; break; } else if(strcmp(argv[i], "-arch") == 0){ if(i + 1 == argc){ error("missing argument(s) to %s option", argv[i]); usage(); } if(strcmp("all", argv[i+1]) == 0){ all_archs = TRUE; } else{ arch_flags = reallocate(arch_flags, (narch_flags + 1) * sizeof(struct arch_flag)); if(get_arch_from_flag(argv[i+1], arch_flags + narch_flags) == 0){ error("unknown architecture specification flag: " "%s %s", argv[i], argv[i+1]); arch_usage(); usage(); } narch_flags++; } i++; } else if(strcmp(argv[i], "-dylib_table") == 0){ if(i + 1 == argc){ error("missing argument(s) to %s option", argv[i]); usage(); } if(dylib_table_name != NULL){ error("more than one: %s option", argv[i]); usage(); } dylib_table_name = argv[i+1]; dylib_table = parse_dylib_table(argv[i+1], argv[i], argv[i+1]); i++; } else if(strcmp(argv[i], "-seg_addr_table") == 0){ if(i + 1 == argc){ error("missing argument(s) to %s option", argv[i]); usage(); } if(seg_addr_table_specified == TRUE){ error("more than one: %s option", argv[i]); usage(); } seg_addr_table_specified = TRUE; seg_addr_table_name = argv[i+1]; seg_addr_table = parse_seg_addr_table(argv[i+1], argv[i], argv[i+1], &table_size); i++; } else if(strcmp(argv[i], "-seg_addr_table_filename") == 0){ if(i + 1 == argc){ error("missing argument(s) to %s option", argv[i]); usage(); } if(seg_addr_table_filename != NULL){ error("more than one: %s option", argv[i]); usage(); } seg_addr_table_filename = argv[i+1]; i++; } else{ for(j = 1; argv[i][j] != '\0'; j++){ switch(argv[i][j]){ case 'r': cmd_flags.rldtype = TRUE; break; case 'd': cmd_flags.detail = TRUE; break; case 'v': cmd_flags.verification = TRUE; break; case 't': cmd_flags.trey = TRUE; break; case 'b': cmd_flags.check_dynamic_binary = TRUE; break; default: error("invalid argument -%c", argv[i][j]); usage(); } } } continue; } files[cmd_flags.nfiles++] = argv[i]; } if(arch_flags == NULL) all_archs = TRUE; if(cmd_flags.nfiles != 1) usage(); for(j = 0; j < cmd_flags.nfiles; j++) ofile_process(files[j], arch_flags, narch_flags, all_archs, TRUE, TRUE, FALSE, checksyms, &cmd_flags); if(errors == 0) return(exit_status); else return(EXIT_FAILURE); }