void HandleSIG() { merror(SIGNAL_RECV, pidfile); DeletePID(pidfile); exit(1); }
/* Handle each client */ static void HandleClient(int client_socket, char *srcip) { int sb_size = OS_MAXSTR; int r_sz = 0; char buffer[OS_MAXSTR + 2]; char storage_buffer[OS_MAXSTR + 2]; char tmp_buffer[OS_MAXSTR + 2]; char *buffer_pt = NULL; /* Create PID file */ if (CreatePID(ARGV0, getpid()) < 0) { ErrorExit(PID_ERROR, ARGV0); } /* Initialize some variables */ memset(buffer, '\0', OS_MAXSTR + 2); memset(storage_buffer, '\0', OS_MAXSTR + 2); memset(tmp_buffer, '\0', OS_MAXSTR + 2); while (1) { /* If we fail, we need to return and close the socket */ if ((r_sz = OS_RecvTCPBuffer(client_socket, buffer, OS_MAXSTR - 2)) < 0) { close(client_socket); DeletePID(ARGV0); return; } /* We must have a new line at the end */ buffer_pt = strchr(buffer, '\n'); if (!buffer_pt) { /* Buffer is full */ if ((sb_size - r_sz) <= 2) { merror("%s: Full buffer receiving from: '%s'", ARGV0, srcip); sb_size = OS_MAXSTR; storage_buffer[0] = '\0'; continue; } strncat(storage_buffer, buffer, sb_size); sb_size -= r_sz; continue; } /* See if we received more than just one message */ if (*(buffer_pt + 1) != '\0') { *buffer_pt = '\0'; buffer_pt++; strncpy(tmp_buffer, buffer_pt, OS_MAXSTR); } /* Store everything in the storage_buffer * Check if buffer will be full */ if ((sb_size - r_sz) <= 2) { merror("%s: Full buffer receiving from: '%s'.", ARGV0, srcip); sb_size = OS_MAXSTR; storage_buffer[0] = '\0'; tmp_buffer[0] = '\0'; continue; } strncat(storage_buffer, buffer, sb_size); /* Remove carriage returns too */ buffer_pt = strchr(storage_buffer, '\r'); if (buffer_pt) { *buffer_pt = '\0'; } /* Remove syslog header */ if (storage_buffer[0] == '<') { buffer_pt = strchr(storage_buffer + 1, '>'); if (buffer_pt) { buffer_pt++; } else { buffer_pt = storage_buffer; } } else { buffer_pt = storage_buffer; } /* Send to the queue */ if (SendMSG(logr.m_queue, buffer_pt, srcip, SYSLOG_MQ) < 0) { merror(QUEUE_ERROR, ARGV0, DEFAULTQUEUE, strerror(errno)); if ((logr.m_queue = StartMQ(DEFAULTQUEUE, WRITE)) < 0) { ErrorExit(QUEUE_FATAL, ARGV0, DEFAULTQUEUE); } } /* Clean up the buffers */ if (tmp_buffer[0] != '\0') { strncpy(storage_buffer, tmp_buffer, OS_MAXSTR); sb_size = OS_MAXSTR - (strlen(storage_buffer) + 1); tmp_buffer[0] = '\0'; } else { storage_buffer[0] = '\0'; sb_size = OS_MAXSTR; } } }