#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <poll.h>

int main() {
	char readchar;
	struct pollfd polls;
	int sock, rc;
	struct sockaddr_in server_addr;
        char *whoami = "initial process";

	sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
	if (sock < 0) {
                perror("cannot create socket");
		return 1;
	}

	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(6666);
	inet_aton("127.0.0.1", &server_addr.sin_addr);

	if (connect(sock, (struct sockaddr *) &server_addr, sizeof(server_addr))) {
		close(sock);
                perror("cannot connect");
		return 1;
	}

	while (1) {
		polls.fd = sock;
		polls.events = POLLIN;
		rc = poll(&polls, 1, 60*1000);

		if (rc == 0) {
			close(sock);
                        printf("timeout\n");
                        return 1;
		} else if (rc < 0) {
			close(sock);
                        perror("error polling");
                        return 1;
		}

		if (read(sock, &readchar, 1) != 1) {
			close(sock);
                        perror("error reading");
                        return 1;
		}

                printf("%s: received char: %c\n", whoami, readchar);

                if (readchar == 'f') {
                        int pid;
                        printf("%s: received char 'f', forking\n", whoami);
                        pid = fork();
                        if (pid < 0) {
                                perror("cannot fork");
                                return 1;
                        }
                        if (pid == 0) {
                                printf("child ok\n");
                                whoami = "child";
                        } else {
                                printf("parent ok\n");
                                whoami = "parent";
                        }
                }
	}

        return 0;
}

