/****************************************************************************** * Function: main * * Description: * Set up a PIT server and handle network requests. This server * handles both TCP and UDP requests. * * Parameters: * The usual argc and argv parameters to a main() function. * * Return Value: * This is a daemon program and never returns. However, in the degenerate * case where no sockets are created, the function returns zero. ******************************************************************************/ int main( int argc, char *argv[ ] ) { int opt; int tSckt[ MAXTCPSCKTS ]; /* Array of TCP socket descriptors. */ size_t tScktSize = MAXTCPSCKTS; /* Size of uSckt (# of elements). */ int uSckt[ MAXUDPSCKTS ]; /* Array of UDP socket descriptors. */ size_t uScktSize = MAXUDPSCKTS; /* Size of uSckt (# of elements). */ strcpy(service_name,DFLT_SERVICE); /* ** Set the program name (w/o directory prefix). */ pgmName = strrchr( argv[ 0 ], '/' ); pgmName = pgmName == NULL ? argv[ 0 ] : pgmName + 1; /* ** Process command options. */ opterr = 0; /* Turns off "invalid option" error messages. */ while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) >= 0 ) { switch ( opt ) { case 'v': /* Verbose mode. */ { verbose = true; break; } case 'p': /* Get the port number */ { strcpy(service_name,optarg); need++; break; } default: { USAGE; } } /* End SWITCH on command option. */ } /* End WHILE processing options. */ if(need < 1) { USAGE; exit; } /* ** Open both a TCP and UDP socket, for both IPv4 & IPv6, on which to receive ** service requests. */ if ( ( openSckt( service_name, "tcp", tSckt, &tScktSize ) < 0 ) || ( openSckt( service_name, "udp", uSckt, &uScktSize ) < 0 ) ) { exit( 1 ); } /* ** Run the Programmable Interdimensional Timer server. */ if ( ( tScktSize > 0 ) || ( uScktSize > 0 ) ) { pit( tSckt, /* pit() never returns. */ tScktSize, uSckt, uScktSize ); } /* ** Since pit() never returns, execution only gets here if no sockets were ** created. */ if ( verbose ) { fprintf( stderr, "%s: No sockets opened... terminating.\n", pgmName ); } return 0; } /* End main() */
/****************************************************************************** * Function: main * * Description: * Connect to a remote time-of-day service and write the remote host's TOD to * stdout. * * Parameters: * The usual argc & argv parameters to a main() program. * * Return Value: * This function always returns zero. ******************************************************************************/ int main( int argc, char *argv[ ] ) { const char *host = DFLT_HOST; int opt; int sckt; unsigned int scopeId = if_nametoindex( DFLT_SCOPE_ID ); const char *service = DFLT_SERVICE; init_performance(); /* ** Determine the program name (w/o directory prefix). */ pgmName = (const char*) strrchr( argv[ 0 ], '/' ); pgmName = pgmName == NULL ? argv[ 0 ] : pgmName+1; /* ** Process command line options. */ opterr = 0; /* Turns off "invalid option" error messages. */ while ( ( opt = getopt( argc, argv, VALIDOPTS ) ) != -1 ) { switch ( opt ) { case 's': /* Scope identifier (IPv6 kluge). */ { scopeId = if_nametoindex( optarg ); if ( scopeId == 0 ) { fprintf( stderr, "%s: Unknown network interface (%s).\n", pgmName, optarg ); USAGE; } break; } case 'v': /* Verbose mode. */ { verbose = true; break; } default: { USAGE; } } /* End SWITCH on command option. */ } /* End WHILE processing command options. */ /* ** Process command arguments. At the end of the above loop, optind is the ** index of the first NON-option argv element. */ switch ( argc - optind ) { case 2: /* Both host & service are specified on the command line. */ { service = argv[ optind + 1 ]; /***** Fall through *****/ } case 1: /* Host is specified on the command line. */ { host = argv[ optind ]; /***** Fall through *****/ } case 0: /* Use default host & service. */ { break; } default: { USAGE; } } /* End SWITCH on number of command arguments. */ /* ** Open a connection to the indicated host/service. ** ** Note that if all three of the following conditions are met, then the ** scope identifier remains unresolved at this point. ** 1) The default network interface is unknown for some reason. ** 2) The -s option was not used on the command line. ** 3) An IPv6 "scoped address" was not specified for the hostname on the ** command line. ** If the above three conditions are met, then only an IPv4 socket can be ** opened (connect(2) fails without the scope ID properly set for IPv6 ** sockets). */ if ( ( sckt = openSckt( host, service, scopeId ) ) == INVALID_DESC ) { fprintf( stderr, "%s: Sorry... a connection could not be established.\n", pgmName ); exit( 1 ); } /* ** Get the remote time-of-day. */ tod( sckt ); /* ** Close the connection and terminate. */ (void) SYSCALL( "close", __LINE__, close( sckt ) ); return 0; } /* End main() */