Hi, I've been trying to get Kismet working nicely on my raspberry pi, and have come across the need to apply a patch that someone posted in the Kismet forums (link and patch are pasted below).
First off, I assume that the patch is created as a text file (GPSPatch.diff) in my case, then applied to the source code using a command like: patch -uNp1 -i GPSPatch.diff
then I recompile using (sudo)
./configure
make
make install
If that's not how to patch a program that's already compiled, if someone can put me on the right path, I'd appreciate it greatly.
Assuming I'm right so far:
When I invoke: patch -uNp1 --dry-run --verbose -i GPSPatch.diff
I get errors. The first seems to just be related to indentation (****malformed patch at [lines not indented])
So, after I fix the indentation, that error goes away, and if I run the command again, I get this:
patch: **** malformed patch at line 11: long aggregate_points;
which I think I can fix with changing (line numbers added by me):
Code:
4 @@ -183,7 +183,7 @@
TO:
Code:
4 @@ -183,9 +183,9 @@
Original code here (line numbers added by me):
Code:
4 @@ -183,7 +183,7 @@
5 double min_lat, min_lon, min_alt, min_spd;
6 double max_lat, max_lon, max_alt, max_spd;
7 // Aggregate/avg center position
8 - long unsigned int add_lat, add_lon, add_alt;
9 + uint64_t add_lat, add_lon, add_alt;
10 double aggregate_lat, aggregate_lon, aggregate_alt;
11 long aggregate_points;
12 };
13 diff -Naur orig/util.cc new/util.cc
14 --- orig/util.cc 2013-03-27 15:41:48.000000000 +0100
15 +++ new/util.cc 2014-05-25 12:54:54.000000000 +0200
16 @@ -1093,11 +1093,11 @@
I am surprised that the patch writer didn't see this though: Is my correction right?
SO, once I get the first two errors to go away, I get this:
**** malformed patch at line 13: diff -Naur orig/util.cc new/util.cc
which refers to this line:
diff -Naur orig/util.cc new/util.cc
Is this because I need to break this patch up into individual files before applying them?
It seems like it, but I'd like to know if there's an easier way. From what little I know about Linux, it always seems like there's an easier way... Thanks as always to anyone who offers assistance!
Kevin
The Link:
https://www.kismetwireless.net/Forum...1016156.530417
The patch contained in the link:
This patch fixes the problem by using a bigger integer type. Verified on a raspberry pi but the problem should be present on all plattforms where 32-bit integers actually are 32-bit. The comments regarding number range is not corrected.
Code:
- diff -Naur orig/gpscore.h new/gpscore.h
- --- orig/gpscore.h 2013-03-27 15:41:48.000000000 +0100
- +++ new/gpscore.h 2014-05-25 12:55:15.000000000 +0200
- @@ -183,7 +183,7 @@
- double min_lat, min_lon, min_alt, min_spd;
- double max_lat, max_lon, max_alt, max_spd;
- // Aggregate/avg center position
- - long unsigned int add_lat, add_lon, add_alt;
- + uint64_t add_lat, add_lon, add_alt;
- double aggregate_lat, aggregate_lon, aggregate_alt;
- long aggregate_points;
- };
- diff -Naur orig/util.cc new/util.cc
- --- orig/util.cc 2013-03-27 15:41:48.000000000 +0100
- +++ new/util.cc 2014-05-25 12:54:54.000000000 +0200
- @@ -1093,11 +1093,11 @@
- /* Airware PPI gps conversion code from Johnny Csh */
- /*
- - * input: a unsigned 32-bit (native endian) value between 0 and 3600000000 (inclusive)
- + * input: a unsigned 64-bit (native endian) value between 0 and 3600000000 (inclusive)
- * output: a signed floating point value betwen -180.0000000 and + 180.0000000, inclusive)
- */
- -double fixed3_7_to_double(u_int32_t in) {
- - int32_t remapped_in = in - (180 * 10000000);
- +double fixed3_7_to_double(u_int64_t in) {
- + int64_t remapped_in = in - (180 * 10000000);
- double ret = (double) ((double) remapped_in / 10000000);
- return ret;
- }
- @@ -1105,16 +1105,16 @@
- * input: a native 32 bit unsigned value between 0 and 999999999
- * output: a positive floating point value between 000.0000000 and 999.9999999
- */
- -double fixed3_6_to_double(u_int32_t in) {
- +double fixed3_6_to_double(u_int64_t in) {
- double ret = (double) in / 1000000.0;
- return ret;
- }
- /*
- - * input: a native 32 bit unsigned value between 0 and 999.999999
- + * input: a native 64 bit unsigned value between 0 and 999.999999
- * output: a signed floating point value between -180000.0000 and +180000.0000
- */
- -double fixed6_4_to_double(u_int32_t in) {
- - int32_t remapped_in = in - (180000 * 10000);
- +double fixed6_4_to_double(u_int64_t in) {
- + int64_t remapped_in = in - (180000 * 10000);
- double ret = (double) ((double) remapped_in / 10000);
- return ret;
- }
- @@ -1130,38 +1130,38 @@
- /*
- * input: a signed floating point value betwen -180.0000000 and + 180.0000000, inclusive)
- - * output: a unsigned 32-bit (native endian) value between 0 and 3600000000 (inclusive)
- + * output: a unsigned 64-bit (native endian) value between 0 and 3600000000 (inclusive)
- */
- -u_int32_t double_to_fixed3_7(double in)
- +u_int64_t double_to_fixed3_7(double in)
- {
- - if (in < -180 || in >= 180)
- + if (in < -180 || in >= 180)
- return 0;
- //This may be positive or negative.
- - int32_t scaled_in = (int32_t) ((in) * (double) 10000000);
- + int64_t scaled_in = (int64_t) ((in) * (double) 10000000);
- //If the input conditions are met, this will now always be positive.
- - u_int32_t ret = (u_int32_t) (scaled_in + ((int32_t) 180 * 10000000));
- + u_int64_t ret = (u_int64_t) (scaled_in + ((int64_t) 180 * 10000000));
- return ret;
- }
- /*
- * input: a signed floating point value betwen -180000.0000 and + 180000.0000, inclusive)
- - * output: a unsigned 32-bit (native endian) value between 0 and 3600000000 (inclusive)
- + * output: a unsigned 64-bit (native endian) value between 0 and 3600000000 (inclusive)
- */
- -u_int32_t double_to_fixed6_4(double in)
- +u_int64_t double_to_fixed6_4(double in)
- {
- - if (in < -180000.0001 || in >= 180000.0001)
- + if (in < -180000.0001 || in >= 180000.0001)
- return 0;
- //This may be positive or negative.
- - int32_t scaled_in = (int32_t) ((in) * (double) 10000);
- + int64_t scaled_in = (int64_t) ((in) * (double) 10000);
- //If the input conditions are met, this will now always be positive.
- - u_int32_t ret = (u_int32_t) (scaled_in + ((int32_t) 180000 * 10000));
- + u_int64_t ret = (u_int64_t) (scaled_in + ((int64_t) 180000 * 10000));
- return ret;
- }
- /*
- * input: a positive floating point value between 000.0000000 and 999.9999999
- * output: a native 32 bit unsigned value between 0 and 999999999
- */
- -u_int32_t double_to_fixed3_6(double in) {
- - u_int32_t ret = (u_int32_t) (in * (double) 1000000.0);
- +u_int64_t double_to_fixed3_6(double in) {
- + u_int64_t ret = (u_int64_t) (in * (double) 1000000.0);
- return ret;
- }
- diff -Naur orig/util.h new/util.h
- --- orig/util.h 2013-03-27 15:41:48.000000000 +0100
- +++ new/util.h 2014-05-25 12:54:54.000000000 +0200
- @@ -236,13 +236,13 @@
- * the fixedX_Y fixed point values into 'native' doubles for displaying.
- * Documentation on these formats can be found in the PPI-GEOLOCATION specification
- */
- -double fixed3_7_to_double(u_int32_t in);
- -double fixed3_6_to_double(u_int32_t in);
- -double fixed6_4_to_double(u_int32_t in);
- +double fixed3_7_to_double(u_int64_t in);
- +double fixed3_6_to_double(u_int64_t in);
- +double fixed6_4_to_double(u_int64_t in);
- -u_int32_t double_to_fixed3_7(double in);
- -u_int32_t double_to_fixed3_6(double in);
- -u_int32_t double_to_fixed6_4(double in);
- +u_int64_t double_to_fixed3_7(double in);
- +u_int64_t double_to_fixed3_6(double in);
- +u_int64_t double_to_fixed6_4(double in);
- /*
- * Some values are encoded as 32-bit unsigned nano-second counters.