[glib: 8/10] gmessages: Factor out _g_fd_is_journal into its own translation unit
- From: Philip Withnall <pwithnall src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [glib: 8/10] gmessages: Factor out _g_fd_is_journal into its own translation unit
- Date: Sun, 24 Jul 2022 23:31:33 +0000 (UTC)
commit 6c3e52bb1d3e7977b90c7a8d61cc464ca8e7fb42
Author: Simon McVittie <smcv collabora com>
Date: Thu Jul 14 14:30:02 2022 +0100
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>
glib/gjournal-private.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++++
glib/gjournal-private.h | 25 ++++++++++++++++
glib/gmessages.c | 32 +++++---------------
glib/meson.build | 4 +++
4 files changed, 114 insertions(+), 25 deletions(-)
---
diff --git a/glib/gjournal-private.c b/glib/gjournal-private.c
new file mode 100644
index 0000000000..f45e2cf1ce
--- /dev/null
+++ b/glib/gjournal-private.c
@@ -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
diff --git a/glib/gjournal-private.h b/glib/gjournal-private.h
new file mode 100644
index 0000000000..46e0e5a85c
--- /dev/null
+++ b/glib/gjournal-private.h
@@ -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
diff --git a/glib/gmessages.c b/glib/gmessages.c
index 97c5b31b1d..bbea253751 100644
--- a/glib/gmessages.c
+++ b/glib/gmessages.c
@@ -202,6 +202,10 @@
#include "gpattern.h"
#include "gthreadprivate.h"
+#if defined(__linux__) && !defined(__BIONIC__)
+#include "gjournal-private.h"
+#endif
+
#ifdef G_OS_UNIX
#include <unistd.h>
#endif
@@ -2223,32 +2227,10 @@ gboolean
g_log_writer_is_journald (gint output_fd)
{
#if defined(__linux__) && !defined(__BIONIC__)
- /* 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 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 _g_fd_is_journal (output_fd);
+#else
return FALSE;
+#endif
}
static void escape_string (GString *string);
diff --git a/glib/meson.build b/glib/meson.build
index 6062c11a1c..bcfcba94f7 100644
--- a/glib/meson.build
+++ b/glib/meson.build
@@ -336,6 +336,10 @@ else
platform_deps = []
endif
+if host_system == 'linux'
+ glib_sources += files('gjournal-private.c')
+endif
+
if glib_have_cocoa
glib_sources += files('gosxutils.m')
framework_dep = dependency('appleframeworks', modules : ['Foundation', 'CoreFoundation', 'AppKit'])
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]