diff --git a/common/include/common/open.h b/common/include/common/open.h new file mode 100644 index 00000000..1ad6299d --- /dev/null +++ b/common/include/common/open.h @@ -0,0 +1,28 @@ +/** + * Looking Glass + * Copyright © 2017-2021 The Looking Glass Authors + * https://looking-glass.io + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#ifndef _LG_COMMON_OPEN_H_ +#define _LG_COMMON_OPEN_H_ + +#include + +bool lgOpenURL(const char * url); + +#endif diff --git a/common/src/platform/linux/CMakeLists.txt b/common/src/platform/linux/CMakeLists.txt index 4cdf0bda..d303fec0 100644 --- a/common/src/platform/linux/CMakeLists.txt +++ b/common/src/platform/linux/CMakeLists.txt @@ -15,6 +15,7 @@ add_library(lg_common_platform_code STATIC ivshmem.c time.c paths.c + open.c ) if(ENABLE_BACKTRACE) diff --git a/common/src/platform/linux/open.c b/common/src/platform/linux/open.c new file mode 100644 index 00000000..f42240af --- /dev/null +++ b/common/src/platform/linux/open.c @@ -0,0 +1,65 @@ +/** + * Looking Glass + * Copyright © 2017-2021 The Looking Glass Authors + * https://looking-glass.io + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 59 + * Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ + +#include "common/open.h" +#include "common/debug.h" + +#include +#include +#include +#include + +static bool xdgOpen(const char * path) +{ + pid_t pid = fork(); + if (pid == 0) + { + execlp("xdg-open", "xdg-open", path, NULL); + _exit(127); + } + else if (pid < 0) + { + DEBUG_ERROR("Failed to launch xdg-open: %s", strerror(errno)); + return false; + } + else + { + int status; + if (waitpid(pid, &status, 0) < 0) + { + DEBUG_ERROR("waitpid failed: %s", strerror(errno)); + return false; + } + + if (WIFEXITED(status) && WEXITSTATUS(status) == 0) + return true; + + if (WIFEXITED(status)) + DEBUG_ERROR("xdg-open exited with code %d", WEXITSTATUS(status)); + else + DEBUG_ERROR("xdg-open exited with signal: %s", strsignal(WTERMSIG(status))); + return false; + } +} + +bool lgOpenURL(const char * url) +{ + return xdgOpen(url); +}