From 300afb3265af4d9f011b11c50198c9049fa3c6de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Franti=C5=A1ek=20Boh=C3=A1=C4=8Dek?= Date: Tue, 22 Jun 2021 22:14:48 +0200 Subject: [PATCH] feat: add file execute process --- file-browser/include/file_execute.h | 17 ++++++++++ file-browser/src/file_execute.c | 50 +++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 file-browser/include/file_execute.h create mode 100644 file-browser/src/file_execute.c diff --git a/file-browser/include/file_execute.h b/file-browser/include/file_execute.h new file mode 100644 index 0000000000000000000000000000000000000000..eee51c3de9953ab082088236f451bbd3f51f3874 --- /dev/null +++ b/file-browser/include/file_execute.h @@ -0,0 +1,17 @@ +#include +#include + +typedef struct { + pid_t pid; + int output_signal; + bool exited; +} executing_file_t; + +typedef struct { + bool error; + executing_file_t file; +} executing_file_error_t; + +executing_file_error_t executing_file_execute(char *path, char *args); +int executing_file_wait(executing_file_t *file); +bool executing_file_has_ended(executing_file_t *file); diff --git a/file-browser/src/file_execute.c b/file-browser/src/file_execute.c new file mode 100644 index 0000000000000000000000000000000000000000..cb4dbeaa5fa4d7dc6c8a9d3699fd302c56275476 --- /dev/null +++ b/file-browser/src/file_execute.c @@ -0,0 +1,50 @@ +#include "file_execute.h" +#include +#include +#include +#include +#include + +executing_file_error_t executing_file_execute(char *path, char *args) { + executing_file_error_t ret; + pid_t pid = fork(); + + if (pid == -1) { + ret.error = true; + return ret; + } + + if (pid == 0) { + execl(path, args, (char*)NULL); + exit(errno); + } + + ret.error = false; + ret.file.pid = pid; + ret.file.output_signal = 0; + ret.file.exited = false; + return ret; +} + +int executing_file_wait(executing_file_t *file) { + pid_t data = waitpid(file->pid, &file->output_signal, 0); + if (data == -1) { + return -1; + } + + file->exited = true; + return file->output_signal; +} + +bool executing_file_has_ended(executing_file_t *file) { + if (file->exited) { + return true; + } + + if (waitpid(file->pid, &file->output_signal, WNOHANG) == 0) { + file->exited = true; + return true; + } + + return false; +}