diff --git a/android/bluetoothd-snoop.c b/android/bluetoothd-snoop.c
index 8d9a2d0..25cddee 100644
--- a/android/bluetoothd-snoop.c
+++ b/android/bluetoothd-snoop.c
int main(int argc, char *argv[])
{
const char *path;
- sigset_t mask;
__btd_log_init(NULL, 0);
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");
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 1545dce..8bcf660 100644
--- a/android/system-emulator.c
+++ b/android/system-emulator.c
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]));
/* 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 1253a3d..0d5226f 100644
--- a/emulator/b1ee.c
+++ b/emulator/b1ee.c
char *server_port = NULL, *sniffer_port = NULL;
int ret = EXIT_FAILURE;
ssize_t written;
- sigset_t mask;
for (;;) {
int opt;
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 e70054a..29ec63e 100644
--- a/emulator/hfp.c
+++ b/emulator/hfp.c
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 56246a3..68c5348 100644
--- a/emulator/main.c
+++ b/emulator/main.c
int amptest_count = 0;
int vhci_count = 0;
enum vhci_type vhci_type = VHCI_TYPE_BREDRLE;
- sigset_t mask;
int i;
mainloop_init();
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++) {
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 5fa87ea..8640c02 100644
--- a/monitor/main.c
+++ b/monitor/main.c
unsigned short ellisys_port = 0;
const char *str;
int exit_status;
- sigset_t mask;
mainloop_init();
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();
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 d7e10f3..93abe20 100644
--- a/peripheral/main.c
+++ b/peripheral/main.c
int main(int argc, char *argv[])
{
- sigset_t mask;
int exit_status;
if (getpid() == 1 && getppid() == 0)
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();
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 e9ec6e8..6a65fa4 100644
--- a/src/shared/mainloop.c
+++ b/src/shared/mainloop.c
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;
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;
}
}
- 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];
{
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 aabbc5d..8ccfe85 100644
--- a/src/shared/shell.c
+++ b/src/shared/shell.c
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;
}
/*
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)
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 686fe13..77a70c0 100644
--- a/tools/3dsp.c
+++ b/tools/3dsp.c
uint16_t index = 0;
const char *str;
bool use_raw = false;
- sigset_t mask;
int exit_status;
for (;;) {
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) {
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 b02301c..050b570 100644
--- a/tools/advtest.c
+++ b/tools/advtest.c
int main(int argc ,char *argv[])
{
- sigset_t mask;
int exit_status;
for (;;) {
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");
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 6051f30..8005411 100644
--- a/tools/bluemoon.c
+++ b/tools/bluemoon.c
{
const char *str;
bool use_raw = false;
- sigset_t mask;
int exit_status;
for (;;) {
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) {
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 5adbc8d..6eb99ba 100644
--- a/tools/btattach.c
+++ b/tools/btattach.c
{
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;
mainloop_init();
- sigemptyset(&mask);
- sigaddset(&mask, SIGINT);
- sigaddset(&mask, SIGTERM);
-
- mainloop_set_signal(&mask, signal_callback, NULL, NULL);
-
if (proto) {
unsigned int i;
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 f171bfb..c1ef583 100644
--- a/tools/btconfig.c
+++ b/tools/btconfig.c
int main(int argc, char *argv[])
{
- sigset_t mask;
int exit_status;
for (;;) {
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");
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 51bc362..31e849a 100644
--- a/tools/btgatt-client.c
+++ b/tools/btgatt-client.c
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:",
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 89812bd..bc32789 100644
--- a/tools/btgatt-server.c
+++ b/tools/btgatt-server.c
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;
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 8e36577..5e60973 100644
--- a/tools/btinfo.c
+++ b/tools/btinfo.c
const char *str;
bool use_raw = false;
bool power_down = false;
- sigset_t mask;
int fd, i, exit_status;
for (;;) {
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);
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 1a42824..65953d2 100644
--- a/tools/btmon-logger.c
+++ b/tools/btmon-logger.c
size_t size_limit = 0;
bool parents = false;
int exit_status;
- sigset_t mask;
char *endptr;
mainloop_init();
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 58fa958..fd53ca2 100644
--- a/tools/btproxy.c
+++ b/tools/btproxy.c
bool use_redirect = false;
uint8_t type = HCI_PRIMARY;
const char *str;
- sigset_t mask;
for (;;) {
int opt;
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;
NULL, NULL);
}
- return mainloop_run();
+ return mainloop_run_with_signal(signal_callback, NULL);
}
diff --git a/tools/eddystone.c b/tools/eddystone.c
index f412c90..4764c67 100644
--- a/tools/eddystone.c
+++ b/tools/eddystone.c
{
uint16_t index = 0;
const char *str;
- sigset_t mask;
int exit_status;
for (;;) {
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);
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 4b35804..40078d5 100644
--- a/tools/ibeacon.c
+++ b/tools/ibeacon.c
{
uint16_t index = 0;
const char *str;
- sigset_t mask;
int exit_status;
for (;;) {
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);
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 e77320b..c228b65 100644
--- a/tools/oobtest.c
+++ b/tools/oobtest.c
int main(int argc ,char *argv[])
{
- sigset_t mask;
int exit_status;
for (;;) {
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");
goto done;
}
- exit_status = mainloop_run();
+ exit_status = mainloop_run_with_signal(signal_callback, NULL);
done:
mgmt_unref(mgmt);