This commit is contained in:
opfez 2021-08-06 13:32:25 +02:00
commit fd792b6d64
2 changed files with 90 additions and 0 deletions

5
Makefile Normal file
View File

@ -0,0 +1,5 @@
CC = gcc
CFLAGS = -Wall -Wextra -std=c99 -pedantic -g
finger: finger.c
$(CC) $(CFLAGS) $< -o $@

85
finger.c Normal file
View File

@ -0,0 +1,85 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <netdb.h>
#include <sys/socket.h>
#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);
}