26 #include <netcomm/dns-sd/avahi_thread.h>
27 #include <netcomm/dns-sd/avahi_resolver_handler.h>
29 #include <core/exception.h>
30 #include <utils/system/signal.h>
31 #include <utils/system/argparser.h>
35 #include <arpa/inet.h>
36 #include <netinet/in.h>
38 using namespace fawkes;
47 wait_for_name =
false;
48 wait_for_addr =
false;
51 ~QAAvahiResolverMain()
56 virtual void handle_signal(
int signum)
63 printf(
"Starting AvahiThread\n");
66 printf(
"Waiting until AvahiThread has been initialized\n");
67 at->wait_initialized();
69 wait_for_name = argp->has_arg(
"n");
70 wait_for_addr = argp->has_arg(
"a");
73 if ( (tmp = argp->arg(
"n")) != NULL ) {
74 printf(
"Calling name resolver\n");
75 at->resolve_name(tmp,
this);
78 if ( (tmp = argp->arg(
"a")) != NULL ) {
79 printf(
"Calling address resolver\n");
80 struct sockaddr_in saddr;
81 if ( inet_pton(AF_INET, tmp, &(saddr.sin_addr)) >= 0 ) {
82 at->resolve_address((
struct sockaddr *)&saddr,
sizeof(saddr),
this);
86 printf(
"Waiting for thread\n");
90 virtual void resolved_name(
char *name,
struct sockaddr *addr, socklen_t addrlen)
92 char addrp[INET_ADDRSTRLEN];
93 struct sockaddr_in *in_addr = (
struct sockaddr_in *)addr;
94 if ( inet_ntop(AF_INET, &(in_addr->sin_addr), addrp,
sizeof(addrp)) ) {
95 printf(
"'%s' resolved to '%s'\n", name, addrp);
97 printf(
"'%s' resolved, but could not transform address to presentation form\n", name);
103 wait_for_name =
false;
104 if ( ! wait_for_name && ! wait_for_addr ) at->cancel();
108 virtual void resolved_address(
struct sockaddr_in *addr, socklen_t addrlen,
char *name)
110 char addrp[INET_ADDRSTRLEN];
111 struct sockaddr_in *in_addr = (
struct sockaddr_in *)addr;
112 if ( inet_ntop(AF_INET, &(in_addr->sin_addr), addrp,
sizeof(addrp)) ) {
113 printf(
"Address %s resolved to %s\n", addrp, name);
115 printf(
"Unknown address resolved to '%s'\n", name);
121 wait_for_addr =
false;
122 if ( ! wait_for_name && ! wait_for_addr ) at->cancel();
125 virtual void name_resolution_failed(
char *name)
127 printf(
"Could not resolve '%s'\n", name);
130 wait_for_name =
false;
131 if ( ! wait_for_name && ! wait_for_addr ) at->cancel();
135 virtual void address_resolution_failed(
struct sockaddr_in *addr, socklen_t addrlen)
139 wait_for_addr =
false;
140 if ( ! wait_for_name && ! wait_for_addr ) at->cancel();
153 main(
int argc,
char **argv)
158 printf(
"Usage: %s [-n name] [-a address]\n\n", argv[0]);
164 QAAvahiResolverMain m(argp);