void RemoteSysLog(int log_priority, const char *log_string) { int sd, rfc3164_len = 1024; char message[CF_BUFSIZE]; time_t now = time(NULL); int pri = log_priority | FACILITY; #if defined(HAVE_GETADDRINFO) int err; struct addrinfo query, *response, *ap; char strport[CF_MAXVARSIZE]; snprintf(strport, CF_MAXVARSIZE - 1, "%u", (unsigned) SYSLOG_PORT); memset(&query, 0, sizeof(struct addrinfo)); query.ai_family = AF_UNSPEC; query.ai_socktype = SOCK_DGRAM; if ((err = getaddrinfo(SYSLOG_HOST, strport, &query, &response)) != 0) { CfOut(OUTPUT_LEVEL_INFORM, "", "Unable to find syslog_host or service: (%s/%s) %s", SYSLOG_HOST, strport, gai_strerror(err)); return; } for (ap = response; ap != NULL; ap = ap->ai_next) { CfOut(OUTPUT_LEVEL_VERBOSE, "", " -> Connect to syslog %s = %s on port %s\n", SYSLOG_HOST, sockaddr_ntop(ap->ai_addr), strport); if ((sd = socket(ap->ai_family, ap->ai_socktype, IPPROTO_UDP)) == -1) { CfOut(OUTPUT_LEVEL_INFORM, "socket", "Couldn't open a socket"); continue; } else { char timebuffer[26]; snprintf(message, rfc3164_len, "<%u>%.15s %s %s", pri, cf_strtimestamp_local(now, timebuffer) + 4, VFQNAME, log_string); if (sendto(sd, message, strlen(message), 0, ap->ai_addr, ap->ai_addrlen) == -1) { CfOut(OUTPUT_LEVEL_VERBOSE, "sendto", " -> Couldn't send \"%s\" to syslog server \"%s\"\n", message, SYSLOG_HOST); } else { CfOut(OUTPUT_LEVEL_VERBOSE, "", " -> Syslog message: \"%s\" to server \"%s\"\n", message, SYSLOG_HOST); } close(sd); return; } } #else struct sockaddr_in addr; char timebuffer[26]; sockaddr_pton(AF_INET, SYSLOG_HOST, &addr); addr.sin_port = htons(SYSLOG_PORT); if ((sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) { CfOut(OUTPUT_LEVEL_ERROR, "sendto", " !! Unable to send syslog datagram"); return; } snprintf(message, rfc3164_len, "<%u>%.15s %s %s", pri, cf_strtimestamp_local(now, timebuffer) + 4, VFQNAME, log_string); if (sendto(sd, message, strlen(message), 0, (struct sockaddr *) &addr, sizeof(addr)) == -1) { CfOut(OUTPUT_LEVEL_ERROR, "sendto", " !! Unable to send syslog datagram"); return; } CfOut(OUTPUT_LEVEL_VERBOSE, "", " -> Syslog message: \"%s\" to server %s\n", message, SYSLOG_HOST); close(sd); #endif }
int FuzzySetMatch(char *s1, char *s2) { short isCIDR = false, isrange = false, isv6 = false, isv4 = false; char address[CF_ADDRSIZE]; int mask; unsigned long a1, a2; if (strcmp(s1, s2) == 0) { return 0; } if (strstr(s1, "/") != 0) { isCIDR = true; } if (strstr(s1, "-") != 0) { isrange = true; } if (strstr(s1, ".") != 0) { isv4 = true; } if (strstr(s1, ":") != 0) { isv6 = true; } if (strstr(s2, ".") != 0) { isv4 = true; } if (strstr(s2, ":") != 0) { isv6 = true; } if (isv4 && isv6) { /* This is just wrong */ return -1; } if (isCIDR && isrange) { CfOut(cf_error, "", "Cannot mix CIDR notation with xxx-yyy range notation: %s", s1); return -1; } if (!(isv6 || isv4)) { CfOut(cf_error, "", "Not a valid address range - or not a fully qualified name: %s", s1); return -1; } if (!(isrange || isCIDR)) { if (strlen(s2) > strlen(s1)) { if (*(s2 + strlen(s1)) != '.') { return -1; // Because xxx.1 should not match xxx.12 in the same octet } } return strncmp(s1, s2, strlen(s1)); /* do partial string match */ } if (isv4) { if (isCIDR) { struct sockaddr_in addr1, addr2; int shift; address[0] = '\0'; mask = 0; sscanf(s1, "%16[^/]/%d", address, &mask); shift = 32 - mask; sockaddr_pton(AF_INET, address, &addr1); sockaddr_pton(AF_INET, s2, &addr2); a1 = htonl(addr1.sin_addr.s_addr); a2 = htonl(addr2.sin_addr.s_addr); a1 = a1 >> shift; a2 = a2 >> shift; if (a1 == a2) { return 0; } else { return -1; } } else { long i, from = -1, to = -1, cmp = -1; char *sp1, *sp2, buffer1[CF_MAX_IP_LEN], buffer2[CF_MAX_IP_LEN]; sp1 = s1; sp2 = s2; for (i = 0; i < 4; i++) { buffer1[0] = '\0'; sscanf(sp1, "%[^.]", buffer1); if (strlen(buffer1) == 0) { break; } sp1 += strlen(buffer1) + 1; sscanf(sp2, "%[^.]", buffer2); sp2 += strlen(buffer2) + 1; if (strstr(buffer1, "-")) { sscanf(buffer1, "%ld-%ld", &from, &to); sscanf(buffer2, "%ld", &cmp); if (from < 0 || to < 0) { CfDebug("Couldn't read range\n"); return -1; } if ((from > cmp) || (cmp > to)) { CfDebug("Out of range %ld > %ld > %ld (range %s)\n", from, cmp, to, buffer2); return -1; } } else { sscanf(buffer1, "%ld", &from); sscanf(buffer2, "%ld", &cmp); if (from != cmp) { CfDebug("Unequal\n"); return -1; } } CfDebug("Matched octet %s with %s\n", buffer1, buffer2); } CfDebug("Matched IP range\n"); return 0; } }