static int ServiceMain(int argc, char **argv) { SOCKET s; int status; static struct sockaddr_in sin; int tablesize = FD_SETSIZE; extern fd_set FdActive(); struct timeval timeout = {1,0}; int error_count=0; fd_set readfds; fd_set fdactive; RedirectOutput(); InitializeService(); SetThisServiceStatus(SERVICE_RUNNING,0); if (GetMulti()) { IoRoutines *io; io=LoadIo(GetProtocol()); if (io && io->listen) io->listen(argc,argv); else { fprintf(stderr,"Protocol %s does not support servers\n",GetProtocol()); return 1; } return 0; } else { s = socket(AF_INET, SOCK_STREAM, 0); if (s == -1) { printf("Error getting Connection Socket\n"); exit(1); } memset(&sin,0,sizeof(sin)); sin.sin_port = GetPort(); sin.sin_family = AF_INET; sin.sin_addr.s_addr = INADDR_ANY; status = bind(s, (struct sockaddr *)&sin, sizeof(struct sockaddr_in)); if (status < 0) { perror("Error binding to service\n"); exit(1); } status = listen(s,128); if (status < 0) { perror("Error listen on port\n"); exit(1); } FD_ZERO(&fdactive); FD_SET(s,&fdactive); for (readfds=fdactive;!shut;readfds=fdactive) { int sstatus; if ((sstatus = select(tablesize, &readfds, 0, 0, &timeout)) != SOCKET_ERROR) { error_count=0; if (FD_ISSET(s, &readfds)){ int len = sizeof(struct sockaddr_in); SOCKET sock = accept(s, (struct sockaddr *)&sin, &len); SpawnWorker(sock); } } else { error_count++; perror("error in main select"); fprintf(stderr,"Error count=%d\n",error_count); fflush(stderr); if (error_count > 100) { fprintf(stderr,"Error count exceeded, shutting down\n"); shut=1; } } } shutdown(s,2); return 1; } }
static void exitHandler(void) {} #else static void exitHandler(void) { int id; void *ctx=0; while((id=NextConnection(&ctx,0,0,0)) != -1) { DisconnectConnection(id); ctx=0; } } #endif int NewConnection(char *protocol) { Connection *oldhead,*new; IoRoutines *io=LoadIo(protocol); static int id=1; static int registerExitHandler=1; if (io) { registerExitHandler=registerExitHandler ? atexit(exitHandler) : 0; new=memset(malloc(sizeof(Connection)),0,sizeof(Connection)); new->io=io; new->readfd=-1; lock_connection_list(); oldhead = ConnectionList; ConnectionList=new; new->id=id++; new->message_id=-1; new->next=oldhead; new->protocol=strcpy(malloc(strlen(protocol)+1),protocol); unlock_connection_list();