commit 8f90b2144b015a1c8d566af39e82d48b902b3fff from: Omar Polo date: Tue Aug 16 17:01:41 2022 UTC wip'n'crude: open downloads with xdg-open commit - 05d87bafea0acc2bb9f304b9c1f6f09f13f54dd1 commit + 8f90b2144b015a1c8d566af39e82d48b902b3fff blob - 2854b26f492bf692171735a33230c519c4799aba blob + 3b7f41e6036b45cf725f8d66ad576e12a26f39fb --- cmd.c +++ cmd.c @@ -287,6 +287,43 @@ void cmd_kill_telescope(struct buffer *buffer) { yornp("really quit?", kill_telescope_cb, NULL); +} + +#include +#include +#include +#include +static void +do_exec_command(const char *cmd, struct tab *t) +{ + int s; + pid_t p; + + if (cmd == NULL) + return; + + endwin(); + + switch (p = fork()) { + case -1: + message("failed to fork: %s", strerror(errno)); + return; + case 0: + execl("/bin/sh", "sh", "-c", cmd, NULL); + warn("exec \"%s\" failed", cmd); + _exit(1); + } + +again: + if (waitpid(p, &s, 0) == -1) { + if (errno == EINTR) + goto again; + } + + refresh(); + clear(); + ui_schedule_redraw(); + /* rearrange_windows(); */ } void @@ -316,6 +353,13 @@ cmd_push_button(struct buffer *buffer) else buffer->line_max++; } + break; + case LINE_DOWNLOAD: + case LINE_DOWNLOAD_DONE: + minibuffer_read("Execute: ", do_exec_command, + NULL); + snprintf(ministate.buf, sizeof(ministate.buf), + "xdg-open %s", vl->parent->alt); break; default: break; blob - 503a74eafeedeff94d7961e9fce4d014934399bc blob + a24490e0fe3d13833a74772f5f8b456ee44b3a06 --- sandbox.c +++ sandbox.c @@ -57,7 +57,11 @@ sandbox_ui_process(void) if (unveil(cache_path_base, "rwc") == -1) err(1, "unveil(%s)", cache_path_base); - if (pledge("stdio rpath wpath cpath unix tty", NULL) == -1) + if (unveil("/bin/sh", "rx") == -1) + err(1, "unveil(xdg-open)"); + + if (pledge("stdio rpath wpath cpath unix tty proc exec", + NULL) == -1) err(1, "pledge"); }