From 6dc69c9a94e128f6703ddfcc38c253f0c8cc9d7b Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 22 Jun 2005 00:36:49 +0000 Subject: * add support for using an avahi daemon if available git-svn-id: file:///home/lennart/svn/public/nss-mdns/trunk@81 0ee8848e-81ea-0310-a63a-f631d1a40d77 --- src/avahi.c | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 src/avahi.c (limited to 'src/avahi.c') diff --git a/src/avahi.c b/src/avahi.c new file mode 100644 index 0000000..cd4db00 --- /dev/null +++ b/src/avahi.c @@ -0,0 +1,145 @@ +/* $Id$ */ + +/*** + This file is part of nss-mdns. + + nss-mdns 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 of the + License, or (at your option) any later version. + + nss-mdns 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 Lesser General Public + License along with nss-mdns; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + USA. +***/ + + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "avahi.h" +#include "util.h" + +#define AVAHI_SOCKET "/var/run/avahi/socket" + +static FILE *open_socket(void) { + int fd = -1; + struct sockaddr_un sa; + FILE *f; + + if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) < 0) + goto fail; + + set_cloexec(fd); + + memset(&sa, 0, sizeof(sa)); + sa.sun_family = AF_UNIX; + strncpy(sa.sun_path, AVAHI_SOCKET, sizeof(sa.sun_path)-1); + sa.sun_path[sizeof(sa.sun_path)-1] = 0; + + if (connect(fd, (struct sockaddr*) &sa, sizeof(sa)) < 0) + goto fail; + + if (!(f = fdopen(fd, "r+"))) + goto fail; + + return f; + +fail: + if (fd >= 0) + close(fd); + + return NULL; + +} + +int avahi_resolve_name(int af, const char* name, void* data) { + FILE *f; + char *e, *p; + int ret = -1; + char ln[256]; + + assert(af == AF_INET || af == AF_INET6); + + if (!(f = open_socket())) + goto finish; + + fprintf(f, "RESOLVE-HOSTNAME%s %s\n", af == AF_INET ? "-IPV4" : "-IPV6", name); + fflush(f); + + if (!(fgets(ln, sizeof(ln), f))) + goto finish; + + if (ln[0] != '+') { + ret = 1; + goto finish; + } + + p = ln+1; + p += strspn(p, "\t "); + e = p + strcspn(p, "\n\r\t "); + *e = 0; + + if (inet_pton(af, p, data) <= 0) + goto finish; + + ret = 0; + +finish: + + if (f) + fclose(f); + + return ret; +} + +int avahi_resolve_address(int af, const void *data, char* name, size_t name_len) { + FILE *f; + char *e, *p; + int ret = -1; + char a[256], ln[256]; + + assert(af == AF_INET || af == AF_INET6); + + if (!(f = open_socket())) + goto finish; + + fprintf(f, "RESOLVE-ADDRESS %s\n", inet_ntop(af, data, a, sizeof(a))); + + if (!(fgets(ln, sizeof(ln), f))) + goto finish; + + if (ln[0] != '+') { + ret = 1; + goto finish; + } + + p = ln+1; + p += strspn(p, "\t "); + e = p + strcspn(p, "\n\r\t "); + *e = 0; + + strncpy(name, p, name_len-1); + name[name_len-1] = 0; + + ret = 0; + +finish: + + if (f) + fclose(f); + + return ret; +} -- cgit