mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2024-11-12 20:36:15 +01:00
gmessages: Factor out _g_fd_is_journal into its own translation unit
I want to use this in gio-launch-desktop, but gio-launch-desktop doesn't depend on GLib, so I can't just call g_log_writer_is_journald(). Signed-off-by: Simon McVittie <smcv@collabora.com>
This commit is contained in:
parent
763643ceaa
commit
6c3e52bb1d
78
glib/gjournal-private.c
Normal file
78
glib/gjournal-private.c
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016 Red Hat, Inc.
|
||||||
|
* Copyright 2016-2022 Collabora Ltd.
|
||||||
|
* Copyright 2017-2022 Endless OS Foundation, LLC
|
||||||
|
* Copyright 2018 Will Thompson
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
*
|
||||||
|
* This library 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.1 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "gjournal-private.h"
|
||||||
|
|
||||||
|
#if defined(__linux__) && !defined(__BIONIC__)
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reimplementation of g_str_has_prefix(), necessary when compiled into
|
||||||
|
* gio-launch-desktop.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
str_has_prefix (const char *str,
|
||||||
|
const char *prefix)
|
||||||
|
{
|
||||||
|
return strncmp (str, prefix, strlen (prefix)) == 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* _g_fd_is_journal:
|
||||||
|
* @output_fd: output file descriptor to check
|
||||||
|
*
|
||||||
|
* Same as g_log_writer_is_journald(), but with no GLib dependencies.
|
||||||
|
*
|
||||||
|
* Returns: 1 if @output_fd points to the journal, 0 otherwise
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
_g_fd_is_journal (int output_fd)
|
||||||
|
{
|
||||||
|
/* FIXME: Use the new journal API for detecting whether we’re writing to the
|
||||||
|
* journal. See: https://github.com/systemd/systemd/issues/2473
|
||||||
|
*/
|
||||||
|
union {
|
||||||
|
struct sockaddr_storage storage;
|
||||||
|
struct sockaddr sa;
|
||||||
|
struct sockaddr_un un;
|
||||||
|
} addr;
|
||||||
|
socklen_t addr_len;
|
||||||
|
int err;
|
||||||
|
|
||||||
|
if (output_fd < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* Namespaced journals start with `/run/systemd/journal.${name}/` (see
|
||||||
|
* `RuntimeDirectory=systemd/journal.%i` in `systemd-journald@.service`. The
|
||||||
|
* default journal starts with `/run/systemd/journal/`. */
|
||||||
|
memset (&addr, 0, sizeof (addr));
|
||||||
|
addr_len = sizeof(addr);
|
||||||
|
err = getpeername (output_fd, &addr.sa, &addr_len);
|
||||||
|
if (err == 0 && addr.storage.ss_family == AF_UNIX)
|
||||||
|
return (str_has_prefix (addr.un.sun_path, "/run/systemd/journal/") ||
|
||||||
|
str_has_prefix (addr.un.sun_path, "/run/systemd/journal."));
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
25
glib/gjournal-private.h
Normal file
25
glib/gjournal-private.h
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2016-2022 Collabora Ltd.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: LGPL-2.1-or-later
|
||||||
|
*
|
||||||
|
* This library 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.1 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __GLIB_JOURNAL_PRIVATE_H__
|
||||||
|
#define __GLIB_JOURNAL_PRIVATE_H__
|
||||||
|
|
||||||
|
int _g_fd_is_journal (int output_fd);
|
||||||
|
|
||||||
|
#endif
|
@ -202,6 +202,10 @@
|
|||||||
#include "gpattern.h"
|
#include "gpattern.h"
|
||||||
#include "gthreadprivate.h"
|
#include "gthreadprivate.h"
|
||||||
|
|
||||||
|
#if defined(__linux__) && !defined(__BIONIC__)
|
||||||
|
#include "gjournal-private.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef G_OS_UNIX
|
#ifdef G_OS_UNIX
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#endif
|
#endif
|
||||||
@ -2223,32 +2227,10 @@ gboolean
|
|||||||
g_log_writer_is_journald (gint output_fd)
|
g_log_writer_is_journald (gint output_fd)
|
||||||
{
|
{
|
||||||
#if defined(__linux__) && !defined(__BIONIC__)
|
#if defined(__linux__) && !defined(__BIONIC__)
|
||||||
/* FIXME: Use the new journal API for detecting whether we’re writing to the
|
return _g_fd_is_journal (output_fd);
|
||||||
* journal. See: https://github.com/systemd/systemd/issues/2473
|
#else
|
||||||
*/
|
|
||||||
union {
|
|
||||||
struct sockaddr_storage storage;
|
|
||||||
struct sockaddr sa;
|
|
||||||
struct sockaddr_un un;
|
|
||||||
} addr;
|
|
||||||
socklen_t addr_len;
|
|
||||||
int err;
|
|
||||||
|
|
||||||
if (output_fd < 0)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
/* Namespaced journals start with `/run/systemd/journal.${name}/` (see
|
|
||||||
* `RuntimeDirectory=systemd/journal.%i` in `systemd-journald@.service`. The
|
|
||||||
* default journal starts with `/run/systemd/journal/`. */
|
|
||||||
memset (&addr, 0, sizeof (addr));
|
|
||||||
addr_len = sizeof(addr);
|
|
||||||
err = getpeername (output_fd, &addr.sa, &addr_len);
|
|
||||||
if (err == 0 && addr.storage.ss_family == AF_UNIX)
|
|
||||||
return (g_str_has_prefix (addr.un.sun_path, "/run/systemd/journal/") ||
|
|
||||||
g_str_has_prefix (addr.un.sun_path, "/run/systemd/journal."));
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void escape_string (GString *string);
|
static void escape_string (GString *string);
|
||||||
|
@ -336,6 +336,10 @@ else
|
|||||||
platform_deps = []
|
platform_deps = []
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if host_system == 'linux'
|
||||||
|
glib_sources += files('gjournal-private.c')
|
||||||
|
endif
|
||||||
|
|
||||||
if glib_have_cocoa
|
if glib_have_cocoa
|
||||||
glib_sources += files('gosxutils.m')
|
glib_sources += files('gosxutils.m')
|
||||||
framework_dep = dependency('appleframeworks', modules : ['Foundation', 'CoreFoundation', 'AppKit'])
|
framework_dep = dependency('appleframeworks', modules : ['Foundation', 'CoreFoundation', 'AppKit'])
|
||||||
|
Loading…
Reference in New Issue
Block a user