aboutsummaryrefslogtreecommitdiff
path: root/src/internal_cmd.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/internal_cmd.c')
-rw-r--r--src/internal_cmd.c147
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