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)) {