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