Hi!
Long time ago I've started update of gpsd from 2.x to 3.x.
Upstream moved from auto crap to scons so it gave me some
headache.
Before switching to new gpsd we need to prepare some ports
which are linking against libgps because API has changed.
Here are the diffs for foxtrotgps, geoclue and qlandkaretegt.
(diff for geo/viking is still WIP):

Index: patches/patch-src_gps_functions_c
===================================================================
RCS file: patches/patch-src_gps_functions_c
diff -N patches/patch-src_gps_functions_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_gps_functions_c   14 Jun 2019 07:04:02 -0000
@@ -0,0 +1,20 @@
+$OpenBSD$
+
+Fix build with newer gpsd API.
+https://bazaar.launchpad.net/~foxtrotgps-team/foxtrotgps/trunk/revision/316
+
+Index: src/gps_functions.c
+--- src/gps_functions.c.orig
++++ src/gps_functions.c
+@@ -738,7 +738,11 @@ cb_gpsd_data(GIOChannel *src, GIOCondition condition,
+       if (!libgps_initialized)
+               return FALSE;
+
++#if GPSD_API_MAJOR_VERSION >= 7 /* API change. gpsd version 3.18 and
subsequent. */
++      ret = gps_read(&libgps_gpsdata, NULL, 0);
++#else
+       ret = gps_read(&libgps_gpsdata);
++#endif
+       /* Note that gps_read() will never actually return 0
+          (zero-length reads are converted internally to a -1 return,
+           since they mean that the connection to the daemon has closed),


____________________________________________

Index: patches/patch-providers_gpsd_geoclue-gpsd_c
===================================================================
RCS file: patches/patch-providers_gpsd_geoclue-gpsd_c
diff -N patches/patch-providers_gpsd_geoclue-gpsd_c
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-providers_gpsd_geoclue-gpsd_c 14 Jun 2019 07:11:23 -0000
@@ -0,0 +1,72 @@
+$OpenBSD$
+
+Fix build with newer gpsd API.
+
+--- providers/gpsd/geoclue-gpsd.c.orig Tue Jul 31 20:47:05 2012
++++ providers/gpsd/geoclue-gpsd.c      Sun Mar 27 12:35:47 2016
+@@ -40,7 +40,12 @@
+ #include <geoclue/gc-iface-position.h>
+ #include <geoclue/gc-iface-velocity.h>
+
++#if GPSD_API_MAJOR_VERSION >= 5
++/* gps_data conflicts with gps_data function */
++typedef struct gps_data_t gps_data_l;
++#else
+ typedef struct gps_data_t gps_data;
++#endif
+ typedef struct gps_fix_t gps_fix;
+
+ /* only listing used tags */
+@@ -59,7 +64,11 @@ typedef struct {
+       char *host;
+       char *port;
+
++#if GPSD_API_MAJOR_VERSION >= 5
++      gps_data_l *gpsdata;
++#else
+       gps_data *gpsdata;
++#endif
+
+       gps_fix *last_fix;
+
+@@ -397,10 +406,16 @@ geoclue_gpsd_stop_gpsd (GeoclueGpsd *self)
+ static gboolean
+ geoclue_gpsd_start_gpsd (GeoclueGpsd *self)
+ {
++#if GPSD_API_MAJOR_VERSION >= 5
++      int status = gps_open (self->host, self->port, self->gpsdata);
++      if (status == 0) {
++              gps_stream(self->gpsdata, WATCH_ENABLE | WATCH_NMEA, NULL);
++#else
+       self->gpsdata = gps_open (self->host, self->port);
+       if (self->gpsdata) {
+               gps_stream(self->gpsdata, WATCH_ENABLE | WATCH_NMEA | 
POLL_NONBLOCK, NULL);
+               gps_set_raw_hook (self->gpsdata, gpsd_raw_hook);
++#endif
+               return TRUE;
+       } else {
+               g_warning ("gps_open() failed, is gpsd running 
(host=%s,port=%s)?",
self->host, self->port);
+@@ -413,10 +428,23 @@ gpsd_poll(gpointer data)
+ {
+       GeoclueGpsd *self = (GeoclueGpsd*)data;
+       if (self->gpsdata) {
++#if GPSD_API_MAJOR_VERSION >= 5
++              /* gps_poll and gps_set_raw_hook no longer present in this API 
version */
++              if (gps_waiting(self->gpsdata, 500)) {
++                      if (gps_read(self->gpsdata) == -1) {
++                              geoclue_gpsd_set_status (self, 
GEOCLUE_STATUS_ERROR);
++                              geoclue_gpsd_stop_gpsd(self);
++                              return FALSE;
++                      } else {
++                              /* Call existing raw_hook to process the data */
++                              gpsd_raw_hook(self->gpsdata, NULL, 0);
++                      }
++#else
+               if (gps_poll(self->gpsdata) < 0) {
+                       geoclue_gpsd_set_status (self, GEOCLUE_STATUS_ERROR);
+                       geoclue_gpsd_stop_gpsd(self);
+                       return FALSE;
++#endif
+               }
+       }
+       return TRUE;


______________________________________________________

Index: patches/patch-src_CDeviceGPSD_cpp
===================================================================
RCS file: patches/patch-src_CDeviceGPSD_cpp
diff -N patches/patch-src_CDeviceGPSD_cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ patches/patch-src_CDeviceGPSD_cpp   16 Jun 2019 07:14:21 -0000
@@ -0,0 +1,18 @@
+$OpenBSD$
+
+Fix build with newer gpsd API
+
+Index: src/CDeviceGPSD.cpp
+--- src/CDeviceGPSD.cpp.orig
++++ src/CDeviceGPSD.cpp
+@@ -212,7 +212,9 @@ void CGPSDThread::run()
+             }                    // if
+             else if( FD_ISSET( gpsdata->gps_fd, &fds ) )
+             {
+-#if GPSD_API_MAJOR_VERSION >= 5
++#if GPSD_API_MAJOR_VERSION >= 7
++                gps_read( gpsdata, NULL, 0 );
++#elif GPSD_API_MAJOR_VERSION >= 5
+                 gps_read( gpsdata );
+ #else
+                 gps_poll( gpsdata );

Build was tested on amd64 with gpsd-3.18. No tests with gps yet.
Comments?



Reply via email to