int sigyn_hostname(char *host, int len) { int res; StartWSA(); res = gethostname(host, len); return res; }
INetEventLoop* CreateNetEventLoop() { #ifdef _WIN32 StartWSA(); #else SetupSignal(); #endif return new NetClient; }
int SocketServer_Run(SocketServer* self, char * listening_port_number) { self->itsPort = atoi(listening_port_number); StartWSA(self); CreateSocket(self); BindToSocket(self); WaitForConnection(self); Shutdown(self); return 0; }
socket_t uplink_connect(char *uplink, uint16_t port, char *vhost) { socket_t sock; int error, flags; unsigned int optval; struct addrinfo *res = NULL, hints; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; StartWSA(); if ((error = getaddrinfo(uplink, NULL, &hints, &res))) sigyn_fatal("Cannot resolve hostname(%s): %s", uplink, gai_strerror(error)); if (res->ai_addr == NULL) { freeaddrinfo(res); sigyn_fatal("Cannot resolve hostname (%s)."); } logger(LOG_STATUS, "Attempting to connect to %s:%d", uplink, port); if (!(sock = socket(res->ai_family, res->ai_socktype, res->ai_protocol))) { freeaddrinfo(res); sigyn_fatal("Unable to create socket."); } if (sock > me.maxfd) me.maxfd = sock; if (vhost != NULL) { struct addrinfo *bindres = NULL; if ((error = getaddrinfo(vhost, NULL, &hints, &bindres))) { freeaddrinfo(res); close_portable(sock); sigyn_fatal("Cannot resolve vhost (%s): %s", vhost, gai_strerror(error)); } if (bindres->ai_addr == NULL) { freeaddrinfo(res); freeaddrinfo(bindres); sigyn_fatal("Cannot resolve vhost (%s)."); } optval = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char *)&optval, sizeof(optval)); if (bind(sock, bindres->ai_addr, bindres->ai_addrlen) < 0) { freeaddrinfo(res); freeaddrinfo(bindres); close_portable(sock); sigyn_fatal("Unable to bind to vhost (%s): %s", vhost, strerror(errno)); } freeaddrinfo(bindres); } logger(LOG_DEBUG, "Setting file descriptor %d as non-blocking.", sock); #ifdef _WIN32 ioctlsocket(sock, FIONBIO, 1); #else flags = fcntl(sock, F_GETFL, 0); flags |= O_NONBLOCK; fcntl(sock, F_SETFL, flags); #endif switch(res->ai_family) { case AF_INET: ((struct sockaddr_in *) res->ai_addr)->sin_port = htons(port); break; case AF_INET6: ((struct sockaddr_in6 *) res->ai_addr)->sin6_port = htons(port); break; } if ((connect(sock, res->ai_addr, res->ai_addrlen) == -1) && errno != EINPROGRESS && errno != EINTR) { close_portable(sock); freeaddrinfo(res); if (vhost) sigyn_fatal("Failed to connect to %s (Using vhost %s): %s", uplink, vhost, strerror(errno)); else sigyn_fatal("Failed to connect to %s: %s", uplink, strerror(errno)); } freeaddrinfo(res); return sock; }