static void nw_serviceMain( const char *serviceName, const char *URI) { u_serviceManager serviceManager; os_time sleepTime; os_result waitResult; nw_termination terminate; os_mutexAttr termMtxAttr; os_condAttr termCvAttr; c_bool fatal = FALSE; v_duration leasePeriod; terminate.terminate = FALSE; os_mutexAttrInit( & termMtxAttr ); os_condAttrInit( & termCvAttr ); termMtxAttr.scopeAttr = OS_SCOPE_PRIVATE; termCvAttr.scopeAttr = OS_SCOPE_PRIVATE; os_mutexInit( &terminate.mtx, &termMtxAttr ); os_condInit( &terminate.cv, &terminate.mtx, &termCvAttr ); /* Create networking service with kernel */ service = u_serviceNew(URI, NW_ATTACH_TIMEOUT, serviceName, NULL, U_SERVICE_NETWORKING, NULL); /* Initialize configuration */ nw_configurationInitialize(service, serviceName, URI); /* Ask service manager for splicedaemon state */ serviceManager = u_serviceManagerNew(u_participant(service)); /* Create the controller which starts the updating */ /* and calls the listener on a fatal error */ controller = nw_controllerNew(service,controller_onfatal,&fatal); if (controller) { os_procAtExit(on_exit_handler); /* Start the actual engine */ NW_REPORT_INFO(1, "Networking started"); NW_TRACE(Mainloop, 1, "Networking started"); nw_controllerStart(controller); /* Change state for spliced */ u_serviceChangeState(service, STATE_INITIALISING); u_serviceChangeState(service, STATE_OPERATIONAL); /* Get sleeptime from configuration */ nw_retrieveLeaseSettings(&leasePeriod, &sleepTime); /*sleepTime.tv_sec = 1; */ /* Loop until termination is requested */ u_serviceWatchSpliceDaemon(service, nw_splicedaemonListener, &terminate); os_mutexLock( &terminate.mtx ); while ((!(int)terminate.terminate) && (!(int)fatal) && (!(int)f_exit)) { /* Assert my liveliness and the Splicedaemon's liveliness*/ u_serviceRenewLease(service, leasePeriod); /* Check if anybody is still remotely interested */ nw_controllerUpdateHeartbeats(controller); /* Wait before renewing again */ waitResult = os_condTimedWait( &terminate.cv, &terminate.mtx, &sleepTime ); if (waitResult == os_resultFail) { OS_REPORT(OS_CRITICAL, "nw_serviceMain", 0, "os_condTimedWait failed - thread will terminate"); fatal = TRUE; } /* QAC EXPECT 2467; Control variable, terminate, not modified inside loop. That is correct, it is modified by another thread */ } os_mutexUnlock( &terminate.mtx ); /* keep process here waiting for the exit processing */ while ((int)f_exit){os_nanoSleep(sleepTime);} if (!(int)fatal ) { leasePeriod.seconds = 20; leasePeriod.nanoseconds = 0; u_serviceRenewLease(service, leasePeriod); u_serviceChangeState(service, STATE_TERMINATING); nw_controllerStop(controller); nw_controllerFree(controller); controller = NULL; NW_REPORT_INFO(1, "Networking stopped"); NW_TRACE(Mainloop, 1, "Networking stopped"); } } if (!(int)fatal ) { nw_configurationFinalize(); /* Clean up */ u_serviceChangeState(service, STATE_TERMINATED); u_serviceManagerFree(serviceManager); u_serviceFree(service); } }
int main( int argc, char *argv[]) { int opt; int retCode = OSPL_EXIT_CODE_OK; char *uri = NULL; char *command = NULL; char start_command[2048]; cf_element domain = NULL; cfgprs_status r; os_boolean blocking = OS_FALSE; os_boolean blockingDefined = OS_FALSE; os_time serviceTerminatePeriod; char *vg_cmd = NULL; ospl_setsignals(); os_osInit(); os_procAtExit(os_osExit); uri = os_getenv ("OSPL_URI"); vg_cmd = os_getenv("VG_SPLICED"); if (!vg_cmd) { vg_cmd = ""; } while ((opt = getopt (argc, argv, "hvafd:")) != -1) { switch (opt) { case 'h': print_usage (argv[0]); exit (OSPL_EXIT_CODE_OK); break; case 'v': printf ("OpenSplice version : %s\n", VERSION); exit (OSPL_EXIT_CODE_OK); break; case 'd': if (domain_name) { print_usage (argv[0]); exit (OSPL_EXIT_CODE_UNRECOVERABLE_ERROR); } domain_name = optarg; break; case 'a': if (domain_name) { print_usage (argv[0]); exit (OSPL_EXIT_CODE_UNRECOVERABLE_ERROR); } uri = NULL; domain_name = "*"; break; case 'f': if(blockingDefined) { print_usage (argv[0]); exit (OSPL_EXIT_CODE_UNRECOVERABLE_ERROR); } blocking = OS_TRUE; blockingDefined = OS_TRUE; break; case '?': print_usage (argv[0]); exit (OSPL_EXIT_CODE_UNRECOVERABLE_ERROR); break; default: break; } } if ((argc-optind) > 3) { print_usage (argv[0]); exit(OSPL_EXIT_CODE_UNRECOVERABLE_ERROR); } command = argv[optind]; if (command && argv[optind+1]) { uri = argv[optind+1]; } if (uri && (strlen(uri) > 0)) { r = cfg_parse_ospl (uri, &platformConfig); if (r == CFGPRS_OK) { domain_name = findDomain (platformConfig, &domain); if (domain_name == NULL) { printf ("The domain name could not be determined from the configuration\n"); exit (OSPL_EXIT_CODE_UNRECOVERABLE_ERROR); } } else { if (r == CFGPRS_NO_INPUT) { printf ("Error: Cannot open URI \"%s\". Exiting now...\n", uri); } else { printf ("Errors are detected in the configuration. Exiting now...\n"); } exit (OSPL_EXIT_CODE_UNRECOVERABLE_ERROR); } } if ((command == NULL) || (strcmp (command, "stop") == 0)) { if (domain_name == NULL) { domain_name = "The default Domain"; } findServiceTerminatePeriod(domain, &serviceTerminatePeriod); retCode = findSpliceSystemAndRemove (domain_name, serviceTerminatePeriod); } else if (strcmp (command, "start") == 0) { #ifdef OS_LINUX_DEFS_H check_for_LD_ASSUME_KERNEL (); #endif if (domain_name == NULL) { domain_name = "The default Domain"; } if (!spliceSystemRunning (domain_name)) { if(!blocking) { printf ("\nStarting up domain \"%s\" .", domain_name); } else { printf ("\nStarting up domain \"%s\" and blocking.", domain_name); } if (uri) { if(!blocking) { snprintf (start_command, sizeof(start_command), "%s spliced \"%s\" &", vg_cmd, uri); } else { snprintf (start_command, sizeof(start_command), "%s spliced \"%s\"", vg_cmd, uri); } } else { if(!blocking) { snprintf (start_command, sizeof(start_command), "%s spliced &", vg_cmd); } else { snprintf (start_command, sizeof(start_command), "%s spliced", vg_cmd); } } printf (" Ready\n"); /* Display locations of info and error files */ os_reportDisplayLogLocations(); retCode = WEXITSTATUS(system (start_command)); if(!blocking) { sleep (2); /* take time to first show the license message from spliced */ } } else { printf ("Splice System with domain name \"%s\" is found running, ignoring command\n", domain_name); } } else if (strcmp (command, "list") == 0) { retCode = findSpliceSystemAndShow (domain_name); } else { print_usage (argv[0]); exit (OSPL_EXIT_CODE_UNRECOVERABLE_ERROR); } return retCode; }