initial
This commit is contained in:
commit
fd792b6d64
|
@ -0,0 +1,5 @@
|
|||
CC = gcc
|
||||
CFLAGS = -Wall -Wextra -std=c99 -pedantic -g
|
||||
|
||||
finger: finger.c
|
||||
$(CC) $(CFLAGS) $< -o $@
|
|
@ -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);
|
||||
}
|
Loading…
Reference in New Issue