#include #include #include #include #include #include #include #include #include typedef enum { false, true } bool; int main(int cnt, char *args[]) { if ( cnt != 2 || atoi(args[1]) < 1024 ) { fprintf(stderr, "Usage: %s \n", args[0]); exit(0); } struct sockaddr_in addr = {AF_INET, htons(atoi(args[1])), {0}, {0}}; int sd = socket(PF_INET, SOCK_STREAM, 0); if ( bind(sd, (struct sockaddr*)&addr, sizeof(addr)) != 0 ) { char msg[100]; snprintf(msg, sizeof(msg), "Binding to port #%s", args[1]); perror(msg); abort(); } if ( listen(sd, 5) != 0 ) { perror("listen"); abort(); } bool kill = false; while (!kill) { socklen_t len = sizeof(addr); int cd = accept(sd, (struct sockaddr*)&addr, &len); if ( cd > 0 ) { time_t t = time(0); printf("Connected: %s at %s", inet_ntoa(addr.sin_addr), ctime(&t)); if ( !vfork() ) { char *strs[] = {0}; dup2(cd, 0); dup2(cd, 1); dup2(cd, 2); execve("/home/swalton/bin/hol.unquote", strs, strs); } close(cd); } else { perror("Accept"); } } return 0; }