#include #include #include #include #include #include #include char *progname; void usage(void) { fprintf(stderr, "Usage: %s USER@HOST [PORT]\n", progname); exit(1); } int main(int argc, char** argv) { char *cp, *host = "localhost", *user; short port = 79; progname = argv[0]; if (argc == 1 || argc > 3) { usage(); } if (argc >= 2) { user = argv[1]; if ((cp = strchr(user, '@'))) { *cp = '\0'; host = cp + 1; } } if (argc == 3) { port = atoi(argv[2]); if (port < 1) { fprintf(stderr, "port number must be positive"); exit(1); } } struct hostent* hp; if ((hp = gethostbyname(host)) == 0) { fprintf(stderr, "unknown host: %s\n", host); exit(1); } char* hostaddr = hp->h_addr_list[0]; struct sockaddr_in addr = {0}; addr.sin_family = AF_INET; memmove((void *)&addr.sin_addr, (void *)hostaddr, hp->h_length); addr.sin_port = htons(port); int fd; if ((fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(1); } if (connect(fd, (struct sockaddr *) &addr, sizeof addr) == -1) { perror("connect"); exit(1); } write(fd, user, strlen(user)); write(fd, "\r\n", 2); char buf[BUFSIZ]; ssize_t nbytes; while((nbytes = read(fd, buf, sizeof buf)) > 0 && write(1, buf, nbytes) == nbytes) { ; } }