#include #include #include #include #include #include #include #include #define PORT 79 void die(char *msg) { fprintf(stderr, "%s\n", msg); exit(1); } void read_server_response(int sockfd) { char c; while (read(sockfd, &c, 1)) { putchar(c); } } void finger_serverinfo(int sockfd) { write(sockfd, "\r\n", 2); read_server_response(sockfd); } void finger_user(int sockfd, char *username) { write(sockfd, username, strlen(username)); write(sockfd, "\r\n", 2); read_server_response(sockfd); } int main(int argc, char *argv[]) { /* argument handling */ if (argc < 2 || argc > 3) die("usage: finger [user] server"); char *servername, *user = NULL; if (argc == 2) { servername = argv[1]; } else { servername = argv[2]; user = argv[1]; } /* setting up sockets and stuff */ struct sockaddr_in servaddr; int sockfd = socket(AF_INET, SOCK_STREAM, 0); if (sockfd == -1) die("Couldn't create socket."); struct hostent *he = gethostbyname(servername); if (he == NULL) die("Couldn't get host."); bzero(&servaddr, sizeof(servaddr)); servaddr.sin_family = AF_INET; servaddr.sin_addr = *((struct in_addr *) he->h_addr_list[0]); servaddr.sin_port = htons(PORT); if (connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) != 0) die("Couldn't connect to server."); if (user) finger_user(sockfd, user); else finger_serverinfo(sockfd); close(sockfd); }