--- mqtt/src/utils.c 2011/11/29 23:31:57 1.1 +++ mqtt/src/utils.c 2012/01/27 15:05:38 1.2 @@ -0,0 +1,72 @@ +#include "global.h" + + +int +srv_Socket(sl_config * __restrict cfg) +{ + int s = -1, n = 1; + struct hostent *host; + char szStr[STRSIZ]; + u_short port; + struct sockaddr_storage ss; + struct sockaddr_in *sin = (struct sockaddr_in*) &ss; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6*) &ss; + + ioTRACE(2); + + cfg_LoadAttribute(cfg, CFG("mqttd"), CFG("port"), CFG(szStr), sizeof szStr, MQTT_PORT); + port = strtol(szStr, NULL, 0); + cfg_LoadAttribute(cfg, CFG("mqttd"), CFG("listen"), CFG(szStr), sizeof szStr, MQTT_HOST); + + host = gethostbyname(szStr); + if (!host) { + printf("Error:: resolver #%d - %s\n", h_errno, hstrerror(h_errno)); + return -1; + } + switch (host->h_addrtype) { + case AF_INET: + sin->sin_len = sizeof(struct sockaddr_in); + sin->sin_family = AF_INET; + sin->sin_port = htons(port); + memcpy(&sin->sin_addr, host->h_addr, sizeof sin->sin_addr); + break; + case AF_INET6: + sin6->sin6_len = sizeof(struct sockaddr_in6); + sin6->sin6_family = AF_INET6; + sin6->sin6_port = htons(port); + memcpy(&sin6->sin6_addr, host->h_addr, sizeof sin6->sin6_addr); + break; + default: + printf("Error:: unsupported socket type %d\n", host->h_addrtype); + return -1; + } + + s = socket(ss.ss_family, SOCK_STREAM, 0); + if (s == -1) { + printf("Error:: socket() #%d - %s\n", errno, strerror(errno)); + return -1; + } + if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &n, sizeof n) == -1) { + printf("Error:: setsockopt(SO_REUSEADDR) #%d - %s\n", errno, strerror(errno)); + close(s); + return -1; + } + if (bind(s, (struct sockaddr*) &ss, ss.ss_len) == -1) { + printf("Error:: bind() #%d - %s\n", errno, strerror(errno)); + close(s); + return -1; + } + + return s; +} + +int +srv_Close(int s) +{ + ioTRACE(2); + + if (s > STDERR_FILENO) + shutdown(s, SHUT_RDWR); + + return close(s); +}