END_TEST START_TEST(test_udpv6) { int server_socket, client_socket; char buffer[BUFFERSIZE]; char *msg; ck_assert_int_ge((server_socket = OS_Bindportudp(PORT, IPV6, 1)), 0); ck_assert_int_ge((client_socket = OS_ConnectUDP(PORT, IPV6, 1, NULL)) , 0); //TODO: ck_assert_int_eq(OS_SendUDP(client_socket, SENDSTRING), 0); ck_assert_int_eq(OS_SendUDPbySize(client_socket, strlen(SENDSTRING), SENDSTRING), 0); //TODO: not null-terminated ck_assert_int_eq(OS_RecvConnUDP(server_socket, buffer, BUFFERSIZE), strlen(SENDSTRING)); ck_assert_str_eq(buffer, SENDSTRING); ck_assert_int_eq(OS_SendUDPbySize(client_socket, 5, SENDSTRING), 0); ck_assert_ptr_ne((msg = OS_RecvUDP(server_socket, BUFFERSIZE)), NULL); ck_assert_str_eq(msg, "Hello"); /* only 5 bytes send */ free(msg); OS_CloseSocket(client_socket); OS_CloseSocket(server_socket); }
/** void connect_server() * Attempts to connect to all configured servers. */ int connect_server(int initial_id) { int attempts = 2; int rc = initial_id; /* Checking if the initial is zero, meaning we have to rotate to the * beginning. */ if(agt->rip[initial_id] == NULL) { rc = 0; initial_id = 0; } /* Closing socket if available. */ if(agt->sock >= 0) { sleep(1); CloseSocket(agt->sock); agt->sock = -1; if(agt->rip[1]) { verbose("%s: INFO: Closing connection to server (%s:%d).", ARGV0, agt->rip[rc], agt->port); } } while(agt->rip[rc]) { char *tmp_str; /* Checking if we have a hostname. */ tmp_str = strchr(agt->rip[rc], '/'); if(tmp_str) { char *f_ip; *tmp_str = '\0'; f_ip = OS_GetHost(agt->rip[rc], 5); if(f_ip) { char ip_str[128]; ip_str[127] = '\0'; snprintf(ip_str, 127, "%s/%s", agt->rip[rc], f_ip); free(f_ip); free(agt->rip[rc]); os_strdup(ip_str, agt->rip[rc]); tmp_str = strchr(agt->rip[rc], '/'); tmp_str++; } else { merror("%s: WARN: Unable to get hostname for '%s'.", ARGV0, agt->rip[rc]); *tmp_str = '/'; tmp_str++; } } else { tmp_str = agt->rip[rc]; } verbose("%s: INFO: Trying to connect to server (%s:%d).", ARGV0, agt->rip[rc], agt->port); /* IPv6 address: */ if(strchr(tmp_str,':') != NULL) { verbose("%s: INFO: Using IPv6 for: %s .", ARGV0, tmp_str); agt->sock = OS_ConnectUDP(agt->port, tmp_str, 1); } else { verbose("%s: INFO: Using IPv4 for: %s .", ARGV0, tmp_str); agt->sock = OS_ConnectUDP(agt->port, tmp_str, 0); } if(agt->sock < 0) { agt->sock = -1; merror(CONNS_ERROR, ARGV0, tmp_str); rc++; if(agt->rip[rc] == NULL) { attempts += 10; /* Only log that if we have more than 1 server configured. */ if(agt->rip[1]) merror("%s: ERROR: Unable to connect to any server.",ARGV0); sleep(attempts); rc = 0; } } else { /* Setting socket non-blocking on HPUX */ #ifdef HPUX //fcntl(agt->sock, O_NONBLOCK); #endif #ifdef WIN32 int bmode = 1; /* Setting socket to non-blocking */ ioctlsocket(agt->sock, FIONBIO, (u_long FAR*) &bmode); #endif agt->rip_id = rc; return(1); } } return(0); }
/* OS_SyslogD: Monitor the alerts and sends them via syslog. * Only return in case of error. */ void OS_CSyslogD(SyslogConfig **syslog_config) { int s = 0; time_t tm; struct tm *p; int tries = 0; file_queue *fileq; alert_data *al_data; /* Getting currently time before starting */ tm = time(NULL); p = localtime(&tm); /* Initating file queue - to read the alerts */ os_calloc(1, sizeof(file_queue), fileq); while( (Init_FileQueue(fileq, p, 0) ) < 0 ) { tries++; if( tries > OS_CSYSLOGD_MAX_TRIES ) { merror("%s: ERROR: Could not open queue after %d tries, exiting!", ARGV0, tries ); exit(1); } sleep(1); } debug1("%s: INFO: File queue connected.", ARGV0 ); /* Connecting to syslog. */ s = 0; while(syslog_config[s]) { syslog_config[s]->socket = OS_ConnectUDP(syslog_config[s]->port, syslog_config[s]->server, 0); if(syslog_config[s]->socket < 0) { merror(CONNS_ERROR, ARGV0, syslog_config[s]->server); } else { merror("%s: INFO: Forwarding alerts via syslog to: '%s:%d'.", ARGV0, syslog_config[s]->server, syslog_config[s]->port); } s++; } /* Infinite loop reading the alerts and inserting them. */ while(1) { tm = time(NULL); p = localtime(&tm); /* Get message if available (timeout of 5 seconds) */ al_data = Read_FileMon(fileq, p, 5); if(!al_data) { continue; } /* Sending via syslog */ s = 0; while(syslog_config[s]) { OS_Alert_SendSyslog(al_data, syslog_config[s]); s++; } /* Clearing the memory */ FreeAlertData(al_data); } }