#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); }