diff --git a/SConstruct b/SConstruct index 9df0893..9ca8549 100644 --- a/SConstruct +++ b/SConstruct @@ -848,6 +848,7 @@ libgpsd_sources = [ "driver_tsip.c", "driver_ubx.c", "driver_zodiac.c", + "callbacks.c", ] # Cope with scons's failure to set SONAME in its builtins. @@ -1013,7 +1014,7 @@ gpsd = gpsd_env.Program('gpsd', gpsd_sources, parse_flags = gpsdlibs + dbus_libs) env.Depends(gpsd, [compiled_gpsdlib, compiled_gpslib]) -gpsdecode = env.Program('gpsdecode', ['gpsdecode.c'], parse_flags=gpsdlibs) +gpsdecode = env.Program('gpsdecode', ['gpsdecode.c', 'callbacks.c'], parse_flags=gpsdlibs) env.Depends(gpsdecode, [compiled_gpsdlib, compiled_gpslib]) gpsctl = env.Program('gpsctl', ['gpsctl.c'], parse_flags=gpsdlibs) @@ -1080,8 +1081,20 @@ else: # Build Python binding # python_extensions = { - "gps" + os.sep + "packet" : ["gpspacket.c", "packet.c", "isgps.c", - "driver_rtcm2.c", "strl.c", "hex.c", "crc24q.c"], + "gps" + os.sep + "packet" : ["gpspacket.c", "packet.c", "isgps.c", "callbacks.c", + "driver_rtcm2.c", "strl.c", "hex.c", "crc24q.c", "subframe.c", + "serial.c", "libgps_core.c", "libgps_sock.c", "json.c", + "bits.c", "libgps_json.c", "shared_json.c", "libgps_shm.c", + "gpsutils.c", "timebase.c", "rtcm3_json.c", "libgpsd_core.c", + "drivers.c", "driver_ais.c", "driver_nmea0183.c", "driver_nmea2000.c", + "driver_garmin_txt.c", "driver_evermore.c", "driver_garmin.c", + "driver_geostar.c", "driver_italk.c", "driver_oncore.c", + "driver_navcom.c", "driver_sirf.c", "driver_superstar2.c", + "driver_tsip.c", "driver_ubx.c", "driver_zodiac.c", + "net_dgpsip.c", "net_gnss_dispatch.c", "net_ntrip.c", + "netlib.c", "ais_json.c", "geoid.c", "bsd_base64.c", + "pseudoais.c", "pseudonmea.c", "rtcm2_json.c", + "gps_maskdump.c", "driver_rtcm3.c"], "gps" + os.sep + "clienthelpers" : ["gpsclient.c", "geoid.c", "gpsdclient.c", "strl.c"] } diff --git a/gpsctl.c b/gpsctl.c index b3c1142..c7c76b2 100644 --- a/gpsctl.c +++ b/gpsctl.c @@ -30,29 +30,16 @@ static unsigned int timeout = 0; /* no timeout */ static struct gps_context_t context; static bool hunting = true; -ssize_t gpsd_write(struct gps_device_t *session, - const char *buf, - const size_t len) -/* pass low-level data to devices straight through */ -{ - return gpsd_serial_write(session, buf, len); -} - /* * Set this as high or higher than the maximum number of subtype * probes in drivers.c. */ #define REDIRECT_SNIFF 15 -void gpsd_report(const int debuglevel, const int errlevel, - const char *fmt, ...) +static void gpsctl_report(const int debuglevel, const int errlevel, + const char *fmt, va_list ap) { - va_list ap; - - va_start(ap, fmt); gpsd_labeled_report(debuglevel, errlevel, "gpsctl:", fmt, ap); - va_end(ap); - } static void settle(struct gps_device_t *session) @@ -214,6 +201,8 @@ int main(int argc, char **argv) ssize_t cooklen = 0; #endif /* RECONFIGURE_ENABLE */ + gpsd_set_report_callback(gpsctl_report); + #define USAGE "usage: gpsctl [-l] [-b | -n | -r] [-D n] [-s speed] [-c rate] [-T timeout] [-V] [-t devtype] [-x control] [-e] \n" while ((option = getopt(argc, argv, "bec:fhlnrs:t:x:D:T:V")) != -1) { switch (option) { diff --git a/gpsd.c b/gpsd.c index dbda5a8..7df8927 100644 --- a/gpsd.c +++ b/gpsd.c @@ -165,25 +165,6 @@ static void onsig(int sig) signalled = (sig_atomic_t) sig; } -ssize_t gpsd_write(struct gps_device_t *session, - const char *buf, - const size_t len) -/* pass low-level data to devices straight through */ -{ - return gpsd_serial_write(session, buf, len); -} - -void gpsd_report(const int debuglevel, const int errlevel, - const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - gpsd_labeled_report(debuglevel, errlevel, "gpsd:", fmt, ap); - va_end(ap); - -} - static void typelist(void) /* list installed drivers and enabled features */ { diff --git a/gpsd.h-tail b/gpsd.h-tail index 5090e22..9e60544 100644 --- a/gpsd.h-tail +++ b/gpsd.h-tail @@ -990,6 +990,12 @@ __attribute__((__format__(__printf__, 3, 4))) void gpsd_report(const int, const void gpsd_report(const int, const int, const char *, ...); #endif +/* over-ridable callouts from core library to application code */ +typedef void (*report_callback_t)(const int, const int, const char *, va_list); +void gpsd_set_report_callback(report_callback_t); +typedef ssize_t (*write_callback_t)(struct gps_device_t *, const char *, const size_t); +void gpsd_set_write_callback(write_callback_t); + #ifdef S_SPLINT_S extern struct protoent *getprotobyname(const char *); extern /address@hidden@*/char *strptime(const char *,const char *tp,/address@hidden@*/struct tm *)/address@hidden address@hidden/; diff --git a/gpsdecode.c b/gpsdecode.c index 2223881..2906a06 100644 --- a/gpsdecode.c +++ b/gpsdecode.c @@ -27,23 +27,10 @@ static unsigned int typelist[32]; * **************************************************************************/ -ssize_t gpsd_write(struct gps_device_t *session, - const char *buf, - const size_t len) -/* pass low-level data to devices straight through */ +static void gpsdecode_report(const int debuglevel, const int errlevel, + const char *fmt, va_list ap) { - return gpsd_serial_write(session, buf, len); -} - -void gpsd_report(const int debuglevel, const int errlevel, - const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); gpsd_labeled_report(debuglevel, errlevel, "gpsdecode:", fmt, ap); - va_end(ap); - } #ifdef AIVDM_ENABLE @@ -644,6 +631,8 @@ int main(int argc, char **argv) enum { doencode, dodecode } mode = dodecode; + gpsd_set_report_callback(gpsdecode_report); + while ((c = getopt(argc, argv, "cdejpst:uvVD:")) != EOF) { switch (c) { case 'c': diff --git a/gpsmon.c b/gpsmon.c index e6d57c8..c746ddc 100644 --- a/gpsmon.c +++ b/gpsmon.c @@ -588,7 +588,7 @@ static void packet_log(const char *fmt, ...) } #endif /* PPS_ENABLE */ -void gpsd_report(const int debuglevel, const int errlevel, const char *fmt, ...) +static void gpsmon_report(const int debuglevel, const int errlevel, const char *fmt, va_list ap) /* our version of the logger */ { char buf[BUFSIZ]; @@ -632,14 +632,11 @@ void gpsd_report(const int debuglevel, const int errlevel, const char *fmt, ...) (void)strlcpy(buf, "gpsmon:", BUFSIZ); (void)strncat(buf, err_str, BUFSIZ - strlen(buf)); if (errlevel <= debuglevel) { - va_list ap; - va_start(ap, fmt); packet_vlog(buf, sizeof(buf), fmt, ap); - va_end(ap); } } -ssize_t gpsd_write(struct gps_device_t *session, +static ssize_t gpsmon_write(struct gps_device_t *session, const char *buf, const size_t len) /* pass low-level data to devices, echoing it to the log window */ @@ -1087,6 +1084,9 @@ int main(int argc, char **argv) char inbuf[80]; volatile bool nocurses = false; + gpsd_set_report_callback(gpsmon_report); + gpsd_set_write_callback(gpsmon_write); + /*@ -observertrans @*/ (void)putenv("TZ=UTC"); // for ctime() /*@ +observertrans @*/ diff --git a/gpspacket.c b/gpspacket.c index cb85140..b63074b 100644 --- a/gpspacket.c +++ b/gpspacket.c @@ -14,11 +14,10 @@ static PyObject *ErrorObject = NULL; static PyObject *report_callback = NULL; -void gpsd_report(int unused UNUSED, int errlevel, const char *fmt, ... ) +static void gpspacket_report(int unused UNUSED, int errlevel, const char *fmt, va_list ap) { char buf[BUFSIZ]; PyObject *args; - va_list ap; if (!report_callback) /* no callback defined, exit early */ return; @@ -28,9 +27,7 @@ void gpsd_report(int unused UNUSED, int errlevel, const char *fmt, ... ) return; } - va_start(ap, fmt); (void)vsnprintf(buf, sizeof(buf), fmt, ap); - va_end(ap); args = Py_BuildValue("(is)", errlevel, buf); if (!args) @@ -55,6 +52,7 @@ newLexerObject(PyObject *arg UNUSED) if (self == NULL) return NULL; memset(&self->lexer, 0, sizeof(struct gps_packet_t)); + gpsd_set_report_callback(gpspacket_report); packet_reset(&self->lexer); return self; } diff --git a/test_geoid.c b/test_geoid.c index 2392b1a..32f2d45 100644 --- a/test_geoid.c +++ b/test_geoid.c @@ -10,29 +10,18 @@ #include "gpsd.h" -ssize_t gpsd_write(struct gps_device_t *session, - const char *buf, - const size_t len) -/* pass low-level data to devices straight through */ +static void test_geoid_report(const int debuglevel, const int errlevel, + const char *fmt, va_list ap) { - return gpsd_serial_write(session, buf, len); -} - -void gpsd_report(const int debuglevel, const int errlevel, - const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); gpsd_labeled_report(debuglevel, errlevel, "geoid:", fmt, ap); - va_end(ap); - } int main(int argc, char **argv) { double lat, lon; + gpsd_set_report_callback(test_geoid_report); + if (argc != 3) { fprintf(stderr, "Usage: %s lat lon\n", argv[0]); return 1; diff --git a/test_packet.c b/test_packet.c index 2228ddb..5b61b30 100644 --- a/test_packet.c +++ b/test_packet.c @@ -17,27 +17,14 @@ static int verbose = 0; -ssize_t gpsd_write(struct gps_device_t *session, - const char *buf, - const size_t len) -/* pass low-level data to devices straight through */ -{ - return gpsd_serial_write(session, buf, len); -} - -void gpsd_report(int debuglevel, int errlevel, const char *fmt, ...) +static void test_packet_report(int debuglevel, int errlevel, const char *fmt, va_list ap) /* assemble command in printf(3) style, use stderr or syslog */ { if (errlevel <= debuglevel) { char buf[BUFSIZ]; - va_list ap; - buf[0] = '\0'; - va_start(ap, fmt); (void)vsnprintf(buf + strlen(buf), sizeof(buf) - strlen(buf), fmt, ap); - va_end(ap); - (void)fputs(buf, stderr); } } @@ -400,6 +387,8 @@ int main(int argc, char *argv[]) int failcount = 0; int option, singletest = 0; + gpsd_set_report_callback(test_packet_report); + verbose = 0; while ((option = getopt(argc, argv, "ce:t:v:")) != -1) { switch (option) {