int mdns_lookup_rev(struct mdns *m, struct in_addr *addr) { char name[MAXHOSTNAMELEN]; reversstr(name, addr); name[sizeof(name) - 1] = '\0'; return (mdns_lookup_PTR(m, name)); }
int main(int argc, char *argv[]) { int sockfd; struct mdns mdns; struct mdns_service ms; /* parse options */ if ((res = parse(argc - 1, argv + 1)) == NULL) exit(1); if ((sockfd = mdns_open(&mdns)) == -1) err(1, "mdns_open"); mdns_set_lookup_A_hook(&mdns, my_lookup_A_hook); mdns_set_lookup_PTR_hook(&mdns, my_lookup_PTR_hook); mdns_set_lookup_HINFO_hook(&mdns, my_lookup_HINFO_hook); mdns_set_browse_hook(&mdns, my_browse_hook); mdns_set_resolve_hook(&mdns, my_resolve_hook); mdns_set_group_hook(&mdns, my_group_hook); /* process user request */ switch (res->action) { case NONE: usage(); /* not reached */ break; case LOOKUP: if (res->flags & F_A || res->flags == 0) if (mdns_lookup_A(&mdns, res->hostname) == -1) err(1, "mdns_lookup_A"); if (res->flags & F_HINFO) if (mdns_lookup_HINFO(&mdns, res->hostname) == -1) err(1, "mdns_lookup_A"); if (res->flags & F_PTR) if (mdns_lookup_PTR(&mdns, res->hostname) == -1) err(1, "mdns_lookup_A"); break; case RLOOKUP: if (mdns_lookup_rev(&mdns, &res->addr) == -1) err(1, "mdns_lookup_A"); break; case BROWSE_PROTO: if (mdns_browse_add(&mdns, res->app, res->proto) == -1) err(1, "mdns_browse_add"); break; /* NOTREACHED */ case PUBLISH: if (mdns_group_add(&mdns, res->srvname) == -1) err(1, "mdns_group_add"); if (mdns_service_init(&ms, res->srvname, res->app, res->proto, res->port, res->txtstring, NULL, NULL) == -1) errx(1, "mdns_service_init"); if (mdns_group_add_service(&mdns, res->srvname, &ms) == -1) errx(1, "mdns_group_add_service"); if (mdns_group_commit(&mdns, res->srvname) == -1) errx(1, "mdns_group_commit"); break; case PROXY: if (mdns_group_add(&mdns, res->srvname) == -1) err(1, "mdns_group_add"); if (mdns_service_init(&ms, res->srvname, res->app, res->proto, res->port, res->txtstring, res->hostname, &res->addr) == -1) errx(1, "mdns_service_init"); if (mdns_group_add_service(&mdns, res->srvname, &ms) == -1) errx(1, "mdns_group_add_service"); if (mdns_group_commit(&mdns, res->srvname) == -1) errx(1, "mdns_group_commit"); break; default: errx(1, "Unknown action"); break; /* NOTREACHED */ } for (; ;) { ssize_t n; n = mdns_read(&mdns); fflush(stdout); if (n == -1) err(1, "mdns_read"); if (n == 0) errx(1, "Server closed socket"); if ((res->action == LOOKUP || res->action == RLOOKUP) && res->flags == 0) exit(0); } }