void rselect(int* a,int len,int k) { int i,st,temp; for(st=i=0;i<len-1;i++) { if(a[i]>a[len-1]) continue; temp=a[i]; a[i]=a[st]; a[st]=temp; st++; } temp=a[len-1]; a[len-1]=a[st]; a[st]=temp; if(k==st) return; if(st>k) rselect(a,st,k); else rselect(a+st,len-st,k-st); }
int med_med(int* a,int n) { if(n<5) return 0; int i; for(i=0;5*i<(n-4);i++) { int m=median_of_5(a+5*i); int temp=a[i]; a[i]=a[5*i+m]; a[5*i+m]=temp; } rselect(a,i,i/2); return i/2; }
static int muse_connect( const char* host, int port ) { int rsrv = INVALID_SOCKET; struct sockaddr_in rsrvINETAddress; struct sockaddr *rsrvSockAddrPtr = NULL; int selret, conret; struct timeval tval = {5, 0}; fd_set rset, wset; rsrvSockAddrPtr = (struct sockaddr*)&rsrvINETAddress; memset( (char*)&rsrvINETAddress, 0, sizeof(rsrvINETAddress) ); rsrvINETAddress.sin_family = AF_INET; rsrvINETAddress.sin_addr.s_addr = host_to_ip( host ); rsrvINETAddress.sin_port = htons( port ); rsrv = socket( AF_INET, SOCK_STREAM, 0 ); if ( !socket_nonblock(rsrv) ) { close( rsrv ); return INVALID_SOCKET; } conret = rconnect( rsrv, (struct sockaddr*)rsrvSockAddrPtr, sizeof(rsrvINETAddress) ); if ( conret == 0 ) goto ok; if ( conret < 0 && errno != EINPROGRESS ) { close( rsrv ); return INVALID_SOCKET; } errno = 0; /* * Else wait for connection. Cannot use cfgst_microsleep */ FD_ZERO( &rset ); FD_SET( rsrv, &rset ); wset = rset; selret = rselect( rsrv+1, &rset, &wset, NULL, &tval ); if ( selret == 0 ) { close( rsrv ); /* timeout */ errno = ETIMEDOUT; return INVALID_SOCKET; } if ( FD_ISSET(rsrv, &rset) || FD_ISSET(rsrv, &wset) ) { int error=0, optret, len=sizeof(error); optret = getsockopt( rsrv, SOL_SOCKET, SO_ERROR, &error, (socklen_t*)&len ); if ( optret < 0 || error != 0 ) { /* Solaris pending error */ errno = error; warning(" SOL_SOCKET SO_ERROR=%d", error); /*perror( "cfgst_connect" );*/ close( rsrv ); return INVALID_SOCKET; } } else { warning(" select error: sockfd not set"); close( rsrv ); return INVALID_SOCKET; } if ( !socket_block(rsrv) ) { close( rsrv ); return INVALID_SOCKET; } ok: notice("Connected to %s:%d", host, port); return rsrv; }