Пример #1
0
struct request_context_s*
request_context_create(int fd, addr_info_t *fd_peer)
{
    struct request_context_s *ctx;
    struct sockaddr_storage ss_src, ss_dst;
    socklen_t ss_src_len, ss_dst_len;

    ctx = g_malloc0(sizeof(struct request_context_s));
    ctx->fd = fd;
    gettimeofday(&(ctx->tv_start), NULL);

    ctx->remote_addr = g_malloc0(sizeof(addr_info_t));
    memset(&ss_dst, 0, sizeof(ss_dst));
    ss_dst_len = sizeof(ss_dst);
    getpeername(fd, (struct sockaddr*) &ss_dst, &ss_dst_len);
    addrinfo_from_sockaddr(ctx->remote_addr, (struct sockaddr*)&ss_dst, ss_dst_len);

    ctx->local_addr = g_malloc0(sizeof(addr_info_t));
    if (fd_peer)
        memcpy(ctx->local_addr, fd_peer, sizeof(addr_info_t));
    else {
        memset(&ss_src, 0, sizeof(ss_src));
        ss_src_len = sizeof(ss_src);
        getsockname(fd, (struct sockaddr*) &ss_src, &ss_src_len);
        addrinfo_from_sockaddr(ctx->local_addr, (struct sockaddr*)&ss_src, ss_src_len);
    }

    return ctx;
}
Пример #2
0
gboolean
grid_string_to_addrinfo(const gchar *start, struct addr_info_s *a)
{
	struct sockaddr_storage sas;
	gsize sas_len = sizeof(sas);
	if (!grid_string_to_sockaddr(start, (struct sockaddr*)&sas, &sas_len))
		return FALSE;
	return addrinfo_from_sockaddr (a, (struct sockaddr*)&sas, sas_len);
}
Пример #3
0
gint
accept_do (ACCEPT_POOL ap, addr_info_t *cltaddr, GError **err)
{
	struct sockaddr_storage sa;
	socklen_t saSize;
	int clt;

	errno=0;

	if (!ap) {
		GSETERROR(err,"Invalid parameter");
		return -1;
	}

	if (!ap->srv || ap->count<=0) {
		GSETERROR(err, "Empty server socket pool");
		return -1;
	}

	memset(&sa, 0, sizeof(sa));
	saSize = sizeof(sa);
	clt = UNSAFE_accept_do (ap, (struct sockaddr*) &sa, &saSize, err);

	if (clt < 0)
		return -1;

	if (cltaddr != NULL) {
		memset(cltaddr, 0, sizeof(addr_info_t));
		addrinfo_from_sockaddr(cltaddr, (struct sockaddr*)&sa, saSize);
	}

	/*Set all the helpful socket options*/
	if (gridd_flags & GRIDD_FLAG_NOLINGER)
		sock_set_linger_default(clt);
	if (gridd_flags & GRIDD_FLAG_KEEPALIVE)
		sock_set_keepalive(clt, TRUE);
	if (gridd_flags & GRIDD_FLAG_QUICKACK)
		sock_set_tcpquickack(clt, TRUE);

	return clt;
}