From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp0 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id wI4AENsxwV8iUwAA0tVLHw (envelope-from ) for ; Fri, 27 Nov 2020 17:05:31 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp0 with LMTPS id 8JXXC9sxwV8RegAA1q6Kng (envelope-from ) for ; Fri, 27 Nov 2020 17:05:31 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id C97ED9402A2 for ; Fri, 27 Nov 2020 17:05:30 +0000 (UTC) Received: from localhost ([::1]:53612 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kihBZ-00080W-C2 for larch@yhetil.org; Fri, 27 Nov 2020 12:05:29 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:44376) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kihB8-0007zY-SR for guix-patches@gnu.org; Fri, 27 Nov 2020 12:05:02 -0500 Received: from debbugs.gnu.org ([209.51.188.43]:34558) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kihB8-0007sw-KC for guix-patches@gnu.org; Fri, 27 Nov 2020 12:05:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1kihB8-0006zt-EH for guix-patches@gnu.org; Fri, 27 Nov 2020 12:05:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#44800] [PATCH v2 1/3] Add Avahi support. Resent-From: Ludovic =?UTF-8?Q?Court=C3=A8s?= Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Fri, 27 Nov 2020 17:05:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 44800 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: Mathieu Othacehe Cc: 44800@debbugs.gnu.org Received: via spool by 44800-submit@debbugs.gnu.org id=B44800.160649669826883 (code B ref 44800); Fri, 27 Nov 2020 17:05:02 +0000 Received: (at 44800) by debbugs.gnu.org; 27 Nov 2020 17:04:58 +0000 Received: from localhost ([127.0.0.1]:46104 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kihB4-0006zX-CE for submit@debbugs.gnu.org; Fri, 27 Nov 2020 12:04:58 -0500 Received: from eggs.gnu.org ([209.51.188.92]:54350) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kihB2-0006zJ-8m for 44800@debbugs.gnu.org; Fri, 27 Nov 2020 12:04:57 -0500 Received: from fencepost.gnu.org ([2001:470:142:3::e]:54310) by eggs.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kihAw-0007sW-VE for 44800@debbugs.gnu.org; Fri, 27 Nov 2020 12:04:50 -0500 Received: from [2a01:e0a:1d:7270:af76:b9b:ca24:c465] (port=47902 helo=ribbon) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1kihAs-0004i9-Bs; Fri, 27 Nov 2020 12:04:47 -0500 From: Ludovic =?UTF-8?Q?Court=C3=A8s?= References: <20201124132145.217751-1-othacehe@gnu.org> <20201124132145.217751-2-othacehe@gnu.org> Date: Fri, 27 Nov 2020 18:04:44 +0100 In-Reply-To: <20201124132145.217751-2-othacehe@gnu.org> (Mathieu Othacehe's message of "Tue, 24 Nov 2020 14:21:43 +0100") Message-ID: <87k0u6spcj.fsf@gnu.org> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: -2.3 (--) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-Spam-Score: -3.3 (---) X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: "Guix-patches" X-Migadu-Flow: FLOW_IN X-Migadu-Spam-Score: -2.77 X-Scanner: ns3122888.ip-94-23-21.eu Authentication-Results: aspmx1.migadu.com; dkim=none; dmarc=pass (policy=none) header.from=gnu.org; spf=pass (aspmx1.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-TUID: N7hNgDv9cnAT Mathieu Othacehe skribis: > * guix/avahi.scm: New file. > * Makefile.am (MODULES): Add it. > * configure.ac: Add Guile-Avahi dependency. > * doc/guix.texi (Requirements): Document it. > * gnu/packages/package-management.scm (guix)[native-inputs]: Add > "guile-avahi", > [propagated-inputs]: ditto. > * guix/self.scm (specification->package): Add guile-avahi. > (compiled-guix): Ditto. [...] > --- a/configure.ac > +++ b/configure.ac > @@ -161,6 +161,12 @@ if test "x$have_guile_lzlib" !=3D "xyes"; then > AC_MSG_ERROR([Guile-lzlib is missing; please install it.]) > fi >=20=20 > +dnl Check for Guile-Avahi. > +GUILE_MODULE_AVAILABLE([have_guile_avahi], [(avahi)]) > +if test "x$have_guile_avahi" !=3D "xyes"; then > + AC_MSG_ERROR([Guile-Avahi is missing; please install it.]) > +fi I wonder if we could/should make it an optional dependency. (guix avahi) would need to autoload (avahi), which might be slightly annoying. An argument in favor of making it mandatory is that it would help make the feature more widely used, and thus more widely useful. > +(define-record-type* > + avahi-service make-avahi-service > + avahi-service? > + (name avahi-service-name) > + (type avahi-service-type) > + (interface avahi-service-interface) > + (local-address avahi-service-local-address) > + (address avahi-service-address) > + (port avahi-service-port) > + (txt avahi-service-txt)) You could use (srfi srfi-9) =E2=80=98define-record-type=E2=80=99 since the = extra (guix records) features are not necessary here. > +(define* (avahi-publish-service-thread name > + #:key > + type port > + (stop-loop? (const #f)) > + (timeout 100) > + (txt '())) > + "Publish the service TYPE using Avahi, for the given PORT, on all inte= rfaces > +and for all protocols. Also, advertise the given TXT record list. > + > +This procedure starts a new thread running the Avahi event loop. It exi= ts > +when STOP-LOOP? procedure returns true." > + (define client-callback > + (lambda (client state) > + (when (eq? state client-state/s-running) > + (let ((group (make-entry-group client (const #t)))) > + (apply > + add-entry-group-service! group interface/unspecified > + protocol/unspecified '() > + name type #f #f port txt) > + (commit-entry-group group))))) > + > + (call-with-new-thread > + (lambda () > + (let* ((poll (make-simple-poll)) > + (client (make-client (simple-poll poll) > + (list > + client-flag/ignore-user-config) > + client-callback))) > + (while (not (stop-loop?)) > + (iterate-simple-poll poll timeout)))))) (I wanted to add an API in Guile-Avahi to =E2=80=9Cinvert inversion of cont= rol=E2=80=9D so that one could escape callback hell but never got around to completing it.) > +(define (interface->ip-address interface) > + "Return the local IP address of the given INTERFACE." > + (let ((address > + (network-interface-address > + (socket AF_INET SOCK_STREAM 0) interface))) > + (inet-ntop (sockaddr:fam address) (sockaddr:addr address)))) Make sure to close the socket. Can=E2=80=99t we obtain the IP address without creating a socket actually? = Noob here. > + ;; Handle service resolution events. > + (cond ((eq? event resolver-event/found) > + (info (G_ "resolved service `~a' at `~a:~a'~%") > + service-name (inet-ntop family address) port) IWBN to not add UI code in here. Thanks, Ludo=E2=80=99.