/* Calls getaddrinfo (tries x attempts) */ char *OS_GetHost(const char *host, unsigned int attempts) { unsigned int i = 0; int error; char *ip; struct addrinfo *hai, *result; if (host == NULL) { return (NULL); } while (i <= attempts) { if ((error = getaddrinfo(host, NULL, NULL, &result)) != 0) { sleep(i++); continue; } if ((ip = (char *) calloc(IPSIZE, sizeof(char))) == NULL) { return (NULL); } hai = result; satop(hai->ai_addr, ip, IPSIZE); freeaddrinfo(result); return (ip); } return (NULL); }
/* Accept a TCP connection */ int OS_AcceptTCP(int socket, char *srcip, size_t addrsize) { int clientsocket; struct sockaddr_storage _nc; socklen_t _ncl; memset(&_nc, 0, sizeof(_nc)); _ncl = sizeof(_nc); if ((clientsocket = accept(socket, (struct sockaddr *) &_nc, &_ncl)) < 0) { return (-1); } satop((struct sockaddr *) &_nc, srcip, addrsize -1); srcip[addrsize -1] = '\0'; return (clientsocket); }
/** void HandleSyslog() v0.2 * Handle syslog connections */ void HandleSyslog() { char buffer[OS_SIZE_1024 +2]; char srcip[IPSIZE +1]; char *buffer_pt = NULL; int recv_b; struct sockaddr_storage peer_info; socklen_t peer_size; /* setting peer size */ peer_size = sizeof(peer_info); /* Initializing some variables */ memset(buffer, '\0', OS_SIZE_1024 +2); /* Connecting to the message queue * Exit if it fails. */ if((logr.m_queue = StartMQ(DEFAULTQUEUE,WRITE)) < 0) { ErrorExit(QUEUE_FATAL,ARGV0, DEFAULTQUEUE); } /* Infinite loop in here */ while(1) { /* Receiving message */ recv_b = recvfrom(logr.sock, buffer, OS_SIZE_1024, 0, (struct sockaddr *)&peer_info, &peer_size); /* Nothing received */ if(recv_b <= 0) continue; /* null terminating the message */ buffer[recv_b] = '\0'; /* Removing new line */ if(buffer[recv_b -1] == '\n') { buffer[recv_b -1] = '\0'; } /* Setting the source ip */ satop((struct sockaddr *) &peer_info, srcip, IPSIZE); srcip[IPSIZE] = '\0'; /* Removing syslog header */ if(buffer[0] == '<') { buffer_pt = strchr(buffer+1, '>'); if(buffer_pt) { buffer_pt++; } else { buffer_pt = buffer; } } else { buffer_pt = buffer; } /* Checking if IP is allowed here */ if(OS_IPNotAllowed(srcip)) { merror(DENYIP_WARN,ARGV0,srcip); } else if(SendMSG(logr.m_queue, buffer_pt, srcip, SYSLOG_MQ) < 0) { merror(QUEUE_ERROR,ARGV0,DEFAULTQUEUE, strerror(errno)); if((logr.m_queue = StartMQ(DEFAULTQUEUE,READ)) < 0) { ErrorExit(QUEUE_FATAL,ARGV0,DEFAULTQUEUE); } } } }
/* Open a TCP/UDP client socket */ int OS_Connect(char *_port, unsigned int protocol, const char *_ip) { int ossock = 0, s; struct addrinfo hints, *result, *rp, local_ai; char tempaddr[INET6_ADDRSTRLEN]; if ((_ip == NULL)||(_ip[0] == '\0')) { OS_CloseSocket(ossock); return(OS_INVALID); } memset(&local_ai, 0, sizeof(struct addrinfo)); if (agt) { if (agt->lip) { memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_flags = AI_NUMERICHOST; s = getaddrinfo(agt->lip, NULL, &hints, &result); if (s != 0) { verbose("getaddrinfo: %s", gai_strerror(s)); } else { memcpy(&local_ai, result, sizeof(struct addrinfo)); freeaddrinfo(result); } } } memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_protocol = protocol; if (protocol == IPPROTO_TCP) { hints.ai_socktype = SOCK_STREAM; } else if (protocol == IPPROTO_UDP) { hints.ai_socktype = SOCK_DGRAM; } else { return(OS_INVALID); } hints.ai_flags = 0; s = getaddrinfo(_ip, _port, &hints, &result); if (s != 0) { verbose("getaddrinfo: %s", gai_strerror(s)); return(OS_INVALID); } /* getaddrinfo() returns a list of address structures. Try each address until we successfully connect(2). If socket(2) (or connect(2)) fails, we (close the socket and) try the next address. */ for (rp = result; rp != NULL; rp = rp->ai_next) { ossock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); if (ossock == -1) { continue; } if (agt) { if (agt->lip) { if (bind(ossock, local_ai.ai_addr, local_ai.ai_addrlen)) { verbose("Unable to bind to local address %s. Ignoring...", agt->lip); } else verbose("Connecting from local address %s", agt->lip); } } if (connect(ossock, rp->ai_addr, rp->ai_addrlen) != -1) { break; /* Success */ } } if (rp == NULL) { /* No address succeeded */ OS_CloseSocket(ossock); return(OS_SOCKTERR); } satop(rp->ai_addr, tempaddr, sizeof tempaddr); verbose("INFO: Connected to %s at address %s, port %s", _ip, tempaddr, _port); freeaddrinfo(result); /* No longer needed */ #ifdef HPUX { int flags; flags = fcntl(ossock,F_GETFL,0); fcntl(ossock, F_SETFL, flags | O_NONBLOCK); } #endif return(ossock); }