diff options
Diffstat (limited to 'src/internal_cmd.c')
-rw-r--r-- | src/internal_cmd.c | 147 |
1 files changed, 96 insertions, 51 deletions
diff --git a/src/internal_cmd.c b/src/internal_cmd.c index 7869c53..38456cf 100644 --- a/src/internal_cmd.c +++ b/src/internal_cmd.c @@ -9,9 +9,97 @@ static char *internal_commands[] = { "mkprefixbin", "generate prefix manifest (binary)", "mkprefixtext", "generate prefix manifest (text)", + "rpath_set", "modify binary RPATH", NULL, NULL, }; +void mkprefix_interface_usage(void) { + printf("usage: mkprefix[bin|text] {output_file} {dir} {prefix ...}\n"); +} + +int mkprefix_interface(int argc, char **argv) { + char *command = argv[0]; + char *outfile = argv[1]; + char *tree = argv[2]; + + size_t prefix_start = 3; + size_t prefixes = 0; + for (size_t i = prefix_start; i < (size_t) argc; i++) { + prefixes = i; + } + + // Check arguments + if (!outfile) { + fprintf(stderr, "error: missing output file name\n"); + mkprefix_interface_usage(); + return -1; + } + if (!tree) { + fprintf(stderr, "error: missing directory path\n"); + mkprefix_interface_usage(); + return -1; + } + if (!prefixes) { + fprintf(stderr, "error: missing prefix string(s)\n"); + mkprefix_interface_usage(); + return -1; + } + + char **prefix = (char **) calloc(prefixes + 1, sizeof(char *)); + if (!prefix) { + perror("prefix array"); + fprintf(SYSERROR); + return -1; + } + + // Populate array of prefixes; reusing pointers from argv + for (size_t i = 0; (i + prefix_start) < (size_t) argc; i++) { + prefix[i] = argv[(i + prefix_start)]; + } + + if (SPM_GLOBAL.verbose) { + printf("Generating prefix manifest: %s\n", outfile); + } + + int result; + if (strcmp(command, "mkprefixbin") == 0) { + result = prefixes_write(outfile, PREFIX_WRITE_BIN, prefix, tree); + } else if (strcmp(command, "mkprefixtext") == 0) { + result = prefixes_write(outfile, PREFIX_WRITE_TEXT, prefix, tree); + } + return result; +} + +/** + * + */ +void rpath_set_interface_usage(void) { + printf("usage: rpath_set {file} {rpath}\n"); +} + +/** + * + * @param argc + * @param argv + * @return + */ +int rpath_set_interface(int argc, char **argv) { + for (int i = 0; i < argc; i++) { + printf("argv[%d] = %s\n", i, argv[i]); + } + if (argc < 3) { + rpath_set_interface_usage(); + return -1; + } + char *filename = argv[1]; + char *rpath = argv[2]; + int result = rpath_set(filename, rpath); + if (result < 0) { + fprintf(SYSERROR); + } + return result; +} + /** * Show a listing of valid internal commands */ @@ -23,10 +111,6 @@ void internal_command_list(void) { } } -void mkprefix_usage(void) { - printf("usage: mkprefix[bin|text] {output_file} {dir} {prefix ...}\n"); -} - /** * Execute an internal command * @param argc @@ -54,54 +138,15 @@ int internal_cmd(int argc, char **argv) { return 1; } - if (strcmp(command, "mkprefixbin") == 0 || strcmp(command, "mkprefixtext") == 0) { - char *outfile = argv[2]; - char *tree = argv[3]; - - size_t prefix_start = 4; - size_t prefixes = 0; - for (size_t i = prefix_start; i < argc; i++) { - prefixes = i; - } + // Strip the first argument (this level) before passing it along to the interface + int arg_count = argc - 1; + char **arg_array = &argv[1]; - // Check arguments - if (!outfile) { - fprintf(stderr, "error: missing output file name\n"); - mkprefix_usage(); - return -1; - } - if (!tree) { - fprintf(stderr, "error: missing directory path\n"); - mkprefix_usage(); - return -1; - } - if (!prefixes) { - fprintf(stderr, "error: missing prefix string(s)\n"); - mkprefix_usage(); - return -1; - } - - char **prefix = (char **) calloc(prefixes + 1, sizeof(char *)); - if (!prefix) { - perror("prefix array"); - fprintf(SYSERROR); - return -1; - } - - // Populate array of prefixes; reusing pointers from argv - for (int i = 0; (i + prefix_start) < argc; i++) { - prefix[i] = argv[(i + prefix_start)]; - } - - if (SPM_GLOBAL.verbose) { - printf("Generating prefix manifest: %s\n", outfile); - } - - if (strcmp(command, "mkprefixbin") == 0) { - prefixes_write(outfile, PREFIX_WRITE_BIN, prefix, tree); - } else if (strcmp(command, "mkprefixtext") == 0) { - prefixes_write(outfile, PREFIX_WRITE_TEXT, prefix, tree); - } + if (strcmp(command, "mkprefixbin") == 0 || strcmp(command, "mkprefixtext") == 0) { + return mkprefix_interface(arg_count, arg_array); + } + else if (strcmp(command, "rpath_set") == 0) { + return rpath_set_interface(arg_count, arg_array); } return 0; }
\ No newline at end of file |