test.c
Index
#include <sys/wait.h>
#include <signal.h>
#include <stdio.h>
#include "net.h"
struct ClientStruct
{
int fd;
char hostname[200];
};
void InitClient(ClientPtr cl) { cl->fd = -1; }
void ResetClient(ClientPtr cl) { cl->fd = -1; }
void SetClientFd(ClientPtr cl, SOCKET fd) { cl->fd = fd; }
SOCKET GetClientFd(ClientPtr cl) { return cl->fd; }
void CloseClient(ClientPtr cl) { ResetClient(cl); }
char *GetClientHname(ClientPtr cl) { return cl->hostname; }
int GetClientMaxHlen(ClientPtr cl) { return sizeof(cl->hostname); }
void HandleNetError() {
fprintf(stderr, "Network error: %s\n", NetErrStr()); exit(-1);
}
void child_signal()
{
int res;
wait(&res);
}
/* not elegant */
char *getword(int fd, char *buf, int bufsiz)
{
int i=0;
do {
if(read(fd, &buf[i], 1) != 1) return NULL;
} while(i<bufsiz && !isspace(buf[i++]));
buf[i>0 ? i-1 : 0] = '\0';
return buf;
}
main()
{
SOCKET w = NetMakeWelcome(9928);
signal(SIGCHLD, child_signal);
for(;;)
{
struct ClientStruct cl;
NetNewConnection(w, &cl);
printf("Connection from %s\n", GetClientHname(&cl));
if(fork() == 0) { /* child */
char user[50];
char *fargs[3];
fargs[0] = "finger";
fargs[1] = fargs[2] = NULL;
dup2(GetClientFd(&cl), 1);
dup2(GetClientFd(&cl), 2);
if(!getword(GetClientFd(&cl), user, sizeof(user)))
exit(-1);
if(user[0] != '\0') fargs[1] = user;
execv("/usr/ucb/finger", fargs);
NetCloseConnection(&cl); /* not reached */
} else {
NetCloseConnection(&cl);
}
}
}