Example #1
0
File: auth.c Project: Nyogtha/uhub
static void add_ip_range(struct linked_list* list, struct ip_range* info)
{
	char buf1[INET6_ADDRSTRLEN+1];
	char buf2[INET6_ADDRSTRLEN+1];

	if (info->lo.af == AF_INET)
	{
		net_address_to_string(AF_INET, &info->lo.internal_ip_data.in.s_addr, buf1, INET6_ADDRSTRLEN);
		net_address_to_string(AF_INET, &info->hi.internal_ip_data.in.s_addr, buf2, INET6_ADDRSTRLEN);
	}
	else if (info->lo.af == AF_INET6)
	{
		net_address_to_string(AF_INET6, &info->lo.internal_ip_data.in6, buf1, INET6_ADDRSTRLEN);
		net_address_to_string(AF_INET6, &info->hi.internal_ip_data.in6, buf2, INET6_ADDRSTRLEN);
	}
	LOG_DEBUG("ACL: Added ip range: %s-%s", buf1, buf2);

	list_append(list, info);
}
Example #2
0
const char* net_get_local_address(int fd)
{
	static char address[INET6_ADDRSTRLEN+1];
	struct sockaddr_storage storage;
	struct sockaddr_in6* name6;
	struct sockaddr_in*  name4;
	struct sockaddr*     name;
	socklen_t namelen;

	memset(address, 0, INET6_ADDRSTRLEN);
	namelen = sizeof(struct sockaddr_storage);
	memset(&storage, 0, namelen);

	name6 = (struct sockaddr_in6*) &storage;
	name4 = (struct sockaddr_in*)  &storage;
	name  = (struct sockaddr*)     &storage;

	if (getsockname(fd, (struct sockaddr*) name, &namelen) != -1)
	{
#ifndef WINSOCK
		int af = storage.ss_family;
		if (af == AF_INET6)
		{
			net_address_to_string(af, (void*) &name6->sin6_addr, address, INET6_ADDRSTRLEN);
		}
		else
#else
		int af = AF_INET;
#endif
		{
			net_address_to_string(af, (void*) &name4->sin_addr, address, INET6_ADDRSTRLEN);
		}
		return address;
	}
	else
	{
		net_error_out(fd, "net_get_local_address");
		net_stats_add_error();
	}

	return "0.0.0.0";
}
Example #3
0
int net_accept(int fd, struct ip_addr_encap* ipaddr)
{
	struct sockaddr_storage addr;
        struct sockaddr_in*  addr4;
        struct sockaddr_in6* addr6;
	socklen_t addr_size;
	int ret = 0;
	addr_size = sizeof(struct sockaddr_storage);

	memset(&addr, 0, addr_size);
	addr4 = (struct sockaddr_in*) &addr;
	addr6 = (struct sockaddr_in6*) &addr;

	ret = accept(fd, (struct sockaddr*) &addr, &addr_size);

	if (ret == -1)
	{
		switch (net_error())
		{
#if defined(__HAIKU__)
			case ETIMEDOUT:
#endif
#if defined(__linux__)
			case ENETDOWN:
			case EPROTO:
			case ENOPROTOOPT:
			case EHOSTDOWN:
			case ENONET:
			case EHOSTUNREACH:
			case EOPNOTSUPP:
				errno = EWOULDBLOCK;
#endif
#ifdef WINSOCK
			case WSAEWOULDBLOCK:
				break;
#else
			case EWOULDBLOCK:
				break;
#endif
			default:
				net_error_out(fd, "net_accept");
				net_stats_add_error();
				return -1;
		}
	}
	else
	{
		net_stats_add_accept();

		if (ipaddr)
		{
			memset(ipaddr, 0, sizeof(struct ip_addr_encap));
			ipaddr->af = addr.ss_family;;
			if (ipaddr->af == AF_INET6)
			{
				char address[INET6_ADDRSTRLEN+1] = { 0, };
				net_address_to_string(AF_INET6, (void*) &addr6->sin6_addr, address, INET6_ADDRSTRLEN+1);
				if (strchr(address, '.'))
				{
					/* Hack to convert IPv6 mapped IPv4 addresses to true IPv4 addresses */
					ipaddr->af = AF_INET;
					net_string_to_address(AF_INET, address, (void*) &ipaddr->internal_ip_data.in);
				}
				else
				{
					memcpy(&ipaddr->internal_ip_data.in6, &addr6->sin6_addr, sizeof(struct in6_addr));
				}
			}
			else
			{
				memcpy(&ipaddr->internal_ip_data.in, &addr4->sin_addr, sizeof(struct in_addr));
			}
		}
	}

	return ret;
}