glib/glib/gjournal-private.c
Simon McVittie 6c3e52bb1d 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>
2022-07-25 01:00:54 +02:00

79 lines
2.3 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* 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 were 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