X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=utils%2FTerraSync%2Fterrasync.cxx;h=7404530e1139bc93fa925c50629defee14fcf2f8;hb=c4ac013c42cadbe25e3b41bad6f0abbe85df11ef;hp=e586632dda8cd371d52a30e4c95d5ac3f8581bbe;hpb=3e0489bd910620e5d34e33d231c55135daeb2543;p=flightgear.git diff --git a/utils/TerraSync/terrasync.cxx b/utils/TerraSync/terrasync.cxx index e586632dd..7404530e1 100644 --- a/utils/TerraSync/terrasync.cxx +++ b/utils/TerraSync/terrasync.cxx @@ -32,9 +32,12 @@ #ifdef __MINGW32__ #include #include +#elif defined(_MSC_VER) +#include #endif #include // atoi() atof() abs() system() +#include // signal() #include @@ -109,9 +112,10 @@ static void usage( const string& prog ) { } -std::deque waitingTiles; -typedef std::map CompletedTiles; +deque waitingTiles; +typedef map CompletedTiles; CompletedTiles completedTiles; +netSocket theSocket; #ifdef HAVE_SVN_CLIENT_H @@ -124,10 +128,6 @@ svn_opt_revision_t *mysvn_rev_peg = NULL; static const svn_version_checklist_t mysvn_checklist[] = { { "svn_subr", svn_subr_version }, { "svn_client", svn_client_version }, - { "svn_wc", svn_wc_version }, - { "svn_ra", svn_ra_version }, - { "svn_delta", svn_delta_version }, - { "svn_diff", svn_diff_version }, { NULL, NULL } }; @@ -269,9 +269,37 @@ void sync_tree(const char* dir) { } } +#ifdef _MSC_VER +typedef void (__cdecl * sighandler_t)(int); +#elif defined( __APPLE__ ) +typedef sig_t sighandler_t; +#endif + +bool terminating = false; +sighandler_t prior_signal_handlers[32]; +int termination_triggering_signals[] = { +#ifndef _MSC_VER + SIGHUP, SIGINT, SIGQUIT, SIGKILL, +#else + SIGINT, SIGILL, SIGFPE, SIGSEGV, SIGTERM, SIGBREAK, SIGABRT, +#endif + 0}; // zero terminated + +void terminate_request_handler(int param) { + char msg[] = "\nReceived signal XX, intend to exit soon.\n" + "repeat the signal to force immediate termination.\n"; + msg[17] = '0' + param / 10; + msg[18] = '0' + param % 10; + write(1, msg, sizeof(msg) - 1); + terminating = true; + signal(param, prior_signal_handlers[param]); + theSocket.close(); +} + const int nowhere = -9999; + // parse message static void parse_message( const string &msg, int *lat, int *lon ) { double dlat, dlon; @@ -281,8 +309,8 @@ static void parse_message( const string &msg, int *lat, int *lon ) { string::size_type pos = text.find( "$GPGGA" ); if ( pos == string::npos ) { - *lat = -9999.0; - *lon = -9999.0; + *lat = nowhere; + *lon = nowhere; return; } string tmp = text.substr( pos + 7 ); @@ -408,7 +436,8 @@ static void sync_areas( int lat, int lon, int lat_dir, int lon_dir ) { void getWaitingTile() { while ( !waitingTiles.empty() ) { - CompletedTiles::iterator ii = completedTiles.find( waitingTiles.front() ); + CompletedTiles::iterator ii = + completedTiles.find( waitingTiles.front() ); time_t now = time(0); if ( ii == completedTiles.end() || ii->second + 600 < now ) { sync_tree(waitingTiles.front().c_str()); @@ -422,7 +451,7 @@ void getWaitingTile() { int main( int argc, char **argv ) { int port = 5501; - char host[256] = ""; // accept messages from anyone + char host[256] = "localhost"; bool testing = false; bool do_checkout(true); int verbose(0); @@ -486,14 +515,12 @@ int main( int argc, char **argv ) { // Must call this before any other net stuff netInit( &argc,argv ); - netSocket s; - - if ( ! s.open( false ) ) { // open a UDP socket + if ( ! theSocket.open( false ) ) { // open a UDP socket printf("error opening socket\n"); return -1; } - if ( s.bind( host, port ) == -1 ) { + if ( theSocket.bind( host, port ) == -1 ) { printf("error binding to port %d\n", port); return -1; } @@ -524,7 +551,14 @@ int main( int argc, char **argv ) { } - while ( true ) { // main loop + for (int* sigp=termination_triggering_signals; *sigp; sigp++) { + prior_signal_handlers[*sigp] = + signal(*sigp, *terminate_request_handler); + if (verbose) cout << "Intercepted signal " << *sigp << endl; + } + + while ( !terminating ) { + // main loop recv_msg = false; if ( testing ) { // No FGFS communications @@ -532,8 +566,11 @@ int main( int argc, char **argv ) { lon = -123; recv_msg = (lat != last_lat) || (lon != last_lon); } else { - s.setBlocking(waitingTiles.empty()); - len = s.recv(msg, maxlen, 0); + if (verbose && waitingTiles.empty()) { + cout << "Idle; waiting for FlightGear position\n"; + } + theSocket.setBlocking(waitingTiles.empty()); + len = theSocket.recv(msg, maxlen, 0); if (len >= 0) { msg[len] = '\0'; recv_msg = true; @@ -546,7 +583,7 @@ int main( int argc, char **argv ) { // Ignore messages where the location does not change if ( lat != last_lat || lon != last_lon ) { cout << "pos in msg = " << lat << "," << lon << endl; - std::deque oldRequests; + deque oldRequests; oldRequests.swap( waitingTiles ); int lat_dir, lon_dir, dist; if ( last_lat == nowhere || last_lon == nowhere ) { @@ -584,11 +621,11 @@ int main( int argc, char **argv ) { } else if ( testing ) { - exit( 0 ); + terminating = true; } else ulSleep( 1 ); - } // while true + } // while !terminating return 0; }