static int check_name(const char *full_name, enum rfs_commands cmd_id) { char *server = extract_server(full_name); if (server == NULL) { return -EINVAL; } int sock = nss_connect(server); if (sock < 0) { free(server); return sock; } free(server); int saved_errno = 0; char *name = extract_name(full_name); size_t overall_size = 0; struct rfs_command cmd = { 0 }; struct rfs_answer ans = { 0 }; if (name == NULL) { saved_errno = -EINVAL; goto error; } overall_size = strlen(name) + 1; cmd.command = cmd_id; cmd.data_len = overall_size; #ifdef RFS_DEBUG dump_command(&cmd); #endif if (send(sock, &cmd, sizeof(cmd), 0) != sizeof(cmd)) { saved_errno = errno; free(name); goto error; } DEBUG("sending name: %s\n", name); if (send(sock, name, overall_size, 0) != overall_size) { saved_errno = errno; free(name); goto error; } free(name); if (recv(sock, &ans, sizeof(ans), 0) != sizeof(ans)) { saved_errno = errno; goto error; } #ifdef RFS_DEBUG dump_answer(&ans); #endif if (ans.command != cmd_id) { saved_errno = EINVAL; goto error; } saved_errno = ans.ret_errno; error: shutdown(sock, SHUT_RDWR); close(sock); return -saved_errno; }
static int get_names(const char *server, struct rfs_list **names, enum rfs_commands cmd_id) { if (*names != NULL) { destroy_list(names); } int sock = nss_connect(server); if (sock < 0) { return sock; } int saved_errno = 0; struct rfs_command cmd = { cmd_id, 0 }; struct rfs_answer ans = { 0 }; #ifdef RFS_DEBUG dump_command(&cmd); #endif if (send(sock, &cmd, sizeof(cmd), 0) != sizeof(cmd)) { saved_errno = errno; goto error; } do { if (recv(sock, &ans, sizeof(ans), 0) != sizeof(ans)) { saved_errno = errno; goto error; } #ifdef RFS_DEBUG dump_answer(&ans); #endif if (ans.command != cmd_id) { saved_errno = EINVAL; goto error; } if (ans.data_len > 0) { char *name = malloc(ans.data_len); if (recv(sock, name, ans.data_len, 0) != ans.data_len) { saved_errno = errno; goto error; } if (add_to_list(names, name) == NULL) { saved_errno = EIO; goto error; } } } while (ans.data_len != 0 && ans.ret_errno == 0); goto success; error: destroy_list(names); success: shutdown(sock, SHUT_RDWR); close(sock); return saved_errno; }
PJ_DEF(void) pj_dns_dump_packet(const pj_dns_parsed_packet *res) { unsigned i; PJ_ASSERT_ON_FAIL(res != NULL, return); /* Header part */ PJ_LOG(3,(THIS_FILE, "Domain Name System packet (%s):", (PJ_DNS_GET_QR(res->hdr.flags) ? "response" : "query"))); PJ_LOG(3,(THIS_FILE, " Transaction ID: %d", res->hdr.id)); PJ_LOG(3,(THIS_FILE, " Flags: opcode=%d, authoritative=%d, truncated=%d, rcode=%d", PJ_DNS_GET_OPCODE(res->hdr.flags), PJ_DNS_GET_AA(res->hdr.flags), PJ_DNS_GET_TC(res->hdr.flags), PJ_DNS_GET_RCODE(res->hdr.flags))); PJ_LOG(3,(THIS_FILE, " Nb of queries: %d", res->hdr.qdcount)); PJ_LOG(3,(THIS_FILE, " Nb of answer RR: %d", res->hdr.anscount)); PJ_LOG(3,(THIS_FILE, " Nb of authority RR: %d", res->hdr.nscount)); PJ_LOG(3,(THIS_FILE, " Nb of additional RR: %d", res->hdr.arcount)); PJ_LOG(3,(THIS_FILE, "")); /* Dump queries */ if (res->hdr.qdcount) { PJ_LOG(3,(THIS_FILE, " Queries:")); for (i=0; i<res->hdr.qdcount; ++i) { dump_query(i, &res->q[i]); } PJ_LOG(3,(THIS_FILE, "")); } /* Dump answers */ if (res->hdr.anscount) { PJ_LOG(3,(THIS_FILE, " Answers RR:")); for (i=0; i<res->hdr.anscount; ++i) { dump_answer(i, &res->ans[i]); } PJ_LOG(3,(THIS_FILE, "")); } /* Dump NS sections */ if (res->hdr.anscount) { PJ_LOG(3,(THIS_FILE, " NS Authority RR:")); for (i=0; i<res->hdr.nscount; ++i) { dump_answer(i, &res->ns[i]); } PJ_LOG(3,(THIS_FILE, "")); } /* Dump Additional info sections */ if (res->hdr.arcount) { PJ_LOG(3,(THIS_FILE, " Additional Info RR:")); for (i=0; i<res->hdr.arcount; ++i) { dump_answer(i, &res->arr[i]); } PJ_LOG(3,(THIS_FILE, "")); } }