initial
This commit is contained in:
commit
fd792b6d64
5
Makefile
Normal file
5
Makefile
Normal 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
85
finger.c
Normal 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);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user