151e4b3daee0dd31bfd7143de86d97fa1c35b324fLennart Poettering#ifndef foocorehfoo
251e4b3daee0dd31bfd7143de86d97fa1c35b324fLennart Poettering#define foocorehfoo
3ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering
4ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering/***
5ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  This file is part of avahi.
6a97605e07ad7f44f2f65e15be64880e61a39ab43Lennart Poettering
7ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  avahi is free software; you can redistribute it and/or modify it
8ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  under the terms of the GNU Lesser General Public License as
9ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  published by the Free Software Foundation; either version 2.1 of the
10ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  License, or (at your option) any later version.
11a97605e07ad7f44f2f65e15be64880e61a39ab43Lennart Poettering
12ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  avahi is distributed in the hope that it will be useful, but WITHOUT
13ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
15ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  Public License for more details.
16a97605e07ad7f44f2f65e15be64880e61a39ab43Lennart Poettering
17ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  You should have received a copy of the GNU Lesser General Public
18ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  License along with avahi; if not, write to the Free Software
19ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
20ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering  USA.
21ab84bbc4bef07413f95c3237e29f2287319e0f4cLennart Poettering***/
2233ccd714ea9469b5b7d3b36bbe468ba1b0f31dfcLennart Poettering
231ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poettering/** \file core.h The Avahi Multicast DNS and DNS Service Discovery implementation. */
2454d7450ef8b085110c380d4263794deffa5edda4Lennart Poettering
257c171df2b2ae4d3f2cbab669d5b5b96562bdd9a8Lennart Poettering/** An mDNS responder object */
26c526a85bcdb32f84e6ade05ce647a431f6a07c10Lennart Poetteringtypedef struct AvahiServer AvahiServer;
274de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering
286efe2615e04c6ef664fa9d49b013e261ba1e6e66Lennart Poettering#include <avahi-common/cdecl.h>
29c5544522f6409095627dc3d1129560195ab4ec40Trent Lloyd#include <avahi-common/address.h>
30baf1f046e0255c4e0f864044ce06fe3d360eb4daLennart Poettering#include <avahi-common/defs.h>
314f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering#include <avahi-common/watch.h>
32d7b03753f10d93d278091d39b95adf3b18a2770cLennart Poettering#include <avahi-common/timeval.h>
336efe2615e04c6ef664fa9d49b013e261ba1e6e66Lennart Poettering#include <avahi-core/rr.h>
3433ccd714ea9469b5b7d3b36bbe468ba1b0f31dfcLennart Poettering
3514f8d9beb7ef14b0aab5512345e09109bdd8cb0cLennart PoetteringAVAHI_C_DECL_BEGIN
3614f8d9beb7ef14b0aab5512345e09109bdd8cb0cLennart Poettering
371ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poettering/** Maximum number of defined DNS servers for wide area DNS */
383073103812f0ea376582eb0ff1479945a847b361Lennart Poettering#define AVAHI_WIDE_AREA_SERVERS_MAX 4
391ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poettering
404de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering/** Prototype for callback functions which are called whenever the state of an AvahiServer object changes */
414f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringtypedef void (*AvahiServerCallback) (AvahiServer *s, AvahiServerState state, void* userdata);
424de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering
434de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering/** Stores configuration options for a server instance */
4440cd1f60e9d84610401db992003a3b282de5fcaeLennart Poetteringtypedef struct AvahiServerConfig {
451ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poettering    char *host_name;                  /**< Default host name. If left empty defaults to the result of gethostname(2) of the libc */
461ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poettering    char *domain_name;                /**< Default domain name. If left empty defaults to .local */
474f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int use_ipv4;                     /**< Enable IPv4 support */
484f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int use_ipv6;                     /**< Enable IPv6 support */
491946f54fc6380ee57dcd3f2f491270c7b08a8479Lennart Poettering    AvahiStringList *allow_interfaces;/**< Allow specific interface to be used for Avahi */
501946f54fc6380ee57dcd3f2f491270c7b08a8479Lennart Poettering    AvahiStringList *deny_interfaces; /**< Deny specific interfaces to be used for Avahi */
514f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int publish_hinfo;                /**< Register a HINFO record for the host containing the local OS and CPU type */
524f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int publish_addresses;            /**< Register A, AAAA and PTR records for all local IP addresses */
534f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int publish_workstation;          /**< Register a _workstation._tcp service */
544f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int publish_domain;               /**< Announce the local domain for browsing */
554f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int check_response_ttl;           /**< If enabled the server ignores all incoming responses with IP TTL != 255. Newer versions of the RFC do no longer contain this check, so it is disabled by default. */
564f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int use_iff_running;              /**< Require IFF_RUNNING on local network interfaces. This is the official way to check for link beat. Unfortunately this doesn't work with all drivers. So bettere leave this off. */
574f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int enable_reflector;             /**< Reflect incoming mDNS traffic to all local networks. This allows mDNS based network browsing beyond ethernet borders */
584f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int reflect_ipv;                  /**< if enable_reflector is 1, enable/disable reflecting between IPv4 and IPv6 */
59e8edcf439d2ce1593af11c357893681b6b3c0bb4Lennart Poettering    int add_service_cookie;           /**< Add magic service cookie to all locally generated records implicitly */
601ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poettering    int enable_wide_area;             /**< Enable wide area support */
613073103812f0ea376582eb0ff1479945a847b361Lennart Poettering    AvahiAddress wide_area_servers[AVAHI_WIDE_AREA_SERVERS_MAX]; /** Unicast DNS server to use for wide area lookup */
621ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poettering    unsigned n_wide_area_servers;     /**< Number of servers in wide_area_servers[] */
63c2662cc5d17fcb54ec6d04dd81a26bb427c55c74Lennart Poettering    int disallow_other_stacks;        /**< Make sure that only one mDNS responder is run at the same time on the local machine. If this is enable Avahi will not set SO_REUSADDR on its sockets, effectively preventing other stacks from running on the local machine */
64e2f7e83d25a5f0966938163c18b1fd8c399393b1Lennart Poettering    AvahiStringList *browse_domains;  /**< Additional browsing domains */
65fbce111b069aa1e4c701ed37ee1d9f6d6cefaac5Lennart Poettering    int disable_publishing;           /**< Disable publishing of any record */
66bba061b0c38d6308a10c8ef543fa72c1e1c5fad7Sebastien Estienne    int allow_point_to_point;         /**< Enable publishing on POINTOPOINT interfaces */
671c24d17c1001240306e054ea534c3aa69a45604bLennart Poettering    int publish_a_on_ipv6;            /**< Publish an IPv4 A RR on IPv6 sockets */
681c24d17c1001240306e054ea534c3aa69a45604bLennart Poettering    int publish_aaaa_on_ipv4;         /**< Publish an IPv4 A RR on IPv6 sockets */
69037ca37a213d9e40258f5ebc3b00113df9f842d1Lennart Poettering    unsigned n_cache_entries_max;     /**< Maximum number of cache entries per interface */
70d7b03753f10d93d278091d39b95adf3b18a2770cLennart Poettering    AvahiUsec ratelimit_interval;     /**< If non-zero, rate-limiting interval parameter. */
71d7b03753f10d93d278091d39b95adf3b18a2770cLennart Poettering    unsigned ratelimit_burst;         /**< If ratelimit_interval is non-zero, rate-limiting burst parameter. */
7240cd1f60e9d84610401db992003a3b282de5fcaeLennart Poettering} AvahiServerConfig;
7340cd1f60e9d84610401db992003a3b282de5fcaeLennart Poettering
744de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering/** Allocate a new mDNS responder object. */
754de3df3db7df43474176533d0b5fac851dd4a9b4Lennart PoetteringAvahiServer *avahi_server_new(
76fcc9b0efe1accdb0edcb3143a8e15782e69383dbLennart Poettering    const AvahiPoll *api,          /**< The main loop adapter */
77e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering    const AvahiServerConfig *sc,   /**< If non-NULL a pointer to a configuration structure for the server. The server makes an internal deep copy of this structure, so you may free it using avahi_server_config_done() immediately after calling this function. */
784de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering    AvahiServerCallback callback,  /**< A callback which is called whenever the state of the server changes */
794f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    void* userdata,                /**< An opaque pointer which is passed to the callback function */
804f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering    int *error);
814de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering
824de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering/** Free an mDNS responder object */
837dce450bdc23ea306a61e00f914481e29ebcb176Lennart Poetteringvoid avahi_server_free(AvahiServer* s);
8433ccd714ea9469b5b7d3b36bbe468ba1b0f31dfcLennart Poettering
85e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering/** Fill in default values for a server configuration structure. If you
86e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * make use of an AvahiServerConfig structure be sure to initialize
87e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * it with this function for the sake of upwards library
88e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * compatibility. This call may allocate strings on the heap. To
89e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * release this memory make sure to call
90e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * avahi_server_config_done(). If you want to replace any strings in
91e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * the structure be sure to free the strings filled in by this
924f0a5e7572a4257894b4bfede42c26d65152609eLennart Poettering * function with avahi_free() first and allocate the replacements with
93e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * g_malloc() (or g_strdup()).*/
94e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart PoetteringAvahiServerConfig* avahi_server_config_init(
95e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering   AvahiServerConfig *c /**< A structure which shall be filled in */ );
96e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering
97e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering/** Make a deep copy of the configuration structure *c to *ret. */
98e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart PoetteringAvahiServerConfig* avahi_server_config_copy(
99e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering    AvahiServerConfig *ret /**< destination */,
100e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering    const AvahiServerConfig *c /**< source */);
101e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering
102e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering/** Free the data in a server configuration structure. */
10340cd1f60e9d84610401db992003a3b282de5fcaeLennart Poetteringvoid avahi_server_config_free(AvahiServerConfig *c);
104e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering
105e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering/** Return the currently chosen domain name of the server object. The
106e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * return value points to an internally allocated string. Be sure to
107e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * make a copy of the string before calling any other library
108e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * functions. */
1094f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringconst char* avahi_server_get_domain_name(AvahiServer *s);
110e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering
111e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering/** Return the currently chosen host name. The return value points to a internally allocated string. */
1124f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringconst char* avahi_server_get_host_name(AvahiServer *s);
113e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering
114e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering/** Return the currently chosen host name as a FQDN ("fully qualified
115e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * domain name", i.e. the concatenation of the host and domain
116e1f934bbe96fd8e7f3f5212b783c0d3a434d4789Lennart Poettering * name). The return value points to a internally allocated string. */
1174f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringconst char* avahi_server_get_host_name_fqdn(AvahiServer *s);
1184de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering
1193184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poettering/** Change the host name of a running mDNS responder. This will drop
1203184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poetteringall automicatilly generated RRs and readd them with the new
1213184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poetteringname. Since the responder has to probe for the new RRs this function
1223184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poetteringtakes some time to take effect altough it returns immediately. This
1233184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poetteringfunction is intended to be called when a host name conflict is
1243184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poetteringreported using AvahiServerCallback. The caller should readd all user
1253184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poetteringdefined RRs too since they otherwise continue to point to the outdated
1263184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poetteringhost name..*/
1274f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringint avahi_server_set_host_name(AvahiServer *s, const char *host_name);
1283184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poettering
1293184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poettering/** Change the domain name of a running mDNS responder. The same rules
1303184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poettering * as with avahi_server_set_host_name() apply. */
1314f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringint avahi_server_set_domain_name(AvahiServer *s, const char *domain_name);
1323184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poettering
1333184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poettering/** Return the opaque user data pointer attached to a server object */
1344f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringvoid* avahi_server_get_data(AvahiServer *s);
1353184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poettering
1363184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poettering/** Change the opaque user data pointer attached to a server object */
1374f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringvoid avahi_server_set_data(AvahiServer *s, void* userdata);
1384de3df3db7df43474176533d0b5fac851dd4a9b4Lennart Poettering
1393184280a20d54b8f468d0b8d6ff0980b74610ec5Lennart Poettering/** Return the current state of the server object */
14022a61b042376903deada022e7585e0585aaa7d43Lennart PoetteringAvahiServerState avahi_server_get_state(AvahiServer *s);
141f5a4db2039532ef93fbb3d98fa048be9d74a83feLennart Poettering
14248cfb3c876636d79dace3ebc8e82c946bc0b7ebfLennart Poettering/** Callback prototype for avahi_server_dump() */
1434f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringtypedef void (*AvahiDumpCallback)(const char *text, void* userdata);
14448cfb3c876636d79dace3ebc8e82c946bc0b7ebfLennart Poettering
14548cfb3c876636d79dace3ebc8e82c946bc0b7ebfLennart Poettering/** Dump the current server status by calling "callback" for each line.  */
1464f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringint avahi_server_dump(AvahiServer *s, AvahiDumpCallback callback, void* userdata);
147bf2db17686a0e29b4e855cadbbaa5e5e4ed2def8Lennart Poettering
1480632e854728e8e64552ae08f90852d4a2658539eLennart Poettering/** Return the last error code */
1494f0a5e7572a4257894b4bfede42c26d65152609eLennart Poetteringint avahi_server_errno(AvahiServer *s);
1500632e854728e8e64552ae08f90852d4a2658539eLennart Poettering
151e8edcf439d2ce1593af11c357893681b6b3c0bb4Lennart Poettering/** Return the local service cookie */
152e8edcf439d2ce1593af11c357893681b6b3c0bb4Lennart Poetteringuint32_t avahi_server_get_local_service_cookie(AvahiServer *s);
153e8edcf439d2ce1593af11c357893681b6b3c0bb4Lennart Poettering
1541ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poettering/** Set the wide area DNS servers */
1551ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poetteringint avahi_server_set_wide_area_servers(AvahiServer *s, const AvahiAddress *a, unsigned n);
1561ffedb586bd2fb6daa3970304fac7c5b415cd38fLennart Poettering
1571f36056b4cf212ae06aa9e4eca72accb17acebb0Lennart Poettering/** Set the browsing domains */
1581f36056b4cf212ae06aa9e4eca72accb17acebb0Lennart Poetteringint avahi_server_set_browse_domains(AvahiServer *s, AvahiStringList *domains);
1591f36056b4cf212ae06aa9e4eca72accb17acebb0Lennart Poettering
1601c24d17c1001240306e054ea534c3aa69a45604bLennart Poettering/** Return the current configuration of the server \since 0.6.17 */
1611c24d17c1001240306e054ea534c3aa69a45604bLennart Poetteringconst AvahiServerConfig* avahi_server_get_config(AvahiServer *s);
1621c24d17c1001240306e054ea534c3aa69a45604bLennart Poettering
16314f8d9beb7ef14b0aab5512345e09109bdd8cb0cLennart PoetteringAVAHI_C_DECL_END
16414f8d9beb7ef14b0aab5512345e09109bdd8cb0cLennart Poettering
16533ccd714ea9469b5b7d3b36bbe468ba1b0f31dfcLennart Poettering#endif
166