void CServerApp::resetServer(const CEvent&, void*) { LOG((CLOG_DEBUG1 "resetting server")); stopServer(); cleanupServer(); startServer(); }
int CServerApp::mainLoop() { // create socket multiplexer. this must happen after daemonization // on unix because threads evaporate across a fork(). CSocketMultiplexer multiplexer; setSocketMultiplexer(&multiplexer); // if configuration has no screens then add this system // as the default if (args().m_config->begin() == args().m_config->end()) { args().m_config->addScreen(args().m_name); } // set the contact address, if provided, in the config. // otherwise, if the config doesn't have an address, use // the default. if (m_synergyAddress->isValid()) { args().m_config->setSynergyAddress(*m_synergyAddress); } else if (!args().m_config->getSynergyAddress().isValid()) { args().m_config->setSynergyAddress(CNetworkAddress(kDefaultPort)); } // canonicalize the primary screen name CString primaryName = args().m_config->getCanonicalName(args().m_name); if (primaryName.empty()) { LOG((CLOG_CRIT "unknown screen name `%s'", args().m_name.c_str())); return kExitFailed; } // start server, etc appUtil().startNode(); // init ipc client after node start, since create a new screen wipes out // the event queue (the screen ctors call adoptBuffer). if (argsBase().m_enableIpc) { initIpcClient(); } // load all available plugins. ARCH->plugin().init(m_serverScreen->getEventTarget(), m_events); // handle hangup signal by reloading the server's configuration ARCH->setSignalHandler(CArch::kHANGUP, &reloadSignalHandler, NULL); m_events->adoptHandler(m_events->forCServerApp().reloadConfig(), m_events->getSystemTarget(), new TMethodEventJob<CServerApp>(this, &CServerApp::reloadConfig)); // handle force reconnect event by disconnecting clients. they'll // reconnect automatically. m_events->adoptHandler(m_events->forCServerApp().forceReconnect(), m_events->getSystemTarget(), new TMethodEventJob<CServerApp>(this, &CServerApp::forceReconnect)); // to work around the sticky meta keys problem, we'll give users // the option to reset the state of synergys m_events->adoptHandler(m_events->forCServerApp().resetServer(), m_events->getSystemTarget(), new TMethodEventJob<CServerApp>(this, &CServerApp::resetServer)); // run event loop. if startServer() failed we're supposed to retry // later. the timer installed by startServer() will take care of // that. DAEMON_RUNNING(true); #if defined(MAC_OS_X_VERSION_10_7) CThread thread( new TMethodJob<CServerApp>( this, &CServerApp::runEventsLoop, NULL)); // wait until carbon loop is ready COSXScreen* screen = dynamic_cast<COSXScreen*>( m_serverScreen->getPlatformScreen()); screen->waitForCarbonLoop(); runCocoaApp(); #else m_events->loop(); #endif DAEMON_RUNNING(false); // close down LOG((CLOG_DEBUG1 "stopping server")); m_events->removeHandler(m_events->forCServerApp().forceReconnect(), m_events->getSystemTarget()); m_events->removeHandler(m_events->forCServerApp().reloadConfig(), m_events->getSystemTarget()); cleanupServer(); updateStatus(); LOG((CLOG_NOTE "stopped server")); if (argsBase().m_enableIpc) { cleanupIpcClient(); } return kExitSuccess; }
int CServerApp::mainLoop() { // create socket multiplexer. this must happen after daemonization // on unix because threads evaporate across a fork(). CSocketMultiplexer multiplexer; // create the event queue CEventQueue eventQueue; // if configuration has no screens then add this system // as the default if (args().m_config->begin() == args().m_config->end()) { args().m_config->addScreen(args().m_name); } // set the contact address, if provided, in the config. // otherwise, if the config doesn't have an address, use // the default. if (args().m_synergyAddress->isValid()) { args().m_config->setSynergyAddress(*args().m_synergyAddress); } else if (!args().m_config->getSynergyAddress().isValid()) { args().m_config->setSynergyAddress(CNetworkAddress(kDefaultPort)); } // canonicalize the primary screen name CString primaryName = args().m_config->getCanonicalName(args().m_name); if (primaryName.empty()) { LOG((CLOG_CRIT "unknown screen name `%s'", args().m_name.c_str())); return kExitFailed; } // start server, etc ARCH->util().startNode(); // handle hangup signal by reloading the server's configuration ARCH->setSignalHandler(CArch::kHANGUP, &reloadSignalHandler, NULL); EVENTQUEUE->adoptHandler(getReloadConfigEvent(), IEventQueue::getSystemTarget(), new TMethodEventJob<CServerApp>(this, &CServerApp::reloadConfig)); // handle force reconnect event by disconnecting clients. they'll // reconnect automatically. EVENTQUEUE->adoptHandler(getForceReconnectEvent(), IEventQueue::getSystemTarget(), new TMethodEventJob<CServerApp>(this, &CServerApp::forceReconnect)); // to work around the sticky meta keys problem, we'll give users // the option to reset the state of synergys EVENTQUEUE->adoptHandler(getResetServerEvent(), IEventQueue::getSystemTarget(), new TMethodEventJob<CServerApp>(this, &CServerApp::resetServer)); // run event loop. if startServer() failed we're supposed to retry // later. the timer installed by startServer() will take care of // that. CEvent event; DAEMON_RUNNING(true); EVENTQUEUE->getEvent(event); while (event.getType() != CEvent::kQuit) { EVENTQUEUE->dispatchEvent(event); CEvent::deleteData(event); EVENTQUEUE->getEvent(event); } DAEMON_RUNNING(false); // close down LOG((CLOG_DEBUG1 "stopping server")); EVENTQUEUE->removeHandler(getForceReconnectEvent(), IEventQueue::getSystemTarget()); EVENTQUEUE->removeHandler(getReloadConfigEvent(), IEventQueue::getSystemTarget()); cleanupServer(); updateStatus(); LOG((CLOG_NOTE "stopped server")); return kExitSuccess; }
int serverRun(struct netTest *test){ fd_set readSet, writeSet; struct timeval *timeout; struct timeval now; int result; /* Termination signals. */ catchSigend(sigend_handler); if (setjmp(sigend_jmp_buf)) getSigend(test); if ((test->listener = netAnnounce(test)) < 0) { debug("Can't get socket\n"); return -1; } FD_ZERO(&test->readSet); FD_ZERO(&test->writeSet); FD_SET(test->listener, &test->readSet); if(test->listener > test->maxFd) test->maxFd = test->listener; test->status = NET_PREPARE; while (test->status != NET_END){ memcpy(&readSet, &test->readSet, sizeof(fd_set)); memcpy(&writeSet, &test->writeSet, sizeof(fd_set)); (void) gettimeofday(&now, NULL); timeout = tmr_timeout(&now); result = select(test->maxFd + 1, &readSet, &writeSet, NULL, timeout); if(result == 0){ debug("select timeout\n"); continue; }else if(result <0){ debug("select error\n"); cleanupServer(test); return -1; } if(FD_ISSET(test->listener, &readSet)){ if(netAccept(test) <0){ cleanupServer(test); return -1; } FD_CLR(test->listener, &readSet); } if(FD_ISSET(test->ctrlSocket, &readSet)){ int res = read(test->ctrlSocket, (char*) &test->status, sizeof(signed char)); printf("test->status = %d\n",test->status); if(res<=0){ if(res == 0) { debug("the client has unexpectedly closed the connection\n"); test->status = NET_END; break; }else { debug("ctrlSocket has problems\n"); cleanupServer(test); return -1; } } } switch(test->status){ case NET_START: break; case NET_END: break; default: break; } write(test->ctrlSocket, "write function",14); } printf("return\n"); // server(test, test->sp); return 0; }