* [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET
@ 2018-11-30 10:20 Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 02/10] share/mainloop: Add watchdog support Luiz Augusto von Dentz
` (9 more replies)
0 siblings, 10 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds handling of systemd NOTIFY_SOCKET so application using
mainloop instance do properly notify systemd what is their state.
---
Makefile.am | 8 +++-
src/shared/mainloop-glib.c | 6 +++
src/shared/mainloop-notify.c | 93 ++++++++++++++++++++++++++++++++++++
src/shared/mainloop-notify.h | 25 ++++++++++
src/shared/mainloop.c | 10 ++++
src/shared/mainloop.h | 1 +
6 files changed, 141 insertions(+), 2 deletions(-)
create mode 100644 src/shared/mainloop-notify.c
create mode 100644 src/shared/mainloop-notify.h
diff --git a/Makefile.am b/Makefile.am
index 0b26ccc3e..124c32482 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -130,12 +130,16 @@ endif
src_libshared_glib_la_SOURCES = $(shared_sources) \
src/shared/io-glib.c \
src/shared/timeout-glib.c \
- src/shared/mainloop-glib.c
+ src/shared/mainloop-glib.c \
+ src/shared/mainloop-notify.h \
+ src/shared/mainloop-notify.c
src_libshared_mainloop_la_SOURCES = $(shared_sources) \
src/shared/io-mainloop.c \
src/shared/timeout-mainloop.c \
- src/shared/mainloop.h src/shared/mainloop.c
+ src/shared/mainloop.h src/shared/mainloop.c \
+ src/shared/mainloop-notify.h \
+ src/shared/mainloop-notify.c
if ELL
src_libshared_ell_la_SOURCES = $(shared_sources) \
diff --git a/src/shared/mainloop-glib.c b/src/shared/mainloop-glib.c
index 8436969bb..42abfddf8 100644
--- a/src/shared/mainloop-glib.c
+++ b/src/shared/mainloop-glib.c
@@ -36,6 +36,7 @@
#include <glib.h>
#include "mainloop.h"
+#include "mainloop-notify.h"
static GMainLoop *main_loop;
static int exit_status;
@@ -43,6 +44,7 @@ static int exit_status;
void mainloop_init(void)
{
main_loop = g_main_loop_new(NULL, FALSE);
+ mainloop_notify_init();
}
void mainloop_quit(void)
@@ -51,6 +53,8 @@ void mainloop_quit(void)
return;
g_main_loop_quit(main_loop);
+
+ mainloop_sd_notify("STOPPING=1");
}
void mainloop_exit_success(void)
@@ -75,6 +79,8 @@ int mainloop_run(void)
g_main_loop_unref(main_loop);
main_loop = NULL;
+ mainloop_notify_exit();
+
return exit_status;
}
diff --git a/src/shared/mainloop-notify.c b/src/shared/mainloop-notify.c
new file mode 100644
index 000000000..fdc2f25ec
--- /dev/null
+++ b/src/shared/mainloop-notify.c
@@ -0,0 +1,93 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2018 Intel Corporation. All rights reserved.
+ *
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+
+#include <sys/socket.h>
+#include <sys/un.h>
+
+#include "mainloop.h"
+#include "mainloop-notify.h"
+
+static int notify_fd = -1;
+
+void mainloop_notify_init(void)
+{
+ const char *sock;
+ struct sockaddr_un addr;
+
+ sock = getenv("NOTIFY_SOCKET");
+ if (!sock)
+ return;
+
+ /* check for abstract socket or absolute path */
+ if (sock[0] != '@' && sock[0] != '/')
+ return;
+
+ notify_fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
+ if (notify_fd < 0)
+ return;
+
+ memset(&addr, 0, sizeof(addr));
+ addr.sun_family = AF_UNIX;
+ strncpy(addr.sun_path, sock, sizeof(addr.sun_path) - 1);
+
+ if (addr.sun_path[0] == '@')
+ addr.sun_path[0] = '\0';
+
+ if (bind(notify_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
+ close(notify_fd);
+ notify_fd = -1;
+ }
+}
+
+void mainloop_notify_exit(void)
+{
+ if (notify_fd > 0) {
+ close(notify_fd);
+ notify_fd = -1;
+ }
+}
+
+int mainloop_sd_notify(const char *state)
+{
+ int err;
+
+ if (notify_fd <= 0)
+ return -ENOTCONN;
+
+ err = send(notify_fd, state, strlen(state), MSG_NOSIGNAL);
+ if (err < 0)
+ return -errno;
+
+ return err;
+}
diff --git a/src/shared/mainloop-notify.h b/src/shared/mainloop-notify.h
new file mode 100644
index 000000000..721b5fbed
--- /dev/null
+++ b/src/shared/mainloop-notify.h
@@ -0,0 +1,25 @@
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2018 Intel Corporation. All rights reserved.
+ *
+ *
+ * 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, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+void mainloop_notify_init(void);
+void mainloop_notify_exit(void);
diff --git a/src/shared/mainloop.c b/src/shared/mainloop.c
index e6ab9c43d..e9ec6e8cd 100644
--- a/src/shared/mainloop.c
+++ b/src/shared/mainloop.c
@@ -30,13 +30,17 @@
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
+#include <stddef.h>
#include <string.h>
#include <signal.h>
#include <sys/signalfd.h>
#include <sys/timerfd.h>
#include <sys/epoll.h>
+#include <sys/socket.h>
+#include <sys/un.h>
#include "mainloop.h"
+#include "mainloop-notify.h"
#define MAX_EPOLL_EVENTS 10
@@ -83,11 +87,15 @@ void mainloop_init(void)
mainloop_list[i] = NULL;
epoll_terminate = 0;
+
+ mainloop_notify_init();
}
void mainloop_quit(void)
{
epoll_terminate = 1;
+
+ mainloop_sd_notify("STOPPING=1");
}
void mainloop_exit_success(void)
@@ -183,6 +191,8 @@ int mainloop_run(void)
close(epoll_fd);
epoll_fd = 0;
+ mainloop_notify_exit();
+
return exit_status;
}
diff --git a/src/shared/mainloop.h b/src/shared/mainloop.h
index b83caabc8..73ed81187 100644
--- a/src/shared/mainloop.h
+++ b/src/shared/mainloop.h
@@ -49,3 +49,4 @@ int mainloop_remove_timeout(int id);
int mainloop_set_signal(sigset_t *mask, mainloop_signal_func callback,
void *user_data, mainloop_destroy_func destroy);
+int mainloop_sd_notify(const char *state);
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 02/10] share/mainloop: Add watchdog support
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
@ 2018-11-30 10:20 ` Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 03/10] tool/btmon-logger: Use mainloop_notify instead of sd_notify Luiz Augusto von Dentz
` (8 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This adds watchdog notification support by sending "WATCHDOG=1" twice
as frequent as required by WATCHDOG_USEC.
---
src/shared/mainloop-notify.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/src/shared/mainloop-notify.c b/src/shared/mainloop-notify.c
index fdc2f25ec..2e3b08f06 100644
--- a/src/shared/mainloop-notify.c
+++ b/src/shared/mainloop-notify.c
@@ -37,13 +37,27 @@
#include "mainloop.h"
#include "mainloop-notify.h"
+#include "timeout.h"
+
+#define WATCHDOG_TRIGGER_FREQ 2
static int notify_fd = -1;
+static unsigned int watchdog;
+
+static bool watchdog_callback(void *user_data)
+{
+ mainloop_sd_notify("WATCHDOG=1");
+
+ return true;
+}
+
void mainloop_notify_init(void)
{
const char *sock;
struct sockaddr_un addr;
+ const char *watchdog_usec;
+ int msec;
sock = getenv("NOTIFY_SOCKET");
if (!sock)
@@ -67,7 +81,19 @@ void mainloop_notify_init(void)
if (bind(notify_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
close(notify_fd);
notify_fd = -1;
+ return;
}
+
+ watchdog_usec = getenv("WATCHDOG_USEC");
+ if (!watchdog_usec)
+ return;
+
+ msec = atoi(watchdog_usec) / 1000;
+ if (msec < 0)
+ return;
+
+ watchdog = timeout_add(msec / WATCHDOG_TRIGGER_FREQ,
+ watchdog_callback, NULL, NULL);
}
void mainloop_notify_exit(void)
@@ -76,6 +102,8 @@ void mainloop_notify_exit(void)
close(notify_fd);
notify_fd = -1;
}
+
+ timeout_remove(watchdog);
}
int mainloop_sd_notify(const char *state)
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 03/10] tool/btmon-logger: Use mainloop_notify instead of sd_notify
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 02/10] share/mainloop: Add watchdog support Luiz Augusto von Dentz
@ 2018-11-30 10:20 ` Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 04/10] core: Use mainloop_sd_notify " Luiz Augusto von Dentz
` (7 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
mainloop_notify takes care of sending the messages to NOTIFY_SOCKET and
includes the handling of WATCHDOG_USEC as well.
---
tools/btmon-logger.c | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/tools/btmon-logger.c b/tools/btmon-logger.c
index c3ba17939..1a42824ee 100644
--- a/tools/btmon-logger.c
+++ b/tools/btmon-logger.c
@@ -48,8 +48,6 @@
#include "src/shared/mainloop.h"
#include "src/shared/btsnoop.h"
-#include "src/systemd.h"
-
#define MONITOR_INDEX_NONE 0xffff
struct monitor_hdr {
@@ -283,7 +281,7 @@ int main(int argc, char *argv[])
mainloop_init();
- sd_notify(0, "STATUS=Starting up");
+ mainloop_sd_notify("STATUS=Starting up");
while (true) {
int opt;
@@ -375,12 +373,12 @@ int main(int argc, char *argv[])
printf("Bluetooth monitor logger ver %s\n", VERSION);
- sd_notify(0, "STATUS=Running");
- sd_notify(0, "READY=1");
+ mainloop_sd_notify("STATUS=Running");
+ mainloop_sd_notify("READY=1");
exit_status = mainloop_run();
- sd_notify(0, "STATUS=Quitting");
+ mainloop_sd_notify("STATUS=Quitting");
btsnoop_unref(btsnoop_file);
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 04/10] core: Use mainloop_sd_notify instead of sd_notify
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 02/10] share/mainloop: Add watchdog support Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 03/10] tool/btmon-logger: Use mainloop_notify instead of sd_notify Luiz Augusto von Dentz
@ 2018-11-30 10:20 ` Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 05/10] core: Remove old code related to sd_notify Luiz Augusto von Dentz
` (6 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
mainloop_sd_notify takes care of sending the messages to NOTIFY_SOCKET
and includes the handling of WATCHDOG_USEC as well.
---
src/main.c | 51 +++++++++++----------------------------------------
1 file changed, 11 insertions(+), 40 deletions(-)
diff --git a/src/main.c b/src/main.c
index 4716f5388..7ab1349cc 100644
--- a/src/main.c
+++ b/src/main.c
@@ -51,6 +51,7 @@
#include "backtrace.h"
#include "shared/att-types.h"
+#include "shared/mainloop.h"
#include "lib/uuid.h"
#include "hcid.h"
#include "sdpd.h"
@@ -59,7 +60,6 @@
#include "dbus-common.h"
#include "agent.h"
#include "profile.h"
-#include "systemd.h"
#define BLUEZ_NAME "org.bluez"
@@ -486,11 +486,9 @@ static void log_handler(const gchar *log_domain, GLogLevelFlags log_level,
btd_backtrace(0xffff);
}
-static GMainLoop *event_loop;
-
void btd_exit(void)
{
- g_main_loop_quit(event_loop);
+ mainloop_quit();
}
static gboolean quit_eventloop(gpointer user_data)
@@ -524,7 +522,7 @@ static gboolean signal_handler(GIOChannel *channel, GIOCondition cond,
g_timeout_add_seconds(SHUTDOWN_GRACE_SECONDS,
quit_eventloop, NULL);
- sd_notify(0, "STATUS=Powering down");
+ mainloop_sd_notify("STATUS=Powering down");
adapter_shutdown();
}
@@ -616,7 +614,7 @@ static void disconnect_dbus(void)
static void disconnected_dbus(DBusConnection *conn, void *data)
{
info("Disconnected from D-Bus. Exiting.");
- g_main_loop_quit(event_loop);
+ mainloop_quit();
}
static int connect_dbus(void)
@@ -644,13 +642,6 @@ static int connect_dbus(void)
return 0;
}
-static gboolean watchdog_callback(gpointer user_data)
-{
- sd_notify(0, "WATCHDOG=1");
-
- return TRUE;
-}
-
static gboolean parse_debug(const char *key, const char *value,
gpointer user_data, GError **error)
{
@@ -691,8 +682,7 @@ int main(int argc, char *argv[])
uint16_t sdp_mtu = 0;
uint32_t sdp_flags = 0;
int gdbus_flags = 0;
- guint signal, watchdog;
- const char *watchdog_usec;
+ guint signal;
init_defaults();
@@ -719,7 +709,7 @@ int main(int argc, char *argv[])
btd_backtrace_init();
- event_loop = g_main_loop_new(NULL, FALSE);
+ mainloop_init();
signal = setup_signalfd();
@@ -729,7 +719,7 @@ int main(int argc, char *argv[])
G_LOG_FLAG_RECURSION,
log_handler, NULL);
- sd_notify(0, "STATUS=Starting up");
+ mainloop_sd_notify("STATUS=Starting up");
if (option_configfile)
main_conf_file_path = option_configfile;
@@ -788,26 +778,12 @@ int main(int argc, char *argv[])
DBG("Entering main loop");
- sd_notify(0, "STATUS=Running");
- sd_notify(0, "READY=1");
+ mainloop_sd_notify("STATUS=Running");
+ mainloop_sd_notify("READY=1");
- watchdog_usec = getenv("WATCHDOG_USEC");
- if (watchdog_usec) {
- unsigned int seconds;
+ mainloop_run();
- seconds = atoi(watchdog_usec) / (1000 * 1000);
- info("Watchdog timeout is %d seconds", seconds);
-
- watchdog = g_timeout_add_seconds_full(G_PRIORITY_HIGH,
- seconds / 2,
- watchdog_callback,
- NULL, NULL);
- } else
- watchdog = 0;
-
- g_main_loop_run(event_loop);
-
- sd_notify(0, "STATUS=Quitting");
+ mainloop_sd_notify("STATUS=Quitting");
g_source_remove(signal);
@@ -824,8 +800,6 @@ int main(int argc, char *argv[])
if (main_opts.mode != BT_MODE_LE)
stop_sdp_server();
- g_main_loop_unref(event_loop);
-
if (main_conf)
g_key_file_free(main_conf);
@@ -833,9 +807,6 @@ int main(int argc, char *argv[])
info("Exit");
- if (watchdog > 0)
- g_source_remove(watchdog);
-
__btd_log_cleanup();
return 0;
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 05/10] core: Remove old code related to sd_notify
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
` (2 preceding siblings ...)
2018-11-30 10:20 ` [PATCH v3 04/10] core: Use mainloop_sd_notify " Luiz Augusto von Dentz
@ 2018-11-30 10:20 ` Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 06/10] shared/timeout-glib: Check 0 id when removing timeout Luiz Augusto von Dentz
` (5 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This is no longer needed since mainloop instances can handle it now.
---
Makefile.am | 1 -
Makefile.tools | 2 +-
src/systemd.c | 107 -------------------------------------------------
src/systemd.h | 28 -------------
4 files changed, 1 insertion(+), 137 deletions(-)
delete mode 100644 src/systemd.c
delete mode 100644 src/systemd.h
diff --git a/Makefile.am b/Makefile.am
index 124c32482..a69baea10 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -185,7 +185,6 @@ src_bluetoothd_SOURCES = $(builtin_sources) \
src/bluetooth.ver \
src/main.c src/log.h src/log.c \
src/backtrace.h src/backtrace.c \
- src/systemd.h src/systemd.c \
src/rfkill.c src/hcid.h src/sdpd.h \
src/sdpd-server.c src/sdpd-request.c \
src/sdpd-service.c src/sdpd-database.c \
diff --git a/Makefile.tools b/Makefile.tools
index 35412ca61..d3d901bc9 100644
--- a/Makefile.tools
+++ b/Makefile.tools
@@ -46,7 +46,7 @@ endif
if LOGGER
libexec_PROGRAMS += tools/btmon-logger
-tools_btmon_logger_SOURCES = tools/btmon-logger.c src/systemd.c src/systemd.h
+tools_btmon_logger_SOURCES = tools/btmon-logger.c
tools_btmon_logger_LDADD = src/libshared-mainloop.la
tools_btmon_logger_DEPENDENCIES = src/libshared-mainloop.la \
tools/bluetooth-logger.service
diff --git a/src/systemd.c b/src/systemd.c
deleted file mode 100644
index 0a4b35d06..000000000
--- a/src/systemd.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2012 Intel Corporation. All rights reserved.
- *
- *
- * 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 of the License, 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 St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <errno.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-
-#include "systemd.h"
-
-int sd_listen_fds(int unset_environment)
-{
- return 0;
-}
-
-int sd_notify(int unset_environment, const char *state)
-{
- const char *sock;
- struct sockaddr_un addr;
- struct msghdr msghdr;
- struct iovec iovec;
- int fd, err;
-
- if (!state) {
- err = -EINVAL;
- goto done;
- }
-
- sock = getenv("NOTIFY_SOCKET");
- if (!sock)
- return 0;
-
- /* check for abstract socket or absolute path */
- if (sock[0] != '@' && sock[0] != '/') {
- err = -EINVAL;
- goto done;
- }
-
- fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
- if (fd < 0) {
- err = -errno;
- goto done;
- }
-
- memset(&addr, 0, sizeof(addr));
- addr.sun_family = AF_UNIX;
- strncpy(addr.sun_path, sock, sizeof(addr.sun_path) - 1);
-
- if (addr.sun_path[0] == '@')
- addr.sun_path[0] = '\0';
-
- memset(&iovec, 0, sizeof(iovec));
- iovec.iov_base = (char *) state;
- iovec.iov_len = strlen(state);
-
- memset(&msghdr, 0, sizeof(msghdr));
- msghdr.msg_name = &addr;
- msghdr.msg_namelen = offsetof(struct sockaddr_un, sun_path) +
- strlen(sock);
-
- if (msghdr.msg_namelen > sizeof(struct sockaddr_un))
- msghdr.msg_namelen = sizeof(struct sockaddr_un);
-
- msghdr.msg_iov = &iovec;
- msghdr.msg_iovlen = 1;
-
- if (sendmsg(fd, &msghdr, MSG_NOSIGNAL) < 0)
- err = -errno;
- else
- err = 1;
-
- close(fd);
-
-done:
- if (unset_environment)
- unsetenv("NOTIFY_SOCKET");
-
- return err;
-}
diff --git a/src/systemd.h b/src/systemd.h
deleted file mode 100644
index 0ef7c82a9..000000000
--- a/src/systemd.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- *
- * BlueZ - Bluetooth protocol stack for Linux
- *
- * Copyright (C) 2012 Intel Corporation. All rights reserved.
- *
- *
- * 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 of the License, 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 St, Fifth Floor, Boston, MA 02110-1301 USA
- *
- */
-
-#define SD_LISTEN_FDS_START 3
-
-int sd_listen_fds(int unset_environment);
-
-int sd_notify(int unset_environment, const char *state);
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 06/10] shared/timeout-glib: Check 0 id when removing timeout
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
` (3 preceding siblings ...)
2018-11-30 10:20 ` [PATCH v3 05/10] core: Remove old code related to sd_notify Luiz Augusto von Dentz
@ 2018-11-30 10:20 ` Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 07/10] shared/mainloop: Add mainloop_run_with_signal Luiz Augusto von Dentz
` (4 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
If the id is 0 that makes it is invalid already.
---
src/shared/timeout-glib.c | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/shared/timeout-glib.c b/src/shared/timeout-glib.c
index 4163bced7..fd71ca430 100644
--- a/src/shared/timeout-glib.c
+++ b/src/shared/timeout-glib.c
@@ -71,8 +71,12 @@ unsigned int timeout_add(unsigned int timeout, timeout_func_t func,
void timeout_remove(unsigned int id)
{
- GSource *source = g_main_context_find_source_by_id(NULL, id);
+ GSource *source;
+ if (!id)
+ return;
+
+ source = g_main_context_find_source_by_id(NULL, id);
if (source)
g_source_destroy(source);
}
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 07/10] shared/mainloop: Add mainloop_run_with_signal
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
` (4 preceding siblings ...)
2018-11-30 10:20 ` [PATCH v3 06/10] shared/timeout-glib: Check 0 id when removing timeout Luiz Augusto von Dentz
@ 2018-11-30 10:20 ` Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 08/10] shared/mainloop: Remove mainloop_set_signal Luiz Augusto von Dentz
` (3 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This consolidates the handling of signalfd in similar ways as ELL does.
---
src/shared/mainloop-glib.c | 1 +
src/shared/mainloop-notify.c | 85 ++++++++++++++++++++++++++++++++++++
src/shared/mainloop.h | 1 +
3 files changed, 87 insertions(+)
diff --git a/src/shared/mainloop-glib.c b/src/shared/mainloop-glib.c
index 42abfddf8..e44197315 100644
--- a/src/shared/mainloop-glib.c
+++ b/src/shared/mainloop-glib.c
@@ -37,6 +37,7 @@
#include "mainloop.h"
#include "mainloop-notify.h"
+#include "io.h"
static GMainLoop *main_loop;
static int exit_status;
diff --git a/src/shared/mainloop-notify.c b/src/shared/mainloop-notify.c
index 2e3b08f06..17bf2c027 100644
--- a/src/shared/mainloop-notify.c
+++ b/src/shared/mainloop-notify.c
@@ -31,13 +31,17 @@
#include <stdlib.h>
#include <stddef.h>
#include <string.h>
+#include <signal.h>
+#include <sys/signalfd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include "mainloop.h"
#include "mainloop-notify.h"
#include "timeout.h"
+#include "util.h"
+#include "io.h"
#define WATCHDOG_TRIGGER_FREQ 2
@@ -45,6 +49,14 @@ static int notify_fd = -1;
static unsigned int watchdog;
+struct signal_data {
+ struct io *io;
+ mainloop_signal_func func;
+ void *user_data;
+};
+
+static struct signal_data *signal_data;
+
static bool watchdog_callback(void *user_data)
{
mainloop_sd_notify("WATCHDOG=1");
@@ -119,3 +131,76 @@ int mainloop_sd_notify(const char *state)
return err;
}
+
+static bool signal_read(struct io *io, void *user_data)
+{
+ struct signal_data *data = user_data;
+ struct signalfd_siginfo si;
+ ssize_t result;
+ int fd;
+
+ fd = io_get_fd(io);
+
+ result = read(fd, &si, sizeof(si));
+ if (result != sizeof(si))
+ return false;
+
+ if (data && data->func)
+ data->func(si.ssi_signo, data->user_data);
+
+ return true;
+}
+
+static struct io *setup_signalfd(void *user_data)
+{
+ struct io *io;
+ sigset_t mask;
+ int fd;
+
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGINT);
+ sigaddset(&mask, SIGTERM);
+ sigaddset(&mask, SIGUSR2);
+ sigaddset(&mask, SIGCHLD);
+
+ if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0)
+ return NULL;
+
+ fd = signalfd(-1, &mask, SFD_NONBLOCK | SFD_CLOEXEC);
+ if (fd < 0)
+ return NULL;
+
+ io = io_new(fd);
+
+ io_set_close_on_destroy(io, true);
+ io_set_read_handler(io, signal_read, user_data, free);
+
+ return io;
+}
+
+int mainloop_run_with_signal(mainloop_signal_func func, void *user_data)
+{
+ struct signal_data *data;
+ struct io *io;
+ int ret;
+
+ if (!func)
+ return -EINVAL;
+
+ data = new0(struct signal_data, 1);
+ data->func = func;
+ data->user_data = user_data;
+
+ io = setup_signalfd(data);
+ if (!io) {
+ free(data);
+ return -errno;
+ }
+
+ ret = mainloop_run();
+
+ io_destroy(io);
+ free(signal_data);
+
+ return ret;
+}
diff --git a/src/shared/mainloop.h b/src/shared/mainloop.h
index 73ed81187..1ede62797 100644
--- a/src/shared/mainloop.h
+++ b/src/shared/mainloop.h
@@ -36,6 +36,7 @@ void mainloop_quit(void);
void mainloop_exit_success(void);
void mainloop_exit_failure(void);
int mainloop_run(void);
+int mainloop_run_with_signal(mainloop_signal_func func, void *user_data);
int mainloop_add_fd(int fd, uint32_t events, mainloop_event_func callback,
void *user_data, mainloop_destroy_func destroy);
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 08/10] shared/mainloop: Remove mainloop_set_signal
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
` (5 preceding siblings ...)
2018-11-30 10:20 ` [PATCH v3 07/10] shared/mainloop: Add mainloop_run_with_signal Luiz Augusto von Dentz
@ 2018-11-30 10:20 ` Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 09/10] core: Make use of mainloop_run_with_signal Luiz Augusto von Dentz
` (2 subsequent siblings)
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This removes mainloop_set_signal and replaces it usage with
mainloop_run_with_signal.
---
android/bluetoothd-snoop.c | 9 +----
android/system-emulator.c | 10 +----
emulator/b1ee.c | 9 +----
emulator/hfp.c | 10 +----
emulator/main.c | 9 +----
monitor/main.c | 9 +----
peripheral/main.c | 10 +----
src/shared/mainloop.c | 79 --------------------------------------
src/shared/shell.c | 54 ++------------------------
tools/3dsp.c | 9 +----
tools/advtest.c | 9 +----
tools/bluemoon.c | 9 +----
tools/btattach.c | 9 +----
tools/btconfig.c | 9 +----
tools/btgatt-client.c | 9 +----
tools/btgatt-server.c | 9 +----
tools/btinfo.c | 9 +----
tools/btmon-logger.c | 9 +----
tools/btproxy.c | 9 +----
tools/eddystone.c | 9 +----
tools/ibeacon.c | 9 +----
tools/oobtest.c | 9 +----
22 files changed, 24 insertions(+), 292 deletions(-)
diff --git a/android/bluetoothd-snoop.c b/android/bluetoothd-snoop.c
index 8d9a2d087..25cddee34 100644
--- a/android/bluetoothd-snoop.c
+++ b/android/bluetoothd-snoop.c
@@ -219,7 +219,6 @@ static void set_capabilities(void)
int main(int argc, char *argv[])
{
const char *path;
- sigset_t mask;
__btd_log_init(NULL, 0);
@@ -234,12 +233,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
if (!strcmp(DEFAULT_SNOOP_FILE, path))
rename(DEFAULT_SNOOP_FILE, DEFAULT_SNOOP_FILE ".old");
@@ -250,7 +243,7 @@ int main(int argc, char *argv[])
info("bluetoothd_snoop: started");
- mainloop_run();
+ mainloop_run_with_signal(signal_callback, NULL);
close_monitor();
diff --git a/android/system-emulator.c b/android/system-emulator.c
index 1545dcea1..8bcf660e2 100644
--- a/android/system-emulator.c
+++ b/android/system-emulator.c
@@ -216,19 +216,11 @@ static void signal_callback(int signum, void *user_data)
int main(int argc, char *argv[])
{
const char SYSTEM_SOCKET_PATH[] = "\0android_system";
- sigset_t mask;
struct sockaddr_un addr;
int fd;
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
- sigaddset(&mask, SIGCHLD);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("Android system emulator ver %s\n", VERSION);
snprintf(exec_dir, sizeof(exec_dir), "%s", dirname(argv[0]));
@@ -254,5 +246,5 @@ int main(int argc, char *argv[])
/* Make sure bluetoothd creates files with proper permissions */
umask(0177);
- return mainloop_run();
+ return mainloop_run_with_signal(signal_callback, NULL);
}
diff --git a/emulator/b1ee.c b/emulator/b1ee.c
index 1253a3dca..0d5226fcc 100644
--- a/emulator/b1ee.c
+++ b/emulator/b1ee.c
@@ -265,7 +265,6 @@ int main(int argc, char *argv[])
char *server_port = NULL, *sniffer_port = NULL;
int ret = EXIT_FAILURE;
ssize_t written;
- sigset_t mask;
for (;;) {
int opt;
@@ -323,17 +322,11 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
mainloop_add_fd(sniffer_fd, EPOLLIN, sniffer_read_callback, NULL, NULL);
mainloop_add_fd(server_fd, EPOLLIN, server_read_callback, NULL, NULL);
mainloop_add_fd(vhci_fd, EPOLLIN, vhci_read_callback, NULL, NULL);
- ret = mainloop_run();
+ ret = mainloop_run_with_signal(signal_callback, NULL);
goto done;
diff --git a/emulator/hfp.c b/emulator/hfp.c
index e70054adf..29ec63e7d 100644
--- a/emulator/hfp.c
+++ b/emulator/hfp.c
@@ -103,18 +103,10 @@ static void signal_callback(int signum, void *user_data)
int main(int argc, char *argv[])
{
- sigset_t mask;
-
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
if (!open_connection())
return EXIT_FAILURE;
- return mainloop_run();
+ return mainloop_run_with_signal(signal_callback, NULL);
}
diff --git a/emulator/main.c b/emulator/main.c
index 56246a3de..68c53488e 100644
--- a/emulator/main.c
+++ b/emulator/main.c
@@ -90,7 +90,6 @@ int main(int argc, char *argv[])
int amptest_count = 0;
int vhci_count = 0;
enum vhci_type vhci_type = VHCI_TYPE_BREDRLE;
- sigset_t mask;
int i;
mainloop_init();
@@ -154,12 +153,6 @@ int main(int argc, char *argv[])
return EXIT_FAILURE;
}
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("Bluetooth emulator ver %s\n", VERSION);
for (i = 0; i < letest_count; i++) {
@@ -227,5 +220,5 @@ int main(int argc, char *argv[])
fprintf(stderr, "Failed to open monitor server\n");
}
- return mainloop_run();
+ return mainloop_run_with_signal(signal_callback, NULL);
}
diff --git a/monitor/main.c b/monitor/main.c
index 5fa87ea3f..8640c023d 100644
--- a/monitor/main.c
+++ b/monitor/main.c
@@ -112,7 +112,6 @@ int main(int argc, char *argv[])
unsigned short ellisys_port = 0;
const char *str;
int exit_status;
- sigset_t mask;
mainloop_init();
@@ -219,12 +218,6 @@ int main(int argc, char *argv[])
return EXIT_FAILURE;
}
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("Bluetooth monitor ver %s\n", VERSION);
keys_setup();
@@ -258,7 +251,7 @@ int main(int argc, char *argv[])
if (tty && control_tty(tty, tty_speed) < 0)
return EXIT_FAILURE;
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
keys_cleanup();
diff --git a/peripheral/main.c b/peripheral/main.c
index d7e10f3d3..93abe2042 100644
--- a/peripheral/main.c
+++ b/peripheral/main.c
@@ -184,7 +184,6 @@ static void signal_callback(int signum, void *user_data)
int main(int argc, char *argv[])
{
- sigset_t mask;
int exit_status;
if (getpid() == 1 && getppid() == 0)
@@ -192,13 +191,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
- sigaddset(&mask, SIGCHLD);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("Bluetooth periperhal ver %s\n", VERSION);
prepare_filesystem();
@@ -235,7 +227,7 @@ int main(int argc, char *argv[])
if (is_init)
attach_start();
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
if (is_init)
attach_stop();
diff --git a/src/shared/mainloop.c b/src/shared/mainloop.c
index e9ec6e8cd..6a65fa41d 100644
--- a/src/shared/mainloop.c
+++ b/src/shared/mainloop.c
@@ -67,16 +67,6 @@ struct timeout_data {
void *user_data;
};
-struct signal_data {
- int fd;
- sigset_t mask;
- mainloop_signal_func callback;
- mainloop_destroy_func destroy;
- void *user_data;
-};
-
-static struct signal_data *signal_data;
-
void mainloop_init(void)
{
unsigned int i;
@@ -110,45 +100,10 @@ void mainloop_exit_failure(void)
epoll_terminate = 1;
}
-static void signal_callback(int fd, uint32_t events, void *user_data)
-{
- struct signal_data *data = user_data;
- struct signalfd_siginfo si;
- ssize_t result;
-
- if (events & (EPOLLERR | EPOLLHUP)) {
- mainloop_quit();
- return;
- }
-
- result = read(fd, &si, sizeof(si));
- if (result != sizeof(si))
- return;
-
- if (data->callback)
- data->callback(si.ssi_signo, data->user_data);
-}
-
int mainloop_run(void)
{
unsigned int i;
- if (signal_data) {
- if (sigprocmask(SIG_BLOCK, &signal_data->mask, NULL) < 0)
- return EXIT_FAILURE;
-
- signal_data->fd = signalfd(-1, &signal_data->mask,
- SFD_NONBLOCK | SFD_CLOEXEC);
- if (signal_data->fd < 0)
- return EXIT_FAILURE;
-
- if (mainloop_add_fd(signal_data->fd, EPOLLIN,
- signal_callback, signal_data, NULL) < 0) {
- close(signal_data->fd);
- return EXIT_FAILURE;
- }
- }
-
while (!epoll_terminate) {
struct epoll_event events[MAX_EPOLL_EVENTS];
int n, nfds;
@@ -165,14 +120,6 @@ int mainloop_run(void)
}
}
- if (signal_data) {
- mainloop_remove_fd(signal_data->fd);
- close(signal_data->fd);
-
- if (signal_data->destroy)
- signal_data->destroy(signal_data->user_data);
- }
-
for (i = 0; i < MAX_MAINLOOP_ENTRIES; i++) {
struct mainloop_data *data = mainloop_list[i];
@@ -384,29 +331,3 @@ int mainloop_remove_timeout(int id)
{
return mainloop_remove_fd(id);
}
-
-int mainloop_set_signal(sigset_t *mask, mainloop_signal_func callback,
- void *user_data, mainloop_destroy_func destroy)
-{
- struct signal_data *data;
-
- if (!mask || !callback)
- return -EINVAL;
-
- data = malloc(sizeof(*data));
- if (!data)
- return -ENOMEM;
-
- memset(data, 0, sizeof(*data));
- data->callback = callback;
- data->destroy = destroy;
- data->user_data = user_data;
-
- data->fd = -1;
- memcpy(&data->mask, mask, sizeof(sigset_t));
-
- free(signal_data);
- signal_data = data;
-
- return 0;
-}
diff --git a/src/shared/shell.c b/src/shared/shell.c
index aabbc5d0e..8ccfe855e 100644
--- a/src/shared/shell.c
+++ b/src/shared/shell.c
@@ -864,27 +864,18 @@ static bool io_hup(struct io *io, void *user_data)
return false;
}
-static bool signal_read(struct io *io, void *user_data)
+static void signal_callback(int signum, void *user_data)
{
static bool terminated = false;
- struct signalfd_siginfo si;
- ssize_t result;
- int fd;
- fd = io_get_fd(io);
-
- result = read(fd, &si, sizeof(si));
- if (result != sizeof(si))
- return false;
-
- switch (si.ssi_signo) {
+ switch (signum) {
case SIGINT:
if (data.input && !data.mode) {
rl_replace_line("", 0);
rl_crlf();
rl_on_new_line();
rl_redisplay();
- return true;
+ return;
}
/*
@@ -907,38 +898,6 @@ static bool signal_read(struct io *io, void *user_data)
terminated = true;
break;
}
-
- return false;
-}
-
-static struct io *setup_signalfd(void)
-{
- struct io *io;
- sigset_t mask;
- int fd;
-
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) {
- perror("Failed to set signal mask");
- return 0;
- }
-
- fd = signalfd(-1, &mask, 0);
- if (fd < 0) {
- perror("Failed to create signal descriptor");
- return 0;
- }
-
- io = io_new(fd);
-
- io_set_close_on_destroy(io, true);
- io_set_read_handler(io, signal_read, NULL, NULL);
- io_set_disconnect_handler(io, io_hup, NULL, NULL);
-
- return io;
}
static void rl_init_history(void)
@@ -1132,14 +1091,9 @@ static void env_destroy(void *data)
int bt_shell_run(void)
{
- struct io *signal;
int status;
- signal = setup_signalfd();
-
- status = mainloop_run();
-
- io_destroy(signal);
+ status = mainloop_run_with_signal(signal_callback, NULL);
bt_shell_cleanup();
diff --git a/tools/3dsp.c b/tools/3dsp.c
index 686fe139d..77a70c037 100644
--- a/tools/3dsp.c
+++ b/tools/3dsp.c
@@ -570,7 +570,6 @@ int main(int argc, char *argv[])
uint16_t index = 0;
const char *str;
bool use_raw = false;
- sigset_t mask;
int exit_status;
for (;;) {
@@ -624,12 +623,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("3D Synchronization Profile testing ver %s\n", VERSION);
if (use_raw) {
@@ -654,7 +647,7 @@ int main(int argc, char *argv[])
else if (glasses_role)
start_glasses();
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
bt_hci_unref(hci_dev);
diff --git a/tools/advtest.c b/tools/advtest.c
index b02301c39..050b570df 100644
--- a/tools/advtest.c
+++ b/tools/advtest.c
@@ -374,7 +374,6 @@ static const struct option main_options[] = {
int main(int argc ,char *argv[])
{
- sigset_t mask;
int exit_status;
for (;;) {
@@ -403,12 +402,6 @@ int main(int argc ,char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
mgmt = mgmt_new_default();
if (!mgmt) {
fprintf(stderr, "Failed to open management socket\n");
@@ -423,7 +416,7 @@ int main(int argc ,char *argv[])
goto done;
}
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
bt_hci_unref(adv_dev);
bt_hci_unref(scan_dev);
diff --git a/tools/bluemoon.c b/tools/bluemoon.c
index 6051f3002..800541110 100644
--- a/tools/bluemoon.c
+++ b/tools/bluemoon.c
@@ -923,7 +923,6 @@ int main(int argc, char *argv[])
{
const char *str;
bool use_raw = false;
- sigset_t mask;
int exit_status;
for (;;) {
@@ -1000,12 +999,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("Bluemoon configuration utility ver %s\n", VERSION);
if (check_firmware) {
@@ -1030,7 +1023,7 @@ int main(int argc, char *argv[])
bt_hci_send(hci_dev, CMD_READ_VERSION, NULL, 0,
read_version_complete, NULL, NULL);
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
bt_hci_unref(hci_dev);
diff --git a/tools/btattach.c b/tools/btattach.c
index 5adbc8d83..6eb99bac3 100644
--- a/tools/btattach.c
+++ b/tools/btattach.c
@@ -231,7 +231,6 @@ int main(int argc, char *argv[])
{
const char *bredr_path = NULL, *amp_path = NULL, *proto = NULL;
bool flowctl = true, raw_device = false;
- sigset_t mask;
int exit_status, count = 0, proto_id = HCI_UART_H4;
unsigned int speed = B115200;
@@ -284,12 +283,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
if (proto) {
unsigned int i;
@@ -348,7 +341,7 @@ int main(int argc, char *argv[])
return EXIT_FAILURE;
}
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
return exit_status;
}
diff --git a/tools/btconfig.c b/tools/btconfig.c
index f171bfbc1..c1ef5834a 100644
--- a/tools/btconfig.c
+++ b/tools/btconfig.c
@@ -75,7 +75,6 @@ static const struct option main_options[] = {
int main(int argc, char *argv[])
{
- sigset_t mask;
int exit_status;
for (;;) {
@@ -105,12 +104,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
mgmt = mgmt_new_default();
if (!mgmt) {
fprintf(stderr, "Unable to open mgmt_socket\n");
@@ -120,7 +113,7 @@ int main(int argc, char *argv[])
if (getenv("MGMT_DEBUG"))
mgmt_set_debug(mgmt, mgmt_debug, "mgmt: ", NULL);
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
mgmt_cancel_all(mgmt);
mgmt_unregister_all(mgmt);
diff --git a/tools/btgatt-client.c b/tools/btgatt-client.c
index 51bc3629d..31e849aae 100644
--- a/tools/btgatt-client.c
+++ b/tools/btgatt-client.c
@@ -1518,7 +1518,6 @@ int main(int argc, char *argv[])
bdaddr_t src_addr, dst_addr;
int dev_id = -1;
int fd;
- sigset_t mask;
struct client *cli;
while ((opt = getopt_long(argc, argv, "+hvs:m:t:d:i:",
@@ -1639,15 +1638,9 @@ int main(int argc, char *argv[])
return EXIT_FAILURE;
}
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_cb, NULL, NULL);
-
print_prompt();
- mainloop_run();
+ mainloop_run_with_signal(signal_cb, NULL);
printf("\n\nShutting down...\n");
diff --git a/tools/btgatt-server.c b/tools/btgatt-server.c
index 89812bd75..bc32789d9 100644
--- a/tools/btgatt-server.c
+++ b/tools/btgatt-server.c
@@ -1139,7 +1139,6 @@ int main(int argc, char *argv[])
int sec = BT_SECURITY_LOW;
uint8_t src_type = BDADDR_LE_PUBLIC;
uint16_t mtu = 0;
- sigset_t mask;
bool hr_visible = false;
struct server *server;
@@ -1250,15 +1249,9 @@ int main(int argc, char *argv[])
printf("Running GATT server\n");
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_cb, NULL, NULL);
-
print_prompt();
- mainloop_run();
+ mainloop_run_with_signal(signal_cb, NULL);
printf("\n\nShutting down...\n");
diff --git a/tools/btinfo.c b/tools/btinfo.c
index 8e36577d7..5e609739c 100644
--- a/tools/btinfo.c
+++ b/tools/btinfo.c
@@ -226,7 +226,6 @@ int main(int argc, char *argv[])
const char *str;
bool use_raw = false;
bool power_down = false;
- sigset_t mask;
int fd, i, exit_status;
for (;;) {
@@ -284,12 +283,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("Bluetooth information utility ver %s\n", VERSION);
fd = socket(AF_BLUETOOTH, SOCK_RAW | SOCK_CLOEXEC, BTPROTO_HCI);
@@ -345,7 +338,7 @@ int main(int argc, char *argv[])
return EXIT_FAILURE;
}
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
bt_hci_unref(hci_dev);
diff --git a/tools/btmon-logger.c b/tools/btmon-logger.c
index 1a42824ee..65953d261 100644
--- a/tools/btmon-logger.c
+++ b/tools/btmon-logger.c
@@ -276,7 +276,6 @@ int main(int argc, char *argv[])
size_t size_limit = 0;
bool parents = false;
int exit_status;
- sigset_t mask;
char *endptr;
mainloop_init();
@@ -365,18 +364,12 @@ int main(int argc, char *argv[])
drop_capabilities();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("Bluetooth monitor logger ver %s\n", VERSION);
mainloop_sd_notify("STATUS=Running");
mainloop_sd_notify("READY=1");
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
mainloop_sd_notify("STATUS=Quitting");
diff --git a/tools/btproxy.c b/tools/btproxy.c
index 58fa958e6..fd53ca264 100644
--- a/tools/btproxy.c
+++ b/tools/btproxy.c
@@ -780,7 +780,6 @@ int main(int argc, char *argv[])
bool use_redirect = false;
uint8_t type = HCI_PRIMARY;
const char *str;
- sigset_t mask;
for (;;) {
int opt;
@@ -870,12 +869,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
if (connect_address || use_redirect) {
int host_fd, dev_fd;
@@ -930,5 +923,5 @@ int main(int argc, char *argv[])
NULL, NULL);
}
- return mainloop_run();
+ return mainloop_run_with_signal(signal_callback, NULL);
}
diff --git a/tools/eddystone.c b/tools/eddystone.c
index f412c90b0..4764c677c 100644
--- a/tools/eddystone.c
+++ b/tools/eddystone.c
@@ -244,7 +244,6 @@ int main(int argc, char *argv[])
{
uint16_t index = 0;
const char *str;
- sigset_t mask;
int exit_status;
for (;;) {
@@ -290,12 +289,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("Low Energy Eddystone utility ver %s\n", VERSION);
hci_dev = bt_hci_new_user_channel(index);
@@ -307,7 +300,7 @@ int main(int argc, char *argv[])
start_eddystone();
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
bt_hci_unref(hci_dev);
diff --git a/tools/ibeacon.c b/tools/ibeacon.c
index 4b358049c..40078d5ed 100644
--- a/tools/ibeacon.c
+++ b/tools/ibeacon.c
@@ -237,7 +237,6 @@ int main(int argc, char *argv[])
{
uint16_t index = 0;
const char *str;
- sigset_t mask;
int exit_status;
for (;;) {
@@ -283,12 +282,6 @@ int main(int argc, char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
printf("Low Energy iBeacon utility ver %s\n", VERSION);
hci_dev = bt_hci_new_user_channel(index);
@@ -300,7 +293,7 @@ int main(int argc, char *argv[])
start_ibeacon();
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
bt_hci_unref(hci_dev);
diff --git a/tools/oobtest.c b/tools/oobtest.c
index e77320bab..c228b65b1 100644
--- a/tools/oobtest.c
+++ b/tools/oobtest.c
@@ -1026,7 +1026,6 @@ static const struct option main_options[] = {
int main(int argc ,char *argv[])
{
- sigset_t mask;
int exit_status;
for (;;) {
@@ -1128,12 +1127,6 @@ int main(int argc ,char *argv[])
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
mgmt = mgmt_new_default();
if (!mgmt) {
fprintf(stderr, "Failed to open management socket\n");
@@ -1148,7 +1141,7 @@ int main(int argc ,char *argv[])
goto done;
}
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
done:
mgmt_unref(mgmt);
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 09/10] core: Make use of mainloop_run_with_signal
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
` (6 preceding siblings ...)
2018-11-30 10:20 ` [PATCH v3 08/10] shared/mainloop: Remove mainloop_set_signal Luiz Augusto von Dentz
@ 2018-11-30 10:20 ` Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 10/10] shared/tester: " Luiz Augusto von Dentz
2018-12-05 12:09 ` [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This don't require setting up signalfd.
---
src/main.c | 64 +++---------------------------------------------------
1 file changed, 3 insertions(+), 61 deletions(-)
diff --git a/src/main.c b/src/main.c
index 7ab1349cc..67eb6ac59 100644
--- a/src/main.c
+++ b/src/main.c
@@ -497,24 +497,11 @@ static gboolean quit_eventloop(gpointer user_data)
return FALSE;
}
-static gboolean signal_handler(GIOChannel *channel, GIOCondition cond,
- gpointer user_data)
+static void signal_callback(int signum, void *user_data)
{
static bool terminated = false;
- struct signalfd_siginfo si;
- ssize_t result;
- int fd;
- if (cond & (G_IO_NVAL | G_IO_ERR | G_IO_HUP))
- return FALSE;
-
- fd = g_io_channel_unix_get_fd(channel);
-
- result = read(fd, &si, sizeof(si));
- if (result != sizeof(si))
- return FALSE;
-
- switch (si.ssi_signo) {
+ switch (signum) {
case SIGINT:
case SIGTERM:
if (!terminated) {
@@ -532,46 +519,6 @@ static gboolean signal_handler(GIOChannel *channel, GIOCondition cond,
__btd_toggle_debug();
break;
}
-
- return TRUE;
-}
-
-static guint setup_signalfd(void)
-{
- GIOChannel *channel;
- guint source;
- sigset_t mask;
- int fd;
-
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
- sigaddset(&mask, SIGUSR2);
-
- if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) {
- perror("Failed to set signal mask");
- return 0;
- }
-
- fd = signalfd(-1, &mask, 0);
- if (fd < 0) {
- perror("Failed to create signal descriptor");
- return 0;
- }
-
- channel = g_io_channel_unix_new(fd);
-
- g_io_channel_set_close_on_unref(channel, TRUE);
- g_io_channel_set_encoding(channel, NULL, NULL);
- g_io_channel_set_buffered(channel, FALSE);
-
- source = g_io_add_watch(channel,
- G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
- signal_handler, NULL);
-
- g_io_channel_unref(channel);
-
- return source;
}
static char *option_debug = NULL;
@@ -682,7 +629,6 @@ int main(int argc, char *argv[])
uint16_t sdp_mtu = 0;
uint32_t sdp_flags = 0;
int gdbus_flags = 0;
- guint signal;
init_defaults();
@@ -711,8 +657,6 @@ int main(int argc, char *argv[])
mainloop_init();
- signal = setup_signalfd();
-
__btd_log_init(option_debug, option_detach);
g_log_set_handler("GLib", G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL |
@@ -781,12 +725,10 @@ int main(int argc, char *argv[])
mainloop_sd_notify("STATUS=Running");
mainloop_sd_notify("READY=1");
- mainloop_run();
+ mainloop_run_with_signal(signal_callback, NULL);
mainloop_sd_notify("STATUS=Quitting");
- g_source_remove(signal);
-
plugin_cleanup();
btd_profile_cleanup();
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v3 10/10] shared/tester: Make use of mainloop_run_with_signal
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
` (7 preceding siblings ...)
2018-11-30 10:20 ` [PATCH v3 09/10] core: Make use of mainloop_run_with_signal Luiz Augusto von Dentz
@ 2018-11-30 10:20 ` Luiz Augusto von Dentz
2018-12-05 12:09 ` [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-11-30 10:20 UTC (permalink / raw)
To: linux-bluetooth
From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
This don't require setting up signalfd.
---
src/shared/tester.c | 79 +++++----------------------------------------
1 file changed, 8 insertions(+), 71 deletions(-)
diff --git a/src/shared/tester.c b/src/shared/tester.c
index 168d0de91..3d79e411d 100644
--- a/src/shared/tester.c
+++ b/src/shared/tester.c
@@ -44,6 +44,7 @@
#include <valgrind/memcheck.h>
#endif
+#include "src/shared/mainloop.h"
#include "src/shared/util.h"
#include "src/shared/tester.h"
#include "src/shared/log.h"
@@ -105,7 +106,6 @@ struct test_case {
void *user_data;
};
-static GMainLoop *main_loop;
static char *tester_name;
static GList *test_list;
@@ -463,7 +463,7 @@ static void next_test_case(void)
if (!test_current) {
g_timer_stop(test_timer);
- g_main_loop_quit(main_loop);
+ mainloop_quit();
return;
}
@@ -778,73 +778,19 @@ void tester_wait(unsigned int seconds, tester_wait_func_t func,
print_progress(test->name, COLOR_BLACK, "waiting %u seconds", seconds);
}
-static gboolean signal_handler(GIOChannel *channel, GIOCondition condition,
- gpointer user_data)
+static void signal_callback(int signum, void *user_data)
{
static bool terminated = false;
- struct signalfd_siginfo si;
- ssize_t result;
- int fd;
- if (condition & (G_IO_NVAL | G_IO_ERR | G_IO_HUP)) {
- g_main_loop_quit(main_loop);
- return FALSE;
- }
-
- fd = g_io_channel_unix_get_fd(channel);
-
- result = read(fd, &si, sizeof(si));
- if (result != sizeof(si))
- return FALSE;
-
- switch (si.ssi_signo) {
+ switch (signum) {
case SIGINT:
case SIGTERM:
if (!terminated)
- g_main_loop_quit(main_loop);
+ mainloop_quit();
terminated = true;
break;
}
-
- return TRUE;
-}
-
-static guint setup_signalfd(void)
-{
- GIOChannel *channel;
- guint source;
- sigset_t mask;
- int fd;
-
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- if (sigprocmask(SIG_BLOCK, &mask, NULL) < 0) {
- perror("Failed to set signal mask");
- return 0;
- }
-
- fd = signalfd(-1, &mask, 0);
- if (fd < 0) {
- perror("Failed to create signal descriptor");
- return 0;
- }
-
- channel = g_io_channel_unix_new(fd);
-
- g_io_channel_set_close_on_unref(channel, TRUE);
- g_io_channel_set_encoding(channel, NULL, NULL);
- g_io_channel_set_buffered(channel, FALSE);
-
- source = g_io_add_watch(channel,
- G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_NVAL,
- signal_handler, NULL);
-
- g_io_channel_unref(channel);
-
- return source;
}
bool tester_use_quiet(void)
@@ -897,7 +843,7 @@ void tester_init(int *argc, char ***argv)
exit(EXIT_SUCCESS);
}
- main_loop = g_main_loop_new(NULL, FALSE);
+ mainloop_init();
tester_name = strrchr(*argv[0], '/');
if (!tester_name)
@@ -911,25 +857,16 @@ void tester_init(int *argc, char ***argv)
int tester_run(void)
{
- guint signal;
int ret;
- if (!main_loop)
- return EXIT_FAILURE;
-
if (option_list) {
- g_main_loop_unref(main_loop);
+ mainloop_quit();
return EXIT_SUCCESS;
}
- signal = setup_signalfd();
-
g_idle_add(start_tester, NULL);
- g_main_loop_run(main_loop);
-
- g_source_remove(signal);
- g_main_loop_unref(main_loop);
+ mainloop_run_with_signal(signal_callback, NULL);
ret = tester_summarize();
--
2.17.2
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
` (8 preceding siblings ...)
2018-11-30 10:20 ` [PATCH v3 10/10] shared/tester: " Luiz Augusto von Dentz
@ 2018-12-05 12:09 ` Luiz Augusto von Dentz
9 siblings, 0 replies; 11+ messages in thread
From: Luiz Augusto von Dentz @ 2018-12-05 12:09 UTC (permalink / raw)
To: linux-bluetooth
Hi,
On Fri, Nov 30, 2018 at 12:20 PM Luiz Augusto von Dentz
<luiz.dentz@gmail.com> wrote:
>
> From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
>
> This adds handling of systemd NOTIFY_SOCKET so application using
> mainloop instance do properly notify systemd what is their state.
> ---
> Makefile.am | 8 +++-
> src/shared/mainloop-glib.c | 6 +++
> src/shared/mainloop-notify.c | 93 ++++++++++++++++++++++++++++++++++++
> src/shared/mainloop-notify.h | 25 ++++++++++
> src/shared/mainloop.c | 10 ++++
> src/shared/mainloop.h | 1 +
> 6 files changed, 141 insertions(+), 2 deletions(-)
> create mode 100644 src/shared/mainloop-notify.c
> create mode 100644 src/shared/mainloop-notify.h
>
> diff --git a/Makefile.am b/Makefile.am
> index 0b26ccc3e..124c32482 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -130,12 +130,16 @@ endif
> src_libshared_glib_la_SOURCES = $(shared_sources) \
> src/shared/io-glib.c \
> src/shared/timeout-glib.c \
> - src/shared/mainloop-glib.c
> + src/shared/mainloop-glib.c \
> + src/shared/mainloop-notify.h \
> + src/shared/mainloop-notify.c
>
> src_libshared_mainloop_la_SOURCES = $(shared_sources) \
> src/shared/io-mainloop.c \
> src/shared/timeout-mainloop.c \
> - src/shared/mainloop.h src/shared/mainloop.c
> + src/shared/mainloop.h src/shared/mainloop.c \
> + src/shared/mainloop-notify.h \
> + src/shared/mainloop-notify.c
>
> if ELL
> src_libshared_ell_la_SOURCES = $(shared_sources) \
> diff --git a/src/shared/mainloop-glib.c b/src/shared/mainloop-glib.c
> index 8436969bb..42abfddf8 100644
> --- a/src/shared/mainloop-glib.c
> +++ b/src/shared/mainloop-glib.c
> @@ -36,6 +36,7 @@
> #include <glib.h>
>
> #include "mainloop.h"
> +#include "mainloop-notify.h"
>
> static GMainLoop *main_loop;
> static int exit_status;
> @@ -43,6 +44,7 @@ static int exit_status;
> void mainloop_init(void)
> {
> main_loop = g_main_loop_new(NULL, FALSE);
> + mainloop_notify_init();
> }
>
> void mainloop_quit(void)
> @@ -51,6 +53,8 @@ void mainloop_quit(void)
> return;
>
> g_main_loop_quit(main_loop);
> +
> + mainloop_sd_notify("STOPPING=1");
> }
>
> void mainloop_exit_success(void)
> @@ -75,6 +79,8 @@ int mainloop_run(void)
> g_main_loop_unref(main_loop);
> main_loop = NULL;
>
> + mainloop_notify_exit();
> +
> return exit_status;
> }
>
> diff --git a/src/shared/mainloop-notify.c b/src/shared/mainloop-notify.c
> new file mode 100644
> index 000000000..fdc2f25ec
> --- /dev/null
> +++ b/src/shared/mainloop-notify.c
> @@ -0,0 +1,93 @@
> +/*
> + *
> + * BlueZ - Bluetooth protocol stack for Linux
> + *
> + * Copyright (C) 2018 Intel Corporation. All rights reserved.
> + *
> + *
> + * 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, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> + *
> + */
> +
> +#ifdef HAVE_CONFIG_H
> +#include <config.h>
> +#endif
> +
> +#include <stdio.h>
> +#include <errno.h>
> +#include <unistd.h>
> +#include <stdlib.h>
> +#include <stddef.h>
> +#include <string.h>
> +
> +#include <sys/socket.h>
> +#include <sys/un.h>
> +
> +#include "mainloop.h"
> +#include "mainloop-notify.h"
> +
> +static int notify_fd = -1;
> +
> +void mainloop_notify_init(void)
> +{
> + const char *sock;
> + struct sockaddr_un addr;
> +
> + sock = getenv("NOTIFY_SOCKET");
> + if (!sock)
> + return;
> +
> + /* check for abstract socket or absolute path */
> + if (sock[0] != '@' && sock[0] != '/')
> + return;
> +
> + notify_fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0);
> + if (notify_fd < 0)
> + return;
> +
> + memset(&addr, 0, sizeof(addr));
> + addr.sun_family = AF_UNIX;
> + strncpy(addr.sun_path, sock, sizeof(addr.sun_path) - 1);
> +
> + if (addr.sun_path[0] == '@')
> + addr.sun_path[0] = '\0';
> +
> + if (bind(notify_fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
> + close(notify_fd);
> + notify_fd = -1;
> + }
> +}
> +
> +void mainloop_notify_exit(void)
> +{
> + if (notify_fd > 0) {
> + close(notify_fd);
> + notify_fd = -1;
> + }
> +}
> +
> +int mainloop_sd_notify(const char *state)
> +{
> + int err;
> +
> + if (notify_fd <= 0)
> + return -ENOTCONN;
> +
> + err = send(notify_fd, state, strlen(state), MSG_NOSIGNAL);
> + if (err < 0)
> + return -errno;
> +
> + return err;
> +}
> diff --git a/src/shared/mainloop-notify.h b/src/shared/mainloop-notify.h
> new file mode 100644
> index 000000000..721b5fbed
> --- /dev/null
> +++ b/src/shared/mainloop-notify.h
> @@ -0,0 +1,25 @@
> +/*
> + *
> + * BlueZ - Bluetooth protocol stack for Linux
> + *
> + * Copyright (C) 2018 Intel Corporation. All rights reserved.
> + *
> + *
> + * 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, write to the Free Software
> + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
> + *
> + */
> +
> +void mainloop_notify_init(void);
> +void mainloop_notify_exit(void);
> diff --git a/src/shared/mainloop.c b/src/shared/mainloop.c
> index e6ab9c43d..e9ec6e8cd 100644
> --- a/src/shared/mainloop.c
> +++ b/src/shared/mainloop.c
> @@ -30,13 +30,17 @@
> #include <errno.h>
> #include <unistd.h>
> #include <stdlib.h>
> +#include <stddef.h>
> #include <string.h>
> #include <signal.h>
> #include <sys/signalfd.h>
> #include <sys/timerfd.h>
> #include <sys/epoll.h>
> +#include <sys/socket.h>
> +#include <sys/un.h>
>
> #include "mainloop.h"
> +#include "mainloop-notify.h"
>
> #define MAX_EPOLL_EVENTS 10
>
> @@ -83,11 +87,15 @@ void mainloop_init(void)
> mainloop_list[i] = NULL;
>
> epoll_terminate = 0;
> +
> + mainloop_notify_init();
> }
>
> void mainloop_quit(void)
> {
> epoll_terminate = 1;
> +
> + mainloop_sd_notify("STOPPING=1");
> }
>
> void mainloop_exit_success(void)
> @@ -183,6 +191,8 @@ int mainloop_run(void)
> close(epoll_fd);
> epoll_fd = 0;
>
> + mainloop_notify_exit();
> +
> return exit_status;
> }
>
> diff --git a/src/shared/mainloop.h b/src/shared/mainloop.h
> index b83caabc8..73ed81187 100644
> --- a/src/shared/mainloop.h
> +++ b/src/shared/mainloop.h
> @@ -49,3 +49,4 @@ int mainloop_remove_timeout(int id);
>
> int mainloop_set_signal(sigset_t *mask, mainloop_signal_func callback,
> void *user_data, mainloop_destroy_func destroy);
> +int mainloop_sd_notify(const char *state);
> --
> 2.17.2
>
Applied.
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2018-12-05 12:09 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-11-30 10:20 [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 02/10] share/mainloop: Add watchdog support Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 03/10] tool/btmon-logger: Use mainloop_notify instead of sd_notify Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 04/10] core: Use mainloop_sd_notify " Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 05/10] core: Remove old code related to sd_notify Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 06/10] shared/timeout-glib: Check 0 id when removing timeout Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 07/10] shared/mainloop: Add mainloop_run_with_signal Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 08/10] shared/mainloop: Remove mainloop_set_signal Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 09/10] core: Make use of mainloop_run_with_signal Luiz Augusto von Dentz
2018-11-30 10:20 ` [PATCH v3 10/10] shared/tester: " Luiz Augusto von Dentz
2018-12-05 12:09 ` [PATCH v3 01/10] share/mainloop: Add handling of NOTIFY_SOCKET Luiz Augusto von Dentz
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).