예제 #1
0
파일: client.c 프로젝트: darkphase/remotefs
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;

}
예제 #2
0
파일: client.c 프로젝트: darkphase/remotefs
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;
}
예제 #3
0
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, ""));
    }

}