static int parseIpPortStr(const char *localAddrStr, struct sockaddr_storage *pLocalAddr, uint16_t localPorts[], size_t maxLocalPorts, int requirePort) { size_t numPortsAdded = 0; int rc = 0; char host[512]; char ports[128]; char uri[512]; host[0] = '\0'; ports[0] = '\0'; uri[0] = '\0'; memset(localPorts, 0, sizeof(uint16_t) * maxLocalPorts); if((rc = strutil_parseAddress(localAddrStr, host, sizeof(host), ports, sizeof(ports), uri, sizeof(uri)) < 0)) { return rc; } if(net_getaddress(host, pLocalAddr) != 0 || (pLocalAddr->ss_family != AF_INET6 && ((struct sockaddr_in *) pLocalAddr)->sin_addr.s_addr == INADDR_NONE)) { LOG(X_ERROR("Invalid address specified in '%s'"), localAddrStr); return -1; } else if(!requirePort && ports[0] == '\0') { LOG(X_ERROR("No port specified in '%s'"), localAddrStr); return -1; } if((numPortsAdded = capture_parsePortStr(ports, localPorts, maxLocalPorts, 1)) < 0) { LOG(X_ERROR("Invalid port specified in '%s'"), localAddrStr); return numPortsAdded; } return numPortsAdded; }
static int getHostAndPorts(const char *str, char host[], size_t szHost, uint16_t ports[], size_t numPorts, int nodupPorts, char uri[], size_t szuri) { const char *p, *p2; size_t sz; if((p = strstr(str, ":"))) { sz = p - str; p++; } else { sz = strlen(str); p = NULL; } if(host && szHost > 0) { if(sz >= szHost) { sz = szHost -1; } memcpy(host, str, sz); host[sz] = '\0'; } if(uri && szuri > 0) { p2 = p; MOVE_UNTIL_CHAR(p2, '/'); if((sz = strlen(p2)) >= szuri) { sz = szuri - 1; } memcpy(uri, p2, sz); uri[sz] = '\0'; } if(p) { return capture_parsePortStr(p, ports, numPorts, nodupPorts); } if(sz == 0 || inet_addr(host) != INADDR_NONE || !strncmp(host, "255.255.255.255", sz)) { LOG(X_ERROR("No port number specified")); return -1; } return 0; }