From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-5.8 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_PASS, URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id BF798C43441 for ; Mon, 26 Nov 2018 16:24:45 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6180120664 for ; Mon, 26 Nov 2018 16:24:45 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="XUgZizVO" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 6180120664 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-bluetooth-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726266AbeK0DTT (ORCPT ); Mon, 26 Nov 2018 22:19:19 -0500 Received: from mail-lj1-f195.google.com ([209.85.208.195]:37116 "EHLO mail-lj1-f195.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726210AbeK0DTT (ORCPT ); Mon, 26 Nov 2018 22:19:19 -0500 Received: by mail-lj1-f195.google.com with SMTP id e5-v6so17170915lja.4 for ; Mon, 26 Nov 2018 08:24:42 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=1XKC2571SGgez9YvIIAL2s5yGwgnhu1krcg6zPdPmyo=; b=XUgZizVOOFbYnRIDs209Z/ibPyOSYO2Ycm2jPy0CmZspGFlwOtuOZE0Z88Wi5FGtkd 5uA63gDb1S1A23JQQ7zyIl/2qQ9Z7bY2H8zZgfJkh6yMax3rDbXqytQjBdEonHuE91IV zxvDltIDkMNiBx+rAh6aVdnWTYSGvegQs9NCG2dnGrGWwwZa1AeWIYGywVQ4s9TxVzTe Q8IQxG7zfSPoEYow3jKid0l4FCa0w0NTQeq1Urh70LMKwYO19sT0jbcTGWNYM6lv/N9+ FbgtGG4e3lg3FLckyUo9ikrp2x2qXhWbeMthfMR7xFoKvaOVBO9UMzY7KNd8HTsKKhpc WC2w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=1XKC2571SGgez9YvIIAL2s5yGwgnhu1krcg6zPdPmyo=; b=cyfZoe7F2I125siGiBcK4dF0mSL/pwFb49+VBcz2lTHC1hrnHD6gqdX/AfJe5473VS lUtCqMSJIJhRwRxYj0XFUoaT/WNHTyoQdeOc32Qd91FItPqQjiYnTLy269iIszWdt5/v Gj/7U5umtXsRApiIoZXuFY8T11FOvsBT+kK96JKkBsC2gV5HxSdOO7sj8psRpsk4JmSM Z4J6YPzq21/wgcxjaLzNGHICboi/87qWoLjho7v69URkOqiixU/pyuUXOHsyrEwpMDqY 0u+k/Kmj3BNZhJph0JWWs2OX7yI5PabosOWJ91Wj1jXcwnMqLM2ZDGAZgJYpXRLcDFXJ gv7Q== X-Gm-Message-State: AA+aEWaUvjbFxBjpkDs3wu2W7GEuvo2Jbs28MI5tQ92bcMwZdHQuveFK +eKkAeWm7YKLWQPzvVws4v40cdIJ X-Google-Smtp-Source: AFSGD/UltJ4Cqigcps5ALkdD458IM850GbsoGGSfxyPg61WsJ3IAcW4RDKiefEzIhTxRFb1j7TvtxA== X-Received: by 2002:a2e:4299:: with SMTP id h25-v6mr104589ljf.5.1543249480890; Mon, 26 Nov 2018 08:24:40 -0800 (PST) Received: from localhost.localdomain (89-27-7-11.bb.dnainternet.fi. [89.27.7.11]) by smtp.gmail.com with ESMTPSA id g70-v6sm120787ljg.92.2018.11.26.08.24.39 for (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 26 Nov 2018 08:24:40 -0800 (PST) From: Luiz Augusto von Dentz To: linux-bluetooth@vger.kernel.org Subject: [PATCH BlueZ 1/6] share/mainloop: Add handling of NOTIFY_SOCKET Date: Mon, 26 Nov 2018 18:24:33 +0200 Message-Id: <20181126162438.27872-1-luiz.dentz@gmail.com> X-Mailer: git-send-email 2.17.2 Sender: linux-bluetooth-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-bluetooth@vger.kernel.org From: Luiz Augusto von Dentz 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 | 8 +++ src/shared/mainloop-notify.c | 104 +++++++++++++++++++++++++++++++++++ src/shared/mainloop-notify.h | 25 +++++++++ src/shared/mainloop.c | 12 ++++ src/shared/mainloop.h | 1 + 6 files changed, 156 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..9d588e8c5 100644 --- a/src/shared/mainloop-glib.c +++ b/src/shared/mainloop-glib.c @@ -36,6 +36,7 @@ #include #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) @@ -70,11 +72,17 @@ int mainloop_run(void) if (!main_loop) return -EINVAL; + mainloop_notify("READY=1"); + g_main_loop_run(main_loop); + mainloop_notify("STOPPING=1"); + 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..fef333c24 --- /dev/null +++ b/src/shared/mainloop-notify.c @@ -0,0 +1,104 @@ +/* + * + * 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 +#endif + +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "mainloop.h" +#include "mainloop-notify.h" + +static char *notify_sock; +static int notify_fd = -1; + +void mainloop_notify_init(void) +{ + const char *sock; + + sock = getenv("NOTIFY_SOCKET"); + if (!sock) + return; + + /* check for abstract socket or absolute path */ + if (sock[0] != '@' && sock[0] != '/') + return; + + notify_sock = strdup(sock); + + notify_fd = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0); +} + +void mainloop_notify_exit(void) +{ + if (notify_fd > 0) { + close(notify_fd); + notify_fd = -1; + } + + free(notify_sock); + notify_sock = NULL; +} + +int mainloop_notify(const char *state) +{ + struct sockaddr_un addr; + struct msghdr msghdr; + struct iovec iovec; + + if (notify_fd <= 0) + return -ENOTCONN; + + memset(&addr, 0, sizeof(addr)); + addr.sun_family = AF_UNIX; + strncpy(addr.sun_path, notify_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(notify_sock); + + if (msghdr.msg_namelen > sizeof(struct sockaddr_un)) + msghdr.msg_namelen = sizeof(struct sockaddr_un); + + msghdr.msg_iov = &iovec; + msghdr.msg_iovlen = 1; + + return sendmsg(notify_fd, &msghdr, MSG_NOSIGNAL); +} 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..9255e6e0e 100644 --- a/src/shared/mainloop.c +++ b/src/shared/mainloop.c @@ -30,13 +30,17 @@ #include #include #include +#include #include #include #include #include #include +#include +#include #include "mainloop.h" +#include "mainloop-notify.h" #define MAX_EPOLL_EVENTS 10 @@ -83,6 +87,8 @@ void mainloop_init(void) mainloop_list[i] = NULL; epoll_terminate = 0; + + mainloop_notify_init(); } void mainloop_quit(void) @@ -141,6 +147,8 @@ int mainloop_run(void) } } + mainloop_notify("READY=1"); + while (!epoll_terminate) { struct epoll_event events[MAX_EPOLL_EVENTS]; int n, nfds; @@ -180,9 +188,13 @@ int mainloop_run(void) } } + mainloop_notify("STOPPING=1"); + 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..7ae6b3c90 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_notify(const char *state); -- 2.17.2