test.c


Index

  • InitClient (returns void )
  • ResetClient (returns void )
  • SetClientFd (returns void )
  • GetClientFd (returns SOCKET )
  • CloseClient (returns void )
  • GetClientHname (returns char *)
  • GetClientMaxHlen (returns int )
  • HandleNetError (returns void )
  • child_signal (returns void )
  • getword (returns char *)

  • #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);
                    }
            }
    }