#include #include #include #include #include #include #define REVEAL (4523) #define Q1(x) (((x)>>24)&0xFF) #define Q2(x) (((x)>>16)&0xFF) #define Q3(x) (((x)>>8)&0xFF) #define Q4(x) (((x)>>0)&0xFF) int main (int argc, char **argv) { int s0, s1; /* sockets */ unsigned long h; int c, len; char s[32]; struct sockaddr_in name; if ((s0 = socket (PF_INET, SOCK_STREAM, 0)) < 0) { perror ("Socket create"); exit (1); } name.sin_family = AF_INET; name.sin_port = htons (REVEAL); name.sin_addr.s_addr = htonl (INADDR_ANY); if (bind (s0, (struct sockaddr *) &name, (int) (sizeof (name))) < 0) { perror ("socket bind"); exit (2); } if (listen (s0, 1) < 0) { perror ("socket listen"); exit (3); } switch (c = fork()) { case -1: perror ("fork"); exit (4); case 0: setpgid (0, 0); while (1) { len = (int) sizeof (name); if ((s1 = accept (s0, (struct sockaddr *) &name, (socklen_t *) &len)) < 0) { fprintf (stderr, "ERRNO: %d\n", errno); perror ("socket accept"); break; } h = ntohl (name.sin_addr.s_addr); len = sprintf (s, "%d.%d.%d.%d:%u\n", Q1(h), Q2(h), Q3(h), Q4(h), ntohs (name.sin_port)); write (s1, s, len); close (s1); } default: exit (0); } }