/*
* Copyright © 2014, 2016 Red Hat, Inc
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see .
*
* Authors:
* Alexander Larsson
* Matthias Clasen
*/
#pragma once
#include
#include
#include
#include
#include
#include
#include "glib-backports.h"
#define DESKTOP_PORTAL_OBJECT_PATH "/org/freedesktop/portal/desktop"
#define FLATPAK_METADATA_GROUP_APPLICATION "Application"
#define FLATPAK_METADATA_KEY_NAME "name"
#define FLATPAK_METADATA_GROUP_INSTANCE "Instance"
#define FLATPAK_METADATA_KEY_APP_PATH "app-path"
#define FLATPAK_METADATA_KEY_ORIGINAL_APP_PATH "original-app-path"
#define FLATPAK_METADATA_KEY_RUNTIME_PATH "runtime-path"
#define FLATPAK_METADATA_KEY_INSTANCE_ID "instance-id"
#define SNAP_METADATA_GROUP_INFO "Snap Info"
#define SNAP_METADATA_KEY_INSTANCE_NAME "InstanceName"
#define SNAP_METADATA_KEY_DESKTOP_FILE "DesktopFile"
#define SNAP_METADATA_KEY_NETWORK "HasNetworkStatus"
typedef enum
{
XDP_APP_INFO_KIND_HOST = 0,
XDP_APP_INFO_KIND_FLATPAK = 1,
XDP_APP_INFO_KIND_SNAP = 2,
} XdpAppInfoKind;
gint xdp_mkstempat (int dir_fd,
gchar *tmpl,
int flags,
int mode);
gboolean xdp_is_valid_app_id (const char *string);
char *xdp_get_app_id_from_desktop_id (const char *desktop_id);
gboolean xdp_validate_serialized_icon (GVariant *v,
gboolean bytes_only,
char **out_format,
char **out_size);
typedef void (*XdpPeerDiedCallback) (const char *name);
typedef struct _XdpAppInfo XdpAppInfo;
typedef int XdpFd;
G_DEFINE_AUTO_CLEANUP_FREE_FUNC(XdpFd, close, -1)
XdpAppInfo *xdp_app_info_ref (XdpAppInfo *app_info);
void xdp_app_info_unref (XdpAppInfo *app_info);
const char *xdp_app_info_get_id (XdpAppInfo *app_info);
char * xdp_app_info_get_instance (XdpAppInfo *app_info);
gboolean xdp_app_info_is_host (XdpAppInfo *app_info);
XdpAppInfoKind xdp_app_info_get_kind (XdpAppInfo *app_info);
gboolean xdp_app_info_supports_opath (XdpAppInfo *app_info);
char * xdp_app_info_remap_path (XdpAppInfo *app_info,
const char *path);
gboolean xdp_app_info_map_pids (XdpAppInfo *app_info,
pid_t *pids,
guint n_pids,
GError **error);
gboolean xdp_app_info_map_tids (XdpAppInfo *app_info,
pid_t owner_pid,
pid_t *tids,
guint n_tids,
GError **error);
gboolean xdp_app_info_pidfds_to_pids (XdpAppInfo *app_info,
const int *fds,
pid_t *pids,
gint count,
GError **error);
char * xdp_app_info_get_path_for_fd (XdpAppInfo *app_info,
int fd,
int require_st_mode,
struct stat *st_buf,
gboolean *writable_out,
GError **error);
gboolean xdp_app_info_has_network (XdpAppInfo *app_info);
XdpAppInfo *xdp_get_app_info_from_pid (pid_t pid,
GError **error);
GAppInfo * xdp_app_info_load_app_info (XdpAppInfo *app_info);
char ** xdp_app_info_rewrite_commandline (XdpAppInfo *app_info,
const char *const *commandline,
gboolean quote_escape);
char *xdp_app_info_get_tryexec_path (XdpAppInfo *app_info);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(XdpAppInfo, xdp_app_info_unref)
void xdp_set_documents_mountpoint (const char *path);
char *xdp_get_alternate_document_path (const char *path, const char *app_id);
XdpAppInfo *xdp_invocation_lookup_app_info_sync (GDBusMethodInvocation *invocation,
GCancellable *cancellable,
GError **error);
void xdp_connection_track_name_owners (GDBusConnection *connection,
XdpPeerDiedCallback peer_died_cb);
gboolean xdp_variant_contains_key (GVariant *dictionary,
const char *key);
typedef struct {
const char *key;
const GVariantType *type;
gboolean (* validate) (const char *key, GVariant *value, GVariant *options, GError **error);
} XdpOptionKey;
gboolean xdp_filter_options (GVariant *options_in,
GVariantBuilder *options_out,
XdpOptionKey *supported_options,
int n_supported_options,
GError **error);
typedef enum {
XDG_DESKTOP_PORTAL_ERROR_FAILED = 0,
XDG_DESKTOP_PORTAL_ERROR_INVALID_ARGUMENT,
XDG_DESKTOP_PORTAL_ERROR_NOT_FOUND,
XDG_DESKTOP_PORTAL_ERROR_EXISTS,
XDG_DESKTOP_PORTAL_ERROR_NOT_ALLOWED,
XDG_DESKTOP_PORTAL_ERROR_CANCELLED,
XDG_DESKTOP_PORTAL_ERROR_WINDOW_DESTROYED
} XdgDesktopPortalErrorEnum;
#define XDG_DESKTOP_PORTAL_ERROR xdg_desktop_portal_error_quark ()
GQuark xdg_desktop_portal_error_quark (void);
static inline int
xdp_steal_fd (int *fdp)
{
int fd = *fdp;
*fdp = -1;
return fd;
}
static inline void
xdp_close_fd (int *fdp)
{
int errsv;
g_assert (fdp);
int fd = xdp_steal_fd (fdp);
if (fd >= 0)
{
errsv = errno;
if (close (fd) < 0)
g_assert (errno != EBADF);
errno = errsv;
}
}
#define xdp_autofd __attribute__((cleanup(xdp_close_fd)))
#define XDP_AUTOLOCK(name) \
g_autoptr(GMutexLocker) G_PASTE (name ## locker, __LINE__) = \
g_mutex_locker_new (&G_LOCK_NAME (name)); \
(void) G_PASTE (name ## locker, __LINE__);
char * xdp_quote_argv (const char *argv[]);
gboolean xdp_spawn (GFile *dir,
char **output,
GSubprocessFlags flags,
GError **error,
const gchar *argv0,
va_list ap);
gboolean xdp_spawnv (GFile *dir,
char **output,
GSubprocessFlags flags,
GError **error,
const gchar * const *argv);
char * xdp_canonicalize_filename (const char *path);
gboolean xdp_has_path_prefix (const char *str,
const char *prefix);
/* exposed for the benefit of tests */
int _xdp_parse_cgroup_file (FILE *f,
gboolean *is_snap);
#ifdef HAVE_LIBSYSTEMD
char *_xdp_parse_app_id_from_unit_name (const char *unit);
#endif