systemd: split "nm-sd.h" out of "nm-sd-adapt.h"
Now we have: "nm-sd.h" is a header file of NetworkManager with utilities related to systemd. It can be used anywhere freely. Also, systemd headers that are considered public API (like "sd-event.h") can be used without restrictions. When compiling the systemd sources, we always must include "nm-sd-adapt.h" as first. Similarly, systemd headers must not include "nm-sd-adapt.h", because they are either public (in which case the adapter is not needed) or they are internal (in which case they are themself included via a systemd source). Sometimes, we must internal API (like "dhcp-lease-internal.h"). In this case, we also must include "nm-sd-adapt.h".
This commit is contained in:
@@ -64,6 +64,8 @@ SYSTEMD_NM_CFLAGS_PATHS = \
|
|||||||
-I$(top_srcdir)/src/systemd
|
-I$(top_srcdir)/src/systemd
|
||||||
|
|
||||||
libsystemd_nm_la_SOURCES = \
|
libsystemd_nm_la_SOURCES = \
|
||||||
|
systemd/nm-sd.c \
|
||||||
|
systemd/nm-sd.h \
|
||||||
systemd/nm-sd-adapt.c \
|
systemd/nm-sd-adapt.c \
|
||||||
systemd/nm-sd-adapt.h \
|
systemd/nm-sd-adapt.h \
|
||||||
systemd/src/basic/alloc-util.c \
|
systemd/src/basic/alloc-util.c \
|
||||||
|
@@ -20,15 +20,19 @@
|
|||||||
|
|
||||||
#include "nm-default.h"
|
#include "nm-default.h"
|
||||||
|
|
||||||
|
#include "nm-lldp-listener.h"
|
||||||
|
|
||||||
#include <net/ethernet.h>
|
#include <net/ethernet.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "sd-lldp.h"
|
|
||||||
#include "lldp.h"
|
|
||||||
#include "nm-lldp-listener.h"
|
|
||||||
#include "nm-platform.h"
|
#include "nm-platform.h"
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
|
|
||||||
|
#include "sd-lldp.h"
|
||||||
|
|
||||||
|
#include "nm-sd-adapt.h"
|
||||||
|
#include "lldp.h"
|
||||||
|
|
||||||
#define MAX_NEIGHBORS 4096
|
#define MAX_NEIGHBORS 4096
|
||||||
#define MIN_UPDATE_INTERVAL 2
|
#define MIN_UPDATE_INTERVAL 2
|
||||||
|
|
||||||
|
@@ -27,8 +27,9 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include "nm-lldp-listener.h"
|
#include "nm-lldp-listener.h"
|
||||||
#include "nm-sd-adapt.h"
|
#include "nm-sd.h"
|
||||||
|
|
||||||
|
#include "nm-sd-adapt.h"
|
||||||
#include "lldp.h"
|
#include "lldp.h"
|
||||||
|
|
||||||
#include "test-common.h"
|
#include "test-common.h"
|
||||||
|
@@ -38,7 +38,6 @@
|
|||||||
#include "sd-dhcp-client.h"
|
#include "sd-dhcp-client.h"
|
||||||
#include "sd-dhcp6-client.h"
|
#include "sd-dhcp6-client.h"
|
||||||
|
|
||||||
/* we use a private systemd header, thus need to include nm-sd-adapt.h. */
|
|
||||||
#include "nm-sd-adapt.h"
|
#include "nm-sd-adapt.h"
|
||||||
#include "dhcp-lease-internal.h"
|
#include "dhcp-lease-internal.h"
|
||||||
|
|
||||||
|
@@ -35,9 +35,9 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
|
|
||||||
|
#include "main-utils.h"
|
||||||
#include "nm-dbus-interface.h"
|
#include "nm-dbus-interface.h"
|
||||||
#include "NetworkManagerUtils.h"
|
#include "NetworkManagerUtils.h"
|
||||||
#include "main-utils.h"
|
|
||||||
#include "nm-manager.h"
|
#include "nm-manager.h"
|
||||||
#include "nm-linux-platform.h"
|
#include "nm-linux-platform.h"
|
||||||
#include "nm-bus-manager.h"
|
#include "nm-bus-manager.h"
|
||||||
@@ -50,7 +50,7 @@
|
|||||||
#include "nm-auth-manager.h"
|
#include "nm-auth-manager.h"
|
||||||
#include "nm-core-internal.h"
|
#include "nm-core-internal.h"
|
||||||
#include "nm-exported-object.h"
|
#include "nm-exported-object.h"
|
||||||
#include "nm-sd-adapt.h"
|
#include "nm-sd.h"
|
||||||
|
|
||||||
#if !defined(NM_DIST_VERSION)
|
#if !defined(NM_DIST_VERSION)
|
||||||
# define NM_DIST_VERSION VERSION
|
# define NM_DIST_VERSION VERSION
|
||||||
|
@@ -36,15 +36,15 @@
|
|||||||
* Forward declare if_nametoindex. */
|
* Forward declare if_nametoindex. */
|
||||||
extern unsigned int if_nametoindex (const char *__ifname);
|
extern unsigned int if_nametoindex (const char *__ifname);
|
||||||
|
|
||||||
|
#include "main-utils.h"
|
||||||
#include "NetworkManagerUtils.h"
|
#include "NetworkManagerUtils.h"
|
||||||
#include "nm-linux-platform.h"
|
#include "nm-linux-platform.h"
|
||||||
#include "nm-dhcp-manager.h"
|
#include "nm-dhcp-manager.h"
|
||||||
#include "main-utils.h"
|
|
||||||
#include "nm-rdisc.h"
|
#include "nm-rdisc.h"
|
||||||
#include "nm-lndp-rdisc.h"
|
#include "nm-lndp-rdisc.h"
|
||||||
#include "nm-utils.h"
|
#include "nm-utils.h"
|
||||||
#include "nm-setting-ip6-config.h"
|
#include "nm-setting-ip6-config.h"
|
||||||
#include "nm-sd-adapt.h"
|
#include "nm-sd.h"
|
||||||
|
|
||||||
#if !defined(NM_DIST_VERSION)
|
#if !defined(NM_DIST_VERSION)
|
||||||
# define NM_DIST_VERSION VERSION
|
# define NM_DIST_VERSION VERSION
|
||||||
|
@@ -13,14 +13,13 @@
|
|||||||
* with this program; if not, write to the Free Software Foundation, Inc.,
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2014 Red Hat, Inc.
|
* Copyright (C) 2014 - 2016 Red Hat, Inc.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "nm-default.h"
|
#include "nm-default.h"
|
||||||
|
|
||||||
#include "nm-sd-adapt.h"
|
#include "nm-sd-adapt.h"
|
||||||
|
|
||||||
#include "sd-event.h"
|
|
||||||
#include "fd-util.h"
|
#include "fd-util.h"
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@@ -31,115 +30,5 @@ asynchronous_close (int fd) {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*****************************************************************************
|
|
||||||
* Integrating sd_event into glib. Taken and adjusted from
|
|
||||||
* https://www.freedesktop.org/software/systemd/man/sd_event_get_fd.html
|
|
||||||
*****************************************************************************/
|
|
||||||
|
|
||||||
typedef struct SDEventSource {
|
|
||||||
GSource source;
|
|
||||||
GPollFD pollfd;
|
|
||||||
sd_event *event;
|
|
||||||
guint *default_source_id;
|
|
||||||
} SDEventSource;
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
event_prepare (GSource *source, gint *timeout_)
|
|
||||||
{
|
|
||||||
return sd_event_prepare (((SDEventSource *) source)->event) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
event_check (GSource *source)
|
|
||||||
{
|
|
||||||
return sd_event_wait (((SDEventSource *) source)->event, 0) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
event_dispatch (GSource *source, GSourceFunc callback, gpointer user_data)
|
|
||||||
{
|
|
||||||
return sd_event_dispatch (((SDEventSource *)source)->event) > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
event_finalize (GSource *source)
|
|
||||||
{
|
|
||||||
SDEventSource *s;
|
|
||||||
|
|
||||||
s = (SDEventSource *) source;
|
|
||||||
sd_event_unref (s->event);
|
|
||||||
if (s->default_source_id)
|
|
||||||
*s->default_source_id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SDEventSource *
|
|
||||||
event_create_source (sd_event *event, guint *default_source_id)
|
|
||||||
{
|
|
||||||
static GSourceFuncs event_funcs = {
|
|
||||||
.prepare = event_prepare,
|
|
||||||
.check = event_check,
|
|
||||||
.dispatch = event_dispatch,
|
|
||||||
.finalize = event_finalize,
|
|
||||||
};
|
|
||||||
SDEventSource *source;
|
|
||||||
|
|
||||||
g_return_val_if_fail (event, NULL);
|
|
||||||
|
|
||||||
source = (SDEventSource *) g_source_new (&event_funcs, sizeof (SDEventSource));
|
|
||||||
|
|
||||||
source->event = sd_event_ref (event);
|
|
||||||
source->pollfd.fd = sd_event_get_fd (event);
|
|
||||||
source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
|
|
||||||
source->default_source_id = default_source_id;
|
|
||||||
|
|
||||||
g_source_add_poll ((GSource *) source, &source->pollfd);
|
|
||||||
|
|
||||||
return source;
|
|
||||||
}
|
|
||||||
|
|
||||||
static guint
|
|
||||||
event_attach (sd_event *event, GMainContext *context)
|
|
||||||
{
|
|
||||||
SDEventSource *source;
|
|
||||||
guint id;
|
|
||||||
int r;
|
|
||||||
sd_event *e = event;
|
|
||||||
guint *p_default_source_id = NULL;
|
|
||||||
|
|
||||||
if (!e) {
|
|
||||||
static guint default_source_id = 0;
|
|
||||||
|
|
||||||
if (default_source_id) {
|
|
||||||
/* The default event cannot be registered multiple times. */
|
|
||||||
g_return_val_if_reached (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
r = sd_event_default (&e);
|
|
||||||
if (r < 0)
|
|
||||||
g_return_val_if_reached (0);
|
|
||||||
|
|
||||||
p_default_source_id = &default_source_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
source = event_create_source (e, p_default_source_id);
|
|
||||||
id = g_source_attach ((GSource *) source, context);
|
|
||||||
g_source_unref ((GSource *) source);
|
|
||||||
|
|
||||||
|
|
||||||
if (!event) {
|
|
||||||
*p_default_source_id = id;
|
|
||||||
sd_event_unref (e);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_return_val_if_fail (id, 0);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
guint
|
|
||||||
nm_sd_event_attach_default (void)
|
|
||||||
{
|
|
||||||
return event_attach (NULL, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
@@ -26,8 +26,6 @@
|
|||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
guint nm_sd_event_attach_default (void);
|
|
||||||
|
|
||||||
#define noreturn G_GNUC_NORETURN
|
#define noreturn G_GNUC_NORETURN
|
||||||
|
|
||||||
#ifndef CLOCK_BOOTTIME
|
#ifndef CLOCK_BOOTTIME
|
||||||
|
136
src/systemd/nm-sd.c
Normal file
136
src/systemd/nm-sd.c
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||||
|
/* 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, 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.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 - 2016 Red Hat, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "nm-default.h"
|
||||||
|
|
||||||
|
#include "nm-sd.h"
|
||||||
|
|
||||||
|
#include "sd-event.h"
|
||||||
|
|
||||||
|
/*****************************************************************************
|
||||||
|
* Integrating sd_event into glib. Taken and adjusted from
|
||||||
|
* https://www.freedesktop.org/software/systemd/man/sd_event_get_fd.html
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
typedef struct SDEventSource {
|
||||||
|
GSource source;
|
||||||
|
GPollFD pollfd;
|
||||||
|
sd_event *event;
|
||||||
|
guint *default_source_id;
|
||||||
|
} SDEventSource;
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
event_prepare (GSource *source, gint *timeout_)
|
||||||
|
{
|
||||||
|
return sd_event_prepare (((SDEventSource *) source)->event) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
event_check (GSource *source)
|
||||||
|
{
|
||||||
|
return sd_event_wait (((SDEventSource *) source)->event, 0) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
event_dispatch (GSource *source, GSourceFunc callback, gpointer user_data)
|
||||||
|
{
|
||||||
|
return sd_event_dispatch (((SDEventSource *)source)->event) > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
event_finalize (GSource *source)
|
||||||
|
{
|
||||||
|
SDEventSource *s;
|
||||||
|
|
||||||
|
s = (SDEventSource *) source;
|
||||||
|
sd_event_unref (s->event);
|
||||||
|
if (s->default_source_id)
|
||||||
|
*s->default_source_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SDEventSource *
|
||||||
|
event_create_source (sd_event *event, guint *default_source_id)
|
||||||
|
{
|
||||||
|
static GSourceFuncs event_funcs = {
|
||||||
|
.prepare = event_prepare,
|
||||||
|
.check = event_check,
|
||||||
|
.dispatch = event_dispatch,
|
||||||
|
.finalize = event_finalize,
|
||||||
|
};
|
||||||
|
SDEventSource *source;
|
||||||
|
|
||||||
|
g_return_val_if_fail (event, NULL);
|
||||||
|
|
||||||
|
source = (SDEventSource *) g_source_new (&event_funcs, sizeof (SDEventSource));
|
||||||
|
|
||||||
|
source->event = sd_event_ref (event);
|
||||||
|
source->pollfd.fd = sd_event_get_fd (event);
|
||||||
|
source->pollfd.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
|
||||||
|
source->default_source_id = default_source_id;
|
||||||
|
|
||||||
|
g_source_add_poll ((GSource *) source, &source->pollfd);
|
||||||
|
|
||||||
|
return source;
|
||||||
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
event_attach (sd_event *event, GMainContext *context)
|
||||||
|
{
|
||||||
|
SDEventSource *source;
|
||||||
|
guint id;
|
||||||
|
int r;
|
||||||
|
sd_event *e = event;
|
||||||
|
guint *p_default_source_id = NULL;
|
||||||
|
|
||||||
|
if (!e) {
|
||||||
|
static guint default_source_id = 0;
|
||||||
|
|
||||||
|
if (default_source_id) {
|
||||||
|
/* The default event cannot be registered multiple times. */
|
||||||
|
g_return_val_if_reached (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
r = sd_event_default (&e);
|
||||||
|
if (r < 0)
|
||||||
|
g_return_val_if_reached (0);
|
||||||
|
|
||||||
|
p_default_source_id = &default_source_id;
|
||||||
|
}
|
||||||
|
|
||||||
|
source = event_create_source (e, p_default_source_id);
|
||||||
|
id = g_source_attach ((GSource *) source, context);
|
||||||
|
g_source_unref ((GSource *) source);
|
||||||
|
|
||||||
|
|
||||||
|
if (!event) {
|
||||||
|
*p_default_source_id = id;
|
||||||
|
sd_event_unref (e);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_return_val_if_fail (id, 0);
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
guint
|
||||||
|
nm_sd_event_attach_default (void)
|
||||||
|
{
|
||||||
|
return event_attach (NULL, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
25
src/systemd/nm-sd.h
Normal file
25
src/systemd/nm-sd.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
/* -*- Mode: C; tab-width: 4; indent-tabs-mode: t; c-basic-offset: 4 -*- */
|
||||||
|
/* 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, 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.,
|
||||||
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 - 2016 Red Hat, Inc.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __NM_SD_H__
|
||||||
|
#define __NM_SD_H__
|
||||||
|
|
||||||
|
guint nm_sd_event_attach_default (void);
|
||||||
|
|
||||||
|
#endif /* __NM_SD_H__ */
|
||||||
|
|
@@ -19,10 +19,11 @@
|
|||||||
|
|
||||||
#include "nm-default.h"
|
#include "nm-default.h"
|
||||||
|
|
||||||
|
#include "nm-sd.h"
|
||||||
|
|
||||||
#include "sd-dhcp-client.h"
|
#include "sd-dhcp-client.h"
|
||||||
#include "sd-lldp.h"
|
#include "sd-lldp.h"
|
||||||
#include "sd-event.h"
|
#include "sd-event.h"
|
||||||
#include "nm-sd-adapt.h"
|
|
||||||
|
|
||||||
#include "nm-test-utils.h"
|
#include "nm-test-utils.h"
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user