finger/finger.c

87 lines
1.6 KiB
C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.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)) {
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);
}