Fix the static build by dynamically resolving libutil symbols ##build

This commit is contained in:
pancake 2020-04-19 12:38:55 +02:00
parent 52b1affcb6
commit 498292a70d
2 changed files with 38 additions and 6 deletions

View File

@ -58,6 +58,12 @@
#define HAVE_PTY __UNIX__ && !__ANDROID__ && LIBC_HAVE_FORK && !__sun
#if HAVE_PTY
static int (*dyn_openpty)(int *amaster, int *aslave, char *name, struct termios *termp, struct winsize *winp) = NULL;
static int (*dyn_login_tty)(int fd) = NULL;
static id_t (*dyn_forkpty)(int *amaster, char *name, struct termios *termp, struct winsize *winp) = NULL;
#endif
#if EMSCRIPTEN
#undef HAVE_PTY
#define HAVE_PTY 0
@ -278,6 +284,10 @@ static void restore_saved_fd(int saved, bool restore, int fd) {
static int handle_redirection_proc(const char *cmd, bool in, bool out, bool err) {
#if HAVE_PTY
if (!dyn_forkpty) {
// No forkpty api found, maybe we should fallback to just fork without any pty allocated
return -1;
}
// use PTY to redirect I/O because pipes can be problematic in
// case of interactive programs.
int saved_stdin = dup (STDIN_FILENO);
@ -285,11 +295,12 @@ static int handle_redirection_proc(const char *cmd, bool in, bool out, bool err)
return -1;
}
int saved_stdout = dup (STDOUT_FILENO);
if (saved_stdout== -1) {
if (saved_stdout == -1) {
close (saved_stdin);
return -1;
}
int fdm, pid = forkpty (&fdm, NULL, NULL, NULL);
int fdm, pid = dyn_forkpty (&fdm, NULL, NULL, NULL);
if (pid == -1) {
close (saved_stdin);
close (saved_stdout);
@ -357,7 +368,7 @@ static int handle_redirection_proc(const char *cmd, bool in, bool out, bool err)
}
static int handle_redirection(const char *cmd, bool in, bool out, bool err) {
if (!cmd || cmd[0] == '\0') {
if (!cmd || !*cmd) {
return 0;
}
@ -686,7 +697,7 @@ static int redirect_socket_to_pty(RSocket *sock) {
// in case of interactive applications
int fdm, fds;
if (openpty (&fdm, &fds, NULL, NULL, NULL) == -1) {
if (dyn_openpty && dyn_openpty (&fdm, &fds, NULL, NULL, NULL) == -1) {
perror ("opening pty");
return -1;
}
@ -740,7 +751,9 @@ static int redirect_socket_to_pty(RSocket *sock) {
// parent
r_socket_close_fd (sock);
login_tty (fds);
if (dyn_login_tty) {
dyn_login_tty (fds);
}
close (fdm);
// disable the echo on slave stdin
@ -756,9 +769,28 @@ static int redirect_socket_to_pty(RSocket *sock) {
#endif
}
#if HAVE_PTY
static void dyn_init(void) {
if (!dyn_openpty) {
dyn_openpty = r_lib_dl_sym (NULL, "openpty");
}
if (!dyn_login_tty) {
dyn_openpty = r_lib_dl_sym (NULL, "login_tty");
}
if (!dyn_forkpty) {
dyn_openpty = r_lib_dl_sym (NULL, "forkpty");
}
}
#endif
R_API int r_run_config_env(RRunProfile *p) {
int ret;
dyn_init ();
if (!p->_program && !p->_system && !p->_runlib) {
printf ("No program, system or runlib rule defined\n");
return 1;

View File

@ -42,7 +42,7 @@ if [ 1 = "${DOCFG}" ]; then
./configure --prefix="$PREFIX" --without-gpl --with-libr --without-libuv || exit 1
fi
${MAKE} -j 8 || exit 1
BINS="rarun2 rasm2 radare2 ragg2 rabin2 rax2 rahash2 rafind2 r2agent radiff2"
BINS="rarun2 rasm2 radare2 ragg2 rabin2 rax2 rahash2 rafind2 r2agent radiff2 r2r"
# shellcheck disable=SC2086
for a in ${BINS} ; do
(