root/src/tests/system/network/select_test2.c
#include <stdio.h>
#include <kernel/OS.h>
#include <string.h>
#include <sys/time.h>
#include <errno.h>

#include "sys/socket.h"
#include "netinet/in.h"
#include "arpa/inet.h"
#include "sys/select.h"

#include "ufunc.h"

int main(int argc, char **argv)
{
        int s, f;
        int rv;
        struct fd_set fdr, fdw, fde;
        struct timeval tv;
        int32 rtc;
        char path[PATH_MAX];
                
        test_banner("Select Test #2");
                        
        s = socket(AF_INET, SOCK_DGRAM, 0);
        if (s < 0)
                err(s, "Socket creation failed");

        getcwd(path, PATH_MAX);
        sprintf(path, "%s/select_test2.c", path);
        f = open(path, O_RDWR);

        if (f > 0 && s > 0)     {
                printf("\nsocket and fd created.\n");
        } else {
                err(-1, "Failed to create socket or fd\n");
        }
        
        FD_ZERO(&fdr);
        FD_SET(s, &fdr);
        FD_ZERO(&fdw);
        FD_SET(s, &fdw);
        FD_ZERO(&fde);
        FD_SET(s, &fde);
        
        tv.tv_sec = 5;
        tv.tv_usec = 0;
        printf("\nTest1\n=====\n\n");   
        printf("Trying with timeval (5 secs)...\n");
        rtc = real_time_clock();
        rv = select(s + 1, &fdr, NULL, &fde, &tv);
        rtc = real_time_clock() - rtc;
        printf("select gave %d (expecting 0) in %ld seconds\n", rv, rtc);

        FD_ZERO(&fdr);
        FD_SET(s, &fdr);
        FD_SET(f, &fdr);
        FD_ZERO(&fdw);
        FD_SET(s, &fdw);
        FD_ZERO(&fde);
        FD_SET(s, &fde);
        
        printf("\nTest2\n=====\n\n");
        printf("Trying without timeval and both sockets and files...\n");
        rv = select(f +1, &fdr, NULL, NULL, NULL);
        printf("select gave %d (expecting 2)\n", rv);
        
        if (rv > 0) {
                if (FD_ISSET(s, &fdr))
                        printf("Data to read\n");
                if (FD_ISSET(s, &fdw))
                        printf("OK to write\n");
                if (FD_ISSET(s, &fde))
                        printf("Exception!\n");
                if (FD_ISSET(f, &fdr))
                        printf("File is readable!\n");
        } else if (rv == 0) {
                printf("Timed out??? huh?!\n");
        } else {
                printf("errno = %d [%s]\n", errno, strerror(errno));
        }
        
        closesocket(s);
        close(f);
        
        printf("Test complete.\n");

        return (0);
}