commit fd792b6d646f71e8f6b6960477a45164f1177092 Author: opfez Date: Fri Aug 6 13:32:25 2021 +0200 initial diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..d0c4fc1 --- /dev/null +++ b/Makefile @@ -0,0 +1,5 @@ +CC = gcc +CFLAGS = -Wall -Wextra -std=c99 -pedantic -g + +finger: finger.c + $(CC) $(CFLAGS) $< -o $@ diff --git a/finger.c b/finger.c new file mode 100644 index 0000000..460298c --- /dev/null +++ b/finger.c @@ -0,0 +1,85 @@ +#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) != 0) { + if (c != '\r') + 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]; + } + + 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); +}