From ae69039c28de318e3c259d9ac8139d1dfd26b807 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Fri, 26 Sep 2014 11:45:16 +0300 Subject: [PATCH] Use g_spawn_async() instead of fork()/exec() --- src/view.c | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/src/view.c b/src/view.c index c31402a..ad2339b 100644 --- a/src/view.c +++ b/src/view.c @@ -480,23 +480,28 @@ static int _error_text(char const * message, int ret) /* view_open_with */ static void _view_open_with(View * view, char const * program) { - pid_t pid; + char * argv[] = { NULL, NULL, NULL }; + const unsigned int flags = 0; + GError * error = NULL; if(program == NULL) { _view_open_with_dialog(view); return; } - if((pid = fork()) == -1) - _view_error(view, "fork", 0); - else if(pid == 0) + if((argv[0] = strdup(program)) == NULL) { - if(close(0) != 0) - _view_error(NULL, "stdin", 0); - execlp(program, program, view->pathname, NULL); - _view_error(NULL, program, 0); - exit(2); + _view_error(view, strerror(errno), 1); + return; } + argv[1] = view->pathname; + if(g_spawn_async(NULL, argv, NULL, flags, NULL, NULL, NULL, &error) + != TRUE) + { + _view_error(view, error->message, 1); + g_error_free(error); + } + free(argv[0]); }