[common] open: implement opening URLs in browser

This is currently only implemented for Linux.

On Windows, ShellExecute should be used, but that should be done when it's
actually needed so it could be tested.
This commit is contained in:
Quantum 2021-08-05 08:00:24 -04:00 committed by Geoffrey McRae
parent 2856928b57
commit 2f8ebc29e8
3 changed files with 94 additions and 0 deletions

View File

@ -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 <stdbool.h>
bool lgOpenURL(const char * url);
#endif

View File

@ -15,6 +15,7 @@ add_library(lg_common_platform_code STATIC
ivshmem.c
time.c
paths.c
open.c
)
if(ENABLE_BACKTRACE)

View File

@ -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 <errno.h>
#include <string.h>
#include <sys/wait.h>
#include <unistd.h>
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);
}