diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2011-06-21 18:35:52 -0400 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2011-06-21 18:35:52 -0400 |
commit | 244348f5946d5ed9498bb1d3d68456fe615aee41 (patch) | |
tree | 00ae15a27af064a532f5af291cbb0e309c30778d /drivers.c | |
parent | 180e56ee01b9d6871bc44a4f2030826773132fe2 (diff) | |
download | gpsd-244348f5946d5ed9498bb1d3d68456fe615aee41.tar.gz |
Fix path-rewrite logic to handle multiple devices.
Diffstat (limited to 'drivers.c')
-rw-r--r-- | drivers.c | 35 |
1 files changed, 20 insertions, 15 deletions
@@ -1205,21 +1205,26 @@ static void path_rewrite(struct gps_device_t *session, char *prefix) * baginning of the path attribute, followed by a # to separate it * from the device. */ - char *deviceloc = strstr((char *)session->packet.outbuffer, prefix); - if (deviceloc != NULL) { - char copy[sizeof(session->packet.outbuffer)]; - (void)strlcpy(copy, (char *)session->packet.outbuffer, sizeof(copy)); - deviceloc += strlen(prefix); - (void)strlcpy(deviceloc, - session->gpsdata.dev.path, - sizeof(session->gpsdata.dev.path)); - (void)strlcat((char *)session->packet.outbuffer, "#", - sizeof(session->packet.outbuffer)); - (void)strlcat((char *)session->packet.outbuffer, - copy + (deviceloc-(char *)session->packet.outbuffer), - sizeof(session->packet.outbuffer)); - session->packet.outbuflen = strlen((char *)session->packet.outbuffer); - } + char *prefloc; + for (prefloc = (char *)session->packet.outbuffer; + prefloc < (char *)session->packet.outbuffer+session->packet.outbuflen; + prefloc++) + if (strncmp(prefloc, prefix, strlen(prefix)) == 0) { + char copy[sizeof(session->packet.outbuffer)]; + (void)strlcpy(copy, + (char *)session->packet.outbuffer, + sizeof(copy)); + prefloc += strlen(prefix); + (void)strlcpy(prefloc, + session->gpsdata.dev.path, + sizeof(session->gpsdata.dev.path)); + (void)strlcat((char *)session->packet.outbuffer, "#", + sizeof(session->packet.outbuffer)); + (void)strlcat((char *)session->packet.outbuffer, + copy + (prefloc-(char *)session->packet.outbuffer), + sizeof(session->packet.outbuffer)); + } + session->packet.outbuflen = strlen((char *)session->packet.outbuffer); } static gps_mask_t json_pass_packet(struct gps_device_t *session UNUSED) |