rizin/librz/main/rz-run.c
2021-03-05 19:39:15 +08:00

80 lines
1.6 KiB
C

/* rizin - Copyleft 2011-2020 - pancake */
#include <rz_util.h>
#include <rz_main.h>
#include <rz_socket.h>
#if __UNIX__
static void fwd(int sig) {
/* do nothing? send kill signal to remote process */
}
static void rz_run_tty(void) {
/* TODO: Implement in native code */
rz_sys_xsystem("tty");
close(1);
dup2(2, 1);
rz_sys_signal(SIGINT, fwd);
for (;;) {
sleep(1);
}
}
#endif
RZ_API int rz_main_rz_run(int argc, const char **argv) {
RzRunProfile *p;
int i, ret;
if (argc == 1 || !strcmp(argv[1], "-h")) {
printf("Usage: rz-run -v|-t|script.rr2 [directive ..]\n");
printf("%s", rz_run_help());
return 1;
}
if (!strcmp(argv[1], "-v")) {
return rz_main_version_print("rz_run");
}
const char *file = argv[1];
if (!strcmp(file, "-t")) {
#if __UNIX__
rz_run_tty();
return 0;
#else
eprintf("Not supported\n");
return 1;
#endif
}
if (*file && !strchr(file, '=')) {
p = rz_run_new(file);
} else {
bool noMoreDirectives = false;
int directiveIndex = 0;
p = rz_run_new(NULL);
for (i = *file ? 1 : 2; i < argc; i++) {
if (!strcmp(argv[i], "--")) {
noMoreDirectives = true;
continue;
}
if (noMoreDirectives) {
const char *word = argv[i];
char *line = directiveIndex
? rz_str_newf("arg%d=%s", directiveIndex, word)
: rz_str_newf("program=%s", word);
rz_run_parseline(p, line);
directiveIndex++;
free(line);
} else {
rz_run_parseline(p, argv[i]);
}
}
}
if (!p) {
return 1;
}
ret = rz_run_config_env(p);
if (ret) {
printf("error while configuring the environment.\n");
return 1;
}
ret = rz_run_start(p);
rz_run_free(p);
return ret;
}