2 #include <sys/socket.h>
3 #include <netinet/in.h>
16 #include "dns_sd_txt.h"
18 void txt_printer (SHASH UNUSED(hash), const char *key, void *val, void *UNUSED(arg))
20 printf (" %s=%s\n", key, (char *) val);
25 int ans(TMdnsdAnswer *answer, void *UNUSED(arg))
29 struct in_addr ip_addr;
30 if(answer->ttl == 0) now = 0;
31 else now = answer->ttl - time(0);
36 printf("A %s for %d seconds to ip %s\n",answer->name,now,inet_ntoa(ip_addr));
39 printf("PTR %s for %d seconds to %s\n",answer->name,now,answer->rdname);
42 printf("SRV %s for %d seconds to %s:%d\n",answer->name,now,answer->rdname,answer->srv.port);
45 printf("TXT %s for %d seconds:\n",answer->name,now);
46 hash = DnsTxt2Sd (answer->rdata, answer->rdlen);
47 SHashForEach(hash, txt_printer, NULL);
51 printf("%d %s for %d seconds with %d data\n",answer->type,answer->name,now,answer->rdlen);
57 // create multicast 224.0.0.251:5353 socket
60 int s, flag = 1, ittl = 255;
61 struct sockaddr_in in;
65 bzero(&in, sizeof(in));
66 in.sin_family = AF_INET;
67 in.sin_port = htons(MDNS_PORT);
68 in.sin_addr.s_addr = 0;
70 if((s = socket(AF_INET,SOCK_DGRAM,0)) < 0) return 0;
72 setsockopt(s, SOL_SOCKET, SO_REUSEPORT, (char*)&flag, sizeof(flag));
74 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char*)&flag, sizeof(flag));
75 if(bind(s,(struct sockaddr*)&in,sizeof(in))) { close(s); return 0; }
77 mc.imr_multiaddr.s_addr = inet_addr("224.0.0.251");
78 mc.imr_interface.s_addr = htonl(INADDR_ANY);
79 setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mc, sizeof(mc));
80 setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ttl, sizeof(ttl));
81 setsockopt(s, IPPROTO_IP, IP_MULTICAST_TTL, &ittl, sizeof(ittl));
83 flag = fcntl(s, F_GETFL, 0);
85 fcntl(s, F_SETFL, flag);
90 int main(int argc, char *argv[])
97 int bsize, ssize = sizeof(struct sockaddr_in);
98 uint8_t buf[MAX_PACKET_LEN];
99 struct sockaddr_in from, to;
103 if(argc != 3) { printf("usage: mquery 12 _http._tcp.local.\n"); return -1; }
105 d = MdnsdNew(1, 1000);
106 if((s = msock()) == 0) { printf("can't create socket: %s\n",strerror(errno)); return 1; }
108 MdnsdQuery(d,argv[2],atoi(argv[1]),ans,0);
112 tv = MdnsdGetMaxSleepTime(d);
115 select(s+1,&fds,0,0,tv);
119 while((bsize = recvfrom(s,buf,MAX_PACKET_LEN,0,(struct sockaddr*)&from,&ssize)) > 0)
121 bzero(&m,sizeof(DNSMESSAGE));
123 MdnsdInput(d, &m, from.sin_addr, from.sin_port);
125 if(bsize < 0 && errno != EAGAIN) { printf("can't read from socket %d: %s\n",errno,strerror(errno)); return 1; }
128 while(MdnsdOutput(d,&m,&ip,&port))
130 bzero(&to, sizeof(to));
131 to.sin_family = AF_INET;
134 if(sendto(s,DnsMsg2Pkt(&m),DnsMsgLen(&m),0,(struct sockaddr *)&to,sizeof(struct sockaddr_in)) != DnsMsgLen(&m)) { printf("can't write to socket: %s\n",strerror(errno)); return 1; }