Ejemplo n.º 1
0
static void 
checkFdBit(SocketDescriptorRef descriptor, void *context)
{
  if (FD_ISSET(descriptor->handle, (fd_set *) context)) {
    if (descriptor->handler(descriptor->handle, descriptor->context) <= 0) {
      removeDescriptor(descriptor, &descriptorList);
    }
  }
}
int sys_close(int num){
    
    int returnVal;
    returnVal = removeDescriptor(num, (struct fdManager *)curthread->t_fdManager);
    
    if(returnVal){
        return (-1)*(returnVal);
    }
    return 0;
}
void destroy(struct fdManager * manager){
	int i=0;
	int size = getSize(manager);
//	kprintf("\nsize: %d\n",size);
	while(i<size){
		removeDescriptor(i, manager);
		if(array_get(manager->fdm_descriptors,i)==NULL){
			//kprintf ("\nisNull: %d\n",i);
		}
		i++;
	}
//int x=array_num(manager->fdm_descriptors);
//kprintf("\nx: %d\n",x);

//	array_destroy(manager->fdm_descriptors);
kfree(manager->fdm_descriptors);
	kfree(manager);
}
Ejemplo n.º 4
0
int Incoming::closeAll(){
    // First things first, unbind the listen socket.
    close(listener);
    removeDescriptor(listener);
    listener = 0;

    if(fdz){
        for(int i = 0; i < fdcount; ++i){
            close(fdz[i].fd);
        }

        free(fdz);
        fdz = NULL;
        fdcount = 0;
    }

    bound = false;
    return 0;
}
Ejemplo n.º 5
0
int Incoming::poll(){
    // fds array
    // length of array
    // timespec *time
    // sigset_t *sigmask

    if(fdcount == 0) return 0;

    int timeout = 100;

    int val = ::poll(fdz, fdcount, timeout);
    if(!val);
    for(int i = 0; val > 0 && i < fdcount ; ++i){
        // POLLIN POLLOUT POLLERR POLLHUP
        if(fdz[i].revents & POLLHUP){
            int v = 0;
            v = cbs->preClose(fdz[i].fd);
            if(v < 0){
                printf("IGNORING SOCKET POLLHUP\n");
            } else {
                close(fdz[i].fd);
                removeDescriptor(fdz[i].fd);
                cbs->postClose(fdz[i].fd);
            }
        } else {
            if(fdz[i].revents & POLLIN){
                // either read if its a accepted socket, or accept if its the listening socket.
                if(fdz[i].fd == listener){
                    // Accept the socket
                    int v = 0;
                    v = cbs->preAccept(fdz[i].fd);
                    if(v < 0){ // dont accept
                        printf("IGNORING SOCKET ACCEPT REQUEST!\n");
                    } else {
                        struct sockaddr *s = (struct sockaddr *)malloc(sizeof(struct sockaddr));
                        socklen_t len = 0;
                        int fd = accept(fdz[0].fd, s, &len);
                        //debug(8, "NEW SOCKET ACCEPTED: fd is %d\n", fd);
                        addDescriptor(fd);
                        free(s);
                        cbs->postAccept(fd);
                    }
                } else {
                    int nread = 0;
                    nread = cbs->read(fdz[i].fd);
                    if(nread == 0){
                        int v = 0;
                        v = cbs->preClose(fdz[i].fd);
                        if(v < 0){
                            printf("IGNORING SOCKET EOS\n");
                        } else {
                            close(fdz[i].fd);
                            removeDescriptor(fdz[i].fd);
                            cbs->postClose(fdz[i].fd);
                        }
                    }
                }
            }
        }
    }
    return 0;
}