njn | 61485ab | 2009-03-04 04:15:16 +0000 | [diff] [blame] | 1 | |
| 2 | #include <stdio.h> |
| 3 | #include <stdlib.h> |
| 4 | #include <string.h> |
| 5 | |
| 6 | // This program determines which OS that this Valgrind installation |
| 7 | // supports, which depends on what was chosen at configure-time. |
| 8 | // |
| 9 | // We return: |
florian | f897b99 | 2011-07-31 03:22:45 +0000 | [diff] [blame] | 10 | // - 0 if the machine matches the asked-for OS and satisfies a |
| 11 | // version requirement, if any |
njn | 61485ab | 2009-03-04 04:15:16 +0000 | [diff] [blame] | 12 | // - 1 if it doesn't match but does match the name of another OS |
| 13 | // - 2 if it doesn't match the name of any OS |
| 14 | // - 3 if there was a usage error (it also prints an error message) |
| 15 | |
| 16 | // Nb: When updating this file for a new OS, add the name to |
| 17 | // 'all_OSes' as well as adding go(). |
| 18 | |
| 19 | #define False 0 |
| 20 | #define True 1 |
| 21 | typedef int Bool; |
| 22 | |
| 23 | char* all_OSes[] = { |
| 24 | "linux", |
njn | f76d27a | 2009-05-28 01:53:07 +0000 | [diff] [blame] | 25 | "darwin", |
sewardj | 8eb8bab | 2015-07-21 14:44:28 +0000 | [diff] [blame] | 26 | "solaris", |
njn | 61485ab | 2009-03-04 04:15:16 +0000 | [diff] [blame] | 27 | NULL |
| 28 | }; |
| 29 | |
florian | f897b99 | 2011-07-31 03:22:45 +0000 | [diff] [blame] | 30 | #if defined(VGO_linux) |
| 31 | static Bool matches_version(char *min_version) |
| 32 | { |
| 33 | int a1, a2, a3, g1, g2, g3; // 'a' = actual; 'g' = given |
| 34 | |
| 35 | if (min_version == NULL) return True; // no version specified |
| 36 | |
| 37 | // get actual version number |
| 38 | FILE *fp = fopen("/proc/sys/kernel/osrelease", "r"); |
| 39 | if (fp == NULL || fscanf(fp, "%d.%d.%d", &a1, &a2, &a3) != 3) return False; |
| 40 | fclose(fp); |
| 41 | |
| 42 | // parse given version number |
| 43 | if (sscanf(min_version, "%d.%d.%d", &g1, &g2, &g3) != 3) return False; |
| 44 | |
| 45 | // printf("actual %d %d %d\n", a1, a2,a3); |
| 46 | // printf("given %d %d %d\n", g1, g2,g3); |
| 47 | |
| 48 | if (a1 > g1) return True; |
| 49 | if (a1 < g1) return False; |
| 50 | if (a2 > g2) return True; |
| 51 | if (a2 < g2) return False; |
| 52 | if (a3 >= g3) return True; |
| 53 | |
| 54 | return False; |
| 55 | } |
| 56 | #endif |
| 57 | |
| 58 | static Bool go(char* OS, char *min_version) |
njn | 61485ab | 2009-03-04 04:15:16 +0000 | [diff] [blame] | 59 | { |
| 60 | #if defined(VGO_linux) |
florian | f897b99 | 2011-07-31 03:22:45 +0000 | [diff] [blame] | 61 | if ( 0 == strcmp( OS, "linux" ) && matches_version( min_version )) return True; |
njn | 61485ab | 2009-03-04 04:15:16 +0000 | [diff] [blame] | 62 | |
njn | f76d27a | 2009-05-28 01:53:07 +0000 | [diff] [blame] | 63 | #elif defined(VGO_darwin) |
| 64 | if ( 0 == strcmp( OS, "darwin" ) ) return True; |
njn | 61485ab | 2009-03-04 04:15:16 +0000 | [diff] [blame] | 65 | |
sewardj | 8eb8bab | 2015-07-21 14:44:28 +0000 | [diff] [blame] | 66 | #elif defined(VGO_solaris) |
| 67 | if ( 0 == strcmp( OS, "solaris" ) ) return True; |
| 68 | |
njn | 61485ab | 2009-03-04 04:15:16 +0000 | [diff] [blame] | 69 | #else |
| 70 | # error Unknown OS |
| 71 | #endif // VGO_* |
| 72 | |
| 73 | return False; |
| 74 | } |
| 75 | |
| 76 | //--------------------------------------------------------------------------- |
| 77 | // main |
| 78 | //--------------------------------------------------------------------------- |
| 79 | int main(int argc, char **argv) |
| 80 | { |
| 81 | int i; |
florian | f897b99 | 2011-07-31 03:22:45 +0000 | [diff] [blame] | 82 | if ( argc < 2 ) { |
| 83 | fprintf( stderr, "usage: os_test <OS-type> [<min-version>]\n" ); |
njn | 61485ab | 2009-03-04 04:15:16 +0000 | [diff] [blame] | 84 | exit(3); // Usage error. |
| 85 | } |
florian | f897b99 | 2011-07-31 03:22:45 +0000 | [diff] [blame] | 86 | if (go( argv[1], argv[2] )) { |
njn | 61485ab | 2009-03-04 04:15:16 +0000 | [diff] [blame] | 87 | return 0; // Matched. |
| 88 | } |
| 89 | for (i = 0; NULL != all_OSes[i]; i++) { |
| 90 | if ( 0 == strcmp( argv[1], all_OSes[i] ) ) |
| 91 | return 1; // Didn't match, but named another OS. |
| 92 | } |
| 93 | return 2; // Didn't match any OSes. |
| 94 | } |
| 95 | |