Re: FreeBSD & gpsd?

Marco Molteni <[email protected]> Fri, 28 Jun 2002 10:01:14 +0200
Newsgroups gmane.network.wireless.bsd.airtools
Message-ID <[email protected]>
> > Has anyone gotten gpsd to work properly on FreeBSD?

I just sent some patches to the gpsdrive mailing list to fix gpsd
on FreeBSD. I am also the maintainer of the FreeBSD gpsdrive port
so feel free to bug me if it doesn't work ;-)

Patches included. It is still an hack for the moment, but it works fine.

marco
gpsd-01.patch.txt (text/plain, 4.8 KB)
diff -u -r gpsdrive-1.23pre9-orig/src/em.c gpsdrive-1.23pre9/src/em.c
--- gpsdrive-1.23pre9-orig/src/em.c	Tue Apr 16 15:06:51 2002
+++ gpsdrive-1.23pre9/src/em.c	Thu Jun 27 17:54:05 2002
@@ -362,7 +362,8 @@
   char *bufp;
   char *bufp2;
   int i = 0, j = 0,  nmea = 0;
-  int fd, nfds;
+  int fd;
+  extern int nfds;
 
   if (p[h->ndata] == em_checksum (p, h->ndata))
     {
@@ -475,7 +476,6 @@
     }
   if (nmea > 0)
     {
-      nfds = getdtablesize ();
       if (debug > 4)
 	fprintf (stderr, "%s", buf);
       for (fd = 0; fd < nfds; fd++)
diff -u -r gpsdrive-1.23pre9-orig/src/gpsd.c gpsdrive-1.23pre9/src/gpsd.c
--- gpsdrive-1.23pre9-orig/src/gpsd.c	Fri Apr 19 20:26:14 2002
+++ gpsdrive-1.23pre9/src/gpsd.c	Thu Jun 27 18:02:12 2002
@@ -78,27 +78,31 @@
 int debug = 0;
 int device_speed = B4800;
 int device_type;
+int nfds;  /* number of file descriptors to select() for */
 char *device_name = 0;
 char *latitude = 0;
 char *longitude = 0;
 char latd = 'N';
 char lond = 'W';
-				/* command line option defaults */
-char *default_device_name = "/dev/gps";
-char *default_latitude = "3600.000";
-char *default_longitude = "-12300.000";
-
-int nfds, dsock;
-int verbose = 1;
-int bincount;
 
-int reopen = 0;
+/* command line option defaults */
+static char *default_device_name = "/dev/gps";
+static char *default_latitude = "3600.000";
+static char *default_longitude = "-12300.000";
+
+static int dsock; /* socket to dpgs server */
+
+/* If set, close (and reopen?) the serial interface. Triggered by SIGUSR1. */
+static int reopen = 0;
+
 
 static int handle_input (int input, fd_set * afds, fd_set * nmea_fds);
-extern int handle_EMinput (int input, fd_set * afds, fd_set * nmea_fds);
 static int handle_request (int fd, fd_set * fds);
-int connectsock (char *host, char *service, char *protocol);
-void em_send_rtcm (unsigned short *rtcmbuf, int rtcmbytes);
+
+extern int handle_EMinput (int input, fd_set * afds, fd_set * nmea_fds);
+extern int connectsock (char *host, char *service, char *protocol);
+extern void em_send_rtcm (unsigned short *rtcmbuf, int rtcmbytes);
+
 
 static void
 onsig (int sig)
@@ -164,16 +168,17 @@
   char *default_service = "gpsd";
   char *default_dgpsserver = "dgps.wsrcc.com";
   char *default_dgpsport = "rtcm-sc104";
-  char *service = 0;
+  char *service = 0; /* port number to listen to */
   char *dgpsport = 0;
   char *dgpsserver = 0;
   struct sockaddr_in fsin;
-  int msock;
+  int msock; /* listening socket fd */
   fd_set rfds;
   fd_set afds;
   fd_set nmea_fds;
   int alen;
-  int fd, input;
+  int fd;
+  int input; /* GPS device fd */
   int need_gps, need_dgps = 0, need_init = 1;
   extern char *optarg;
   int option;
@@ -273,17 +278,18 @@
 	default:
 	  fputs ("usage:  gpsd [options] \n\
   options include: \n\
-  -D integer   [ set debug level ] \n\
+  -D level     [ set debug level. If >= 2, remain in foreground ] \n\
   -L longitude [ set longitude ] \n\
-  -S integer   [ set port for daemon ] \n\
-  -T e         [ earthmate flag ] \n\
-  -h           [ help message ] \n\
   -l latitude  [ set latitude ] \n\
-  -p string    [ set gps device name ] \n\
+  -S port      [ set gpsd listening port ] \n\
+  -T type      [ set DeLorme models. e = Earthmate, t = Tripmate ] \n\
+  -h           [ help message ] \n\
+  -p path      [ set gps device pathname ] \n\
   -s baud_rate [ set baud rate on gps device ] \n\
   -c           [ use dgps service for corrections ] \n\
-  -d host      [ set dgps server ] \n\
-  -r port      [ set dgps rtcm-sc104 port ] \n\
+  -d host      [ set dgps server hostname] \n\
+  -r port      [ set dgps server port ] \n\
+  -n           [ disable setting default values for longitute and latitute ] \n\
 ", stderr);
 	  exit (0);
 	}
@@ -354,8 +360,11 @@
 	  need_dgps = 0;
 	}
     }
-
-  nfds = getdtablesize ();
+#ifndef min
+#define min(a, b) (((a) < (b)) ? (a) : (b))
+#endif
+  /* still wrong, but at least do not coredump */
+  nfds = min (getdtablesize (), FD_SETSIZE);
 
   FD_ZERO (&afds);
   FD_ZERO (&nmea_fds);
@@ -375,10 +384,9 @@
 
   while (1)
     {
-      memcpy ((char *) &rfds, (char *) &afds, sizeof (rfds));
+      memcpy (&rfds, &afds, sizeof (rfds));
 
-      if (select (nfds, &rfds, (fd_set *) 0, (fd_set *) 0,
-		  (struct timeval *) 0) < 0)
+      if (select (nfds, &rfds, NULL, NULL, NULL) < 0)
 	{
 	  if (errno == EINTR)
 	    continue;
@@ -599,6 +607,7 @@
 {
   static unsigned char buf[BUFSIZE];	/* that is more then a sentence */
   static int offset = 0;
+  static int bincount;
   int fd;
 
   while (offset < BUFSIZE)
diff -u -r gpsdrive-1.23pre9-orig/src/tm.c gpsdrive-1.23pre9/src/tm.c
--- gpsdrive-1.23pre9-orig/src/tm.c	Fri Apr  5 19:59:45 2002
+++ gpsdrive-1.23pre9/src/tm.c	Wed Jun 26 13:35:52 2002
@@ -19,6 +19,9 @@
 extern char latd;
 extern char lond;
 
+void do_eminit ();
+
+
 void process_message(char *sentence)
 {
     if (checksum(sentence)) {