UByte PancakeNetworkActivate() { UInt16 i; if(!numListenSockets) { PancakeLoggerFormat(PANCAKE_LOGGER_ERROR, 0, "No network interfaces configured"); return 0; } for(i = 0; i < numListenSockets; i++) { PancakeSocket *sock = listenSockets[i]; // Start listening on socket if(listen(sock->fd, (Int32) (UNative) sock->data) == -1) { Byte *name = PancakeNetworkGetInterfaceName(sock->localAddress); PancakeLoggerFormat(PANCAKE_LOGGER_ERROR, 0, "Can't listen on %s: %s", name, strerror(errno)); PancakeFree(name); return 0; } sock->data = NULL; } return 1; }
PANCAKE_API UByte PancakeNetworkInterfaceConfiguration(UByte step, config_setting_t *setting, PancakeConfigurationScope **scope) { switch(step) { case PANCAKE_CONFIGURATION_INIT: { PancakeSocket *socket = PancakeAllocate(sizeof(PancakeSocket)); /* Used for backlog storage */ socket->data = (void*) 0x1; socket->fd = -1; socket->localAddress = PancakeAllocate(sizeof(struct sockaddr)); socket->onRead = NULL; socket->onWrite = NULL; socket->onRemoteHangup = NULL; socket->flags = 0; socket->layer = NULL; socket->localAddress->sa_family = 0; memset(socket->localAddress->sa_data, 0, sizeof(socket->localAddress->sa_data)); setting->hook = (void*) socket; } break; case PANCAKE_CONFIGURATION_DTOR: { PancakeSocket *socket = (PancakeSocket*) setting->hook; if(socket->fd != -1) { close(socket->fd); } PancakeFree(socket->localAddress); PancakeFree(socket); // Make library happy setting->hook = NULL; } break; } return 1; }
STATIC UByte PancakeAuthenticationGroupConfiguration(UByte step, config_setting_t *setting, PancakeConfigurationScope **scope) { PancakeAuthenticationConfiguration *config; if(step == PANCAKE_CONFIGURATION_INIT) { config = PancakeAllocate(sizeof(PancakeAuthenticationConfiguration)); setting->hook = (void*) config; config->backend = NULL; config->backendData = NULL; } else { config = (PancakeAuthenticationConfiguration*) setting->hook; PancakeFree(config); } return 1; }
void PancakeNetworkUnload() { PancakeFree(listenSockets); HASH_CLEAR(hh, architectures); }