/* Ew-too moved message server */ #include <errno.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <unistd.h> #include <time.h> #include <signal.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include "config.h" #include "player.h" char *stack, *stack_start; file message; int main_descriptor; /* return a string of the system time */ char *sys_time() { time_t t; static char time_string[25]; t = time(0); strftime(time_string, 25, "%H:%M:%S - %d/%m/%y", localtime(&t)); return time_string; } char *end_string(char *str) { while (*str) str++; str++; return str; } /* log errors and things to file */ void log(char *file, char *string) { int fd, length; sprintf(stack, "logs/%s.log", file); fd = open(stack, O_CREAT | O_WRONLY | O_SYNC, S_IRUSR | S_IWUSR); length = lseek(fd, 0, SEEK_END); if (length > MAX_LOG_SIZE) { close(fd); fd = open(stack, O_CREAT | O_WRONLY | O_SYNC | O_TRUNC, S_IRUSR | S_IWUSR); } sprintf(stack, "%s - %s\n", sys_time(), string); printf(stack); write(fd, stack, strlen(stack)); close(fd); } void error(char *str) { log("mms", str); exit(-1); } /* load a file into memory */ file load_file(char *filename) { file f; int d, e; char *oldstack; oldstack = stack; d = open(filename, O_RDONLY); if (d < 0) { sprintf(oldstack, "Can't find file:%s", filename); stack = end_string(oldstack); log("mms", oldstack); f.where = (char *) MALLOC(1); *(char *) f.where = 0; f.length = 0; stack = oldstack; return f; } f.length = lseek(d, 0, SEEK_END); lseek(d, 0, SEEK_SET); f.where = (char *) MALLOC(f.length + 1); memset(f.where, 0, f.length + 1); if (read(d, f.where, f.length) < 0) { sprintf(oldstack, "Error reading file:%s", filename); stack = end_string(oldstack); log("mms", oldstack); f.where = (char *) MALLOC(1); *(char *) f.where = 0; f.length = 0; stack = oldstack; return f; } close(d); stack = oldstack; *(f.where + f.length) = 0; return f; } void sigpipe() { error("Sigpipe received."); } void sighup() { error("Hangup received."); } void sigquit() { error("Quit signal received."); } void sigill() { error("Illegal instruction."); } void sigfpe() { error("Floating Point Error."); } void sigbus() { error("Bus Error."); } void sigsegv() { error("Segmentation Violation."); } void sigsys() { error("Bad system call."); } void sigterm() { error("Terminate signal received."); } void sigxfsz() { error("File descriptor limit exceeded."); } void init_socket(int port) { struct sockaddr_in main_socket; int dummy = 1; char *oldstack; oldstack = stack; /* grab the main socket */ main_descriptor = socket(PF_INET, SOCK_STREAM, 0); if (main_descriptor < 0) error("Can't grab a socket."); if (setsockopt(main_descriptor, SOL_SOCKET, SO_REUSEADDR, &dummy, sizeof(dummy)) < 0) error("Bad socket operation."); main_socket.sin_family = AF_INET; main_socket.sin_port = htons(port); main_socket.sin_addr.s_addr = INADDR_ANY; if (bind(main_descriptor, &main_socket, sizeof(main_socket)) < 0) error("Can't bind socket."); if (listen(main_descriptor, 5) < 0) error("Listen refused"); sprintf(oldstack, "Socket bound and listening on port %d", port); stack = end_string(oldstack); log("mms", oldstack); stack = oldstack; } main(int argc, char *argv[]) { int status, new_socket, count = 0, length, port; struct sockaddr_in incoming; stack_start = (char *) malloc(1000); stack = stack_start; #if defined(hpux) | defined(linux) struct sigaction sa; #endif /* hpux | linux */ if (chdir(ROOT) < 0) error("Can't change to root directory.\n"); if (*(argv[0]) != '-') { if (!argv[1]) { sprintf(stack, "-x"); execlp("bin/mms", "mms"); } else { argv[0] = "mms"; execvp("bin/mms", argv); } error("exec failed"); } if (nice(5) < 0) error("Failed to renice"); #if defined(hpux) | defined(linux) sa.handler = sigpipe; sa.mask = 0; sa.flags = 0; sigaction(SIGPIPE, &sa, 0); sa.handler = sighup; sigaction(SIGHUP, &sa, 0); sa.handler = sigquit; sigaction(SIGQUIT, &sa, 0); sa.handler = sigill; sigaction(SIGILL, &sa, 0); sa.handler = sigfpe; sigaction(SIGFPE, &sa, 0); sa.handler = sigbus; sigaction(SIGBUS, &sa, 0); sa.handler = sigsegv; sigaction(SIGSEGV, &sa, 0); sa.handler = sigsys; sigaction(SIGSYS, &sa, 0); sa.handler = sigterm; sigaction(SIGTERM, &sa, 0); sa.handler = sigxfsz; sigaction(SIGXFSZ, &sa, 0); #else /* hpux | linux */ signal(SIGPIPE, sigpipe); signal(SIGHUP, sighup); signal(SIGQUIT, sigquit); signal(SIGILL, sigill); signal(SIGFPE, sigfpe); signal(SIGBUS, sigbus); signal(SIGSEGV, sigsegv); signal(SIGSYS, sigsys); signal(SIGTERM, sigterm); signal(SIGXFSZ, sigxfsz); #endif /* hpux | linux */ if (argc == 2) port = atoi(argv[1]); else port = DEFAULT_PORT; message = load_file("files/moved.msg"); init_socket(port); length = sizeof(incoming); while (1) { new_socket = accept(main_descriptor, &incoming, &length); write(new_socket, message.where, message.length); sleep(3000); close(new_socket); count++; sprintf(argv[0], "mms (%5d)", count); } }