| 1 | /************************************************* |
| 2 | * Exim - an Internet mail transport agent * |
| 3 | *************************************************/ |
| 4 | |
| 5 | /* Copyright (c) University of Cambridge 1995 - 2009 */ |
| 6 | /* Copyright (c) The Exim Maintainers 2010 - 2018 */ |
| 7 | /* See the file NOTICE for conditions of use and distribution. */ |
| 8 | |
| 9 | /* Function for setting up the version string. */ |
| 10 | |
| 11 | #include "exim.h" |
| 12 | |
| 13 | #include "version.h" |
| 14 | |
| 15 | |
| 16 | /* The header file cnumber.h contains a single line containing the |
| 17 | compilation number, making it easy to have it updated automatically. |
| 18 | Hence the fudgery below to get the number turned into a string, since |
| 19 | we can't use #include inside a macro argument list */ |
| 20 | |
| 21 | void |
| 22 | version_init(void) |
| 23 | { |
| 24 | static uschar cnumber_buffer[24]; |
| 25 | static uschar date_buffer[32]; |
| 26 | |
| 27 | uschar today[20]; |
| 28 | uschar *version_cnumber_format; |
| 29 | |
| 30 | int cnumber = |
| 31 | #include "cnumber.h" |
| 32 | ; |
| 33 | |
| 34 | /* The odd magic after each of these is so they can be easily found |
| 35 | for automatic patching to standard values when running regression tests. |
| 36 | The reason that version_cnumber_format isn't just written inline in the |
| 37 | sprintf() call is the gcc -Wall warns about a \0 in a format string. */ |
| 38 | |
| 39 | version_cnumber = cnumber_buffer; |
| 40 | version_cnumber_format = US"%d\0<<eximcnumber>>"; |
| 41 | sprintf(CS version_cnumber, CS version_cnumber_format, cnumber); |
| 42 | version_string = US EXIM_VERSION_STR "\0<<eximversion>>"; |
| 43 | |
| 44 | #ifdef EXIM_BUILD_DATE_OVERRIDE |
| 45 | /* Reproducible build support; build tooling should have given us something looking like |
| 46 | * "25-Feb-2017 20:15:40" in EXIM_BUILD_DATE_OVERRIDE based on $SOURCE_DATE_EPOCH in environ |
| 47 | * per <https://reproducible-builds.org/specs/source-date-epoch/> |
| 48 | */ |
| 49 | version_date = date_buffer; |
| 50 | version_date[0] = 0; |
| 51 | Ustrncat(version_date, EXIM_BUILD_DATE_OVERRIDE, sizeof(date_buffer)); |
| 52 | |
| 53 | #else |
| 54 | Ustrcpy(today, US __DATE__); |
| 55 | if (today[4] == ' ') today[4] = '0'; |
| 56 | today[3] = today[6] = '-'; |
| 57 | |
| 58 | version_date = date_buffer; |
| 59 | version_date[0] = 0; |
| 60 | Ustrncat(version_date, today+4, 3); |
| 61 | Ustrncat(version_date, today, 4); |
| 62 | Ustrncat(version_date, today+7, 4); |
| 63 | Ustrcat(version_date, US" "); |
| 64 | Ustrcat(version_date, US __TIME__); |
| 65 | #endif |
| 66 | } |
| 67 | |
| 68 | /* End of version.c */ |