+static void
+do_adjust_clock(struct tm *tm)
+{
+ char tmp[256];
+
+ strftime(tmp, 256, "%Y-%m-%dT%H:%M:%S", tm);
+ DEBUG(3, "date: %s UTC\n", tmp);
+
+ if (adjust_clock) {
+ time_t sec = timegm(tm);
+ struct timeval cur;
+
+ gettimeofday(&cur, NULL);
+
+ if ((sec < 0) || (llabs(cur.tv_sec - sec) > MAX_TIME_OFFSET)) {
+ struct timeval tv = { 0 };
+ tv.tv_sec = sec;
+ if (++nmea_bad_time > MAX_BAD_TIME) {
+ LOG("system time differs from GPS time by more than %d seconds. Using %s UTC as the new time\n", MAX_TIME_OFFSET, tmp);
+ /* only set datetime if specified by command line argument! */
+ settimeofday(&tv, NULL);
+ }
+ } else {
+ nmea_bad_time = 0;
+ }
+ }
+}
+
+static void
+parse_gps_coords(char *latstr, char *vhem, char *lonstr, char *hhem)
+{
+ float minutes;
+ float degrees;
+ float lat = strtof(latstr, NULL);
+ float lon = strtof(lonstr, NULL);
+
+ degrees = floor(lat / 100.0);
+ minutes = lat - (degrees * 100.0);
+ lat = degrees + minutes / 60.0;
+
+ degrees = floor(lon / 100.0);
+ minutes = lon - (degrees * 100.0);
+ lon = degrees + minutes / 60.0;
+
+ if (*vhem == 'S')
+ lat *= -1.0;
+ if (*hhem == 'W')
+ lon *= -1.0;
+
+ snprintf(latitude, sizeof(latitude), "%f", lat);
+ snprintf(longitude, sizeof(longitude), "%f", lon);
+
+ DEBUG(3, "position: %s %s\n", latitude, longitude);
+ gps_fields |= GPS_FIELD_LAT | GPS_FIELD_LON;
+
+ gps_timestamp();
+}
+