int main (int argc, char* argv[]) { /* Data reading initilization */ data_init(); spawn_socket(); return 0; }
int accept(int socket, struct sockaddr * addr, int * addr_len) { if(socket<1 || socket>SGIP_SOCKET_MAXSOCKETS || !addr || !addr_len) return SGIP_ERROR(EINVAL); SGIP_INTR_PROTECT(); sgIP_Record_TCP * ret; int retval,s; retval=SGIP_ERROR0(EINVAL); ret=0; socket--; if(!(socketlist[socket].flags&SGIP_SOCKET_FLAG_VALID)) { SGIP_INTR_UNPROTECT(); return SGIP_ERROR(EINVAL); } if((socketlist[socket].flags&SGIP_SOCKET_FLAG_TYPEMASK)==SGIP_SOCKET_FLAG_TYPE_TCP) { s=spawn_socket((socketlist[socket].flags&SGIP_SOCKET_FLAG_NONBLOCKING) | SGIP_SOCKET_FLAG_TYPE_TCP); if(s>0) { do { ret=sgIP_TCP_Accept((sgIP_Record_TCP *)socketlist[socket].conn_ptr); if(ret!=0) break; if(errno!=EWOULDBLOCK) break; if(socketlist[socket].flags&SGIP_SOCKET_FLAG_NONBLOCKING) break; SGIP_INTR_UNPROTECT(); // give interrupts a chance to occur. SGIP_WAITEVENT(); // don't just try again immediately SGIP_INTR_REPROTECT(); } while(1); } if(ret==0) { kill_socket(s); retval=-1; } else { *addr_len=sizeof(struct sockaddr_in); ((struct sockaddr_in *)addr)->sin_family=AF_INET; ((struct sockaddr_in *)addr)->sin_port=ret->destport; ((struct sockaddr_in *)addr)->sin_addr.s_addr=ret->destip; socketlist[s-1].conn_ptr=ret; retval=s; } } SGIP_INTR_UNPROTECT(); return retval; }