/* Author: Kees Cook * Copyright 2011 Canonical, Ltd * License: GPLv2 */ #define _GNU_SOURCE #include #include #include #include #include #include #include #include #include #include #include #include #include #define PORT 12345 int main(int argc, char * argv[]) { struct sigaction reaper; struct protoent *proto; struct sockaddr_in saddr; int server, on=1; char cmd[80]; if (!(proto=getprotobyname("tcp"))) { perror("getprotobyname"); return 1; } if ((server = socket(PF_INET, SOCK_STREAM, proto->p_proto))<0) { perror("socket"); return 1; } if (setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0) { perror("setsockopt"); return 1; } memset(&saddr, 0, sizeof(saddr)); saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = htonl(INADDR_ANY); saddr.sin_port = htons(PORT); if (bind(server, (struct sockaddr *) &saddr, sizeof(saddr)) < 0) { perror("bind"); return 1; } if (listen(server,5)<0) { perror("listen"); return 1; } printf("parent: %d\n", getpid()); printf("before:\n"); sprintf(cmd, "netstat -an | grep :%d", PORT); system(cmd); int pid = fork(); if (pid == 0) { printf("child: %d\n", getpid()); sleep(100); exit(0); } shutdown(server, SHUT_RDWR); printf("after:\n"); system(cmd); return 0; }