#include #include #include #include #define PROBE_ID (unsigned long)0x2A000001 // first prognum for free use void probe_quit ( ) { fprintf ( stdout, "quitting...\n" ); svc_unregister ( PROBE_ID, 1 ); exit ( 0 ); }; void probe ( rqstp, transp ) struct svc_req *rqstp; SVCXPRT *transp; { switch ( rqstp->rq_proc ) { case NULLPROC: svc_sendreply ( transp, xdr_void, (void *)NULL ); return; default: svcerr_noproc ( transp ); return; }; }; int main ( argc, argv ) int argc; char *argv[]; { SVCXPRT *transp = NULL; fd_set readfds; int size = getdtablesize ( ); signal ( SIGINT, probe_quit ); if ( ( transp = svctcp_create ( RPC_ANYSOCK, 0, 0 ) ) == NULL ) { perror ( "1" ); exit ( 1 ); }; if ( !svc_register ( transp, PROBE_ID, 1, probe, IPPROTO_TCP ) ) { perror ( "2" ); exit ( 1 ); }; if ( argc > 1 ) while ( 1 ) { readfds = svc_fdset; switch ( select ( size, &readfds, NULL, NULL, NULL ) ) { case -1: if ( errno == EINTR ) continue; else { perror ( "3" ); exit ( 1 ); }; break; case 0: continue; break; default: if ( !bcmp ( &readfds, &svc_fdset, sizeof ( fd_set ) ) ) continue; svc_getreqset ( transp ); break; }; } else svc_run ( ); probe_quit ( ); };