diff --git a/cmdgen.c b/cmdgen.c index 265e5adc..d6c1f721 100644 --- a/cmdgen.c +++ b/cmdgen.c @@ -129,7 +129,9 @@ void sk_cleanup(void) void showversion(void) { - printf("puttygen: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("puttygen: %s\n%s", ver, buildinfo_text); + sfree(buildinfo_text); } void usage(int standalone) diff --git a/misc.c b/misc.c index 7a7cc194..06baf8d6 100644 --- a/misc.c +++ b/misc.c @@ -1147,3 +1147,65 @@ int strendswith(const char *s, const char *t) size_t slen = strlen(s), tlen = strlen(t); return slen >= tlen && !strcmp(s + (slen - tlen), t); } + +char *buildinfo(const char *newline) +{ + strbuf *buf = strbuf_new(); + + strbuf_catf(buf, "Build platform: %d-bit %s", + (int)(CHAR_BIT * sizeof(void *)), + BUILDINFO_PLATFORM); + +#ifdef __clang_version__ + strbuf_catf(buf, "%sCompiler: clang %s", newline, __clang_version__); +#elif defined __GNUC__ && defined __VERSION__ + strbuf_catf(buf, "%sCompiler: gcc %s", newline, __VERSION__); +#elif defined _MSC_VER + strbuf_catf(buf, "%sCompiler: Visual Studio", newline); +#if _MSC_VER == 1900 + strbuf_catf(buf, " 2015 / MSVC++ 14.0"); +#elif _MSC_VER == 1800 + strbuf_catf(buf, " 2013 / MSVC++ 12.0"); +#elif _MSC_VER == 1700 + strbuf_catf(buf, " 2012 / MSVC++ 11.0"); +#elif _MSC_VER == 1600 + strbuf_catf(buf, " 2010 / MSVC++ 10.0"); +#elif _MSC_VER == 1500 + strbuf_catf(buf, " 2008 / MSVC++ 9.0"); +#elif _MSC_VER == 1400 + strbuf_catf(buf, " 2005 / MSVC++ 8.0"); +#elif _MSC_VER == 1310 + strbuf_catf(buf, " 2003 / MSVC++ 7.1"); +#else + strbuf_catf(buf, ", unrecognised version"); +#endif + strbuf_catf(buf, " (_MSC_VER=%d)", (int)_MSC_VER); +#endif + +#ifdef NO_SECURITY + strbuf_catf(buf, "%sBuild option: NO_SECURITY", newline); +#endif +#ifdef NO_SECUREZEROMEMORY + strbuf_catf(buf, "%sBuild option: NO_SECUREZEROMEMORY", newline); +#endif +#ifdef NO_IPV6 + strbuf_catf(buf, "%sBuild option: NO_IPV6", newline); +#endif +#ifdef NO_GSSAPI + strbuf_catf(buf, "%sBuild option: NO_GSSAPI", newline); +#endif +#ifdef STATIC_GSSAPI + strbuf_catf(buf, "%sBuild option: STATIC_GSSAPI", newline); +#endif +#ifdef UNPROTECT + strbuf_catf(buf, "%sBuild option: UNPROTECT", newline); +#endif +#ifdef FUZZING + strbuf_catf(buf, "%sBuild option: FUZZING", newline); +#endif +#ifdef DEBUG + strbuf_catf(buf, "%sBuild option: DEBUG", newline); +#endif + + return strbuf_to_str(buf); +} diff --git a/misc.h b/misc.h index 9ab21a0b..32e7bc32 100644 --- a/misc.h +++ b/misc.h @@ -118,6 +118,8 @@ int get_ssh_uint32(int *datalen, const void **data, unsigned *ret); * form, check if it equals an ordinary C zero-terminated string. */ int match_ssh_id(int stringlen, const void *string, const char *id); +char *buildinfo(const char *newline); + /* * Debugging functions. * diff --git a/pscp.c b/pscp.c index 9ea423fd..25a2a737 100644 --- a/pscp.c +++ b/pscp.c @@ -2263,7 +2263,9 @@ static void usage(void) void version(void) { - printf("pscp: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("pscp: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); cleanup_exit(1); } diff --git a/psftp.c b/psftp.c index d35b8fa3..513f202b 100644 --- a/psftp.c +++ b/psftp.c @@ -2665,7 +2665,9 @@ static void usage(void) static void version(void) { - printf("psftp: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("psftp: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); cleanup_exit(1); } diff --git a/unix/gtkdlg.c b/unix/gtkdlg.c index 34773137..4eb4b010 100644 --- a/unix/gtkdlg.c +++ b/unix/gtkdlg.c @@ -3701,9 +3701,10 @@ void about_box(void *window) gtk_widget_show(w); { + char *buildinfo_text = buildinfo("\n"); char *label_text = dupprintf - ("%s\n\n%s\n\n%s", - appname, ver, + ("%s\n\n%s\n\n%s\n\n%s", + appname, ver, buildinfo_text, "Copyright " SHORT_COPYRIGHT_DETAILS ". All rights reserved"); w = gtk_label_new(label_text); gtk_label_set_justify(GTK_LABEL(w), GTK_JUSTIFY_CENTER); diff --git a/unix/gtkmain.c b/unix/gtkmain.c index a7b4a4e9..c681b93d 100644 --- a/unix/gtkmain.c +++ b/unix/gtkmain.c @@ -287,10 +287,13 @@ static void help(FILE *fp) { } static void version(FILE *fp) { - if(fprintf(fp, "%s: %s\n", appname, ver) < 0 || fflush(fp) < 0) { + char *buildinfo_text = buildinfo("\n"); + if(fprintf(fp, "%s: %s\n%s\n", appname, ver, buildinfo_text) < 0 || + fflush(fp) < 0) { perror("output error"); exit(1); } + sfree(buildinfo_text); } static struct gui_data *the_inst; diff --git a/unix/unix.h b/unix/unix.h index 029d32ff..76ec7531 100644 --- a/unix/unix.h +++ b/unix/unix.h @@ -30,6 +30,17 @@ #define META_MANUAL_MASK (GDK_MOD1_MASK) #define JUST_USE_GTK_CLIPBOARD_UTF8 /* low-level gdk_selection_* fails */ #define DEFAULT_CLIPBOARD GDK_SELECTION_CLIPBOARD /* OS X has no PRIMARY */ + +#define BUILDINFO_PLATFORM "OS X (GTK)" + +#elif defined NOT_X_WINDOWS + +#define BUILDINFO_PLATFORM "Unix (pure GTK)" + +#else + +#define BUILDINFO_PLATFORM "Unix (GTK + X11)" + #endif struct Filename { diff --git a/unix/uxpgnt.c b/unix/uxpgnt.c index 4f3dde2d..14f1366c 100644 --- a/unix/uxpgnt.c +++ b/unix/uxpgnt.c @@ -141,7 +141,9 @@ static void usage(void) static void version(void) { - printf("pageant: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("pageant: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); exit(1); } diff --git a/unix/uxplink.c b/unix/uxplink.c index 82693ba8..bf55ea73 100644 --- a/unix/uxplink.c +++ b/unix/uxplink.c @@ -594,7 +594,9 @@ static void usage(void) static void version(void) { - printf("plink: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("plink: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); exit(1); } diff --git a/windows/pageant.rc b/windows/pageant.rc index 91432cc7..b1756a64 100644 --- a/windows/pageant.rc +++ b/windows/pageant.rc @@ -36,14 +36,14 @@ BEGIN END /* Accelerators used: cl */ -213 DIALOG DISCARDABLE 140, 40, 214, 74 +213 DIALOG DISCARDABLE 140, 40, 214, 90 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About Pageant" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Close", IDOK, 160, 56, 48, 14 - PUSHBUTTON "View &Licence", 101, 6, 56, 70, 14 - EDITTEXT 1000, 10, 6, 194, 48, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE + DEFPUSHBUTTON "&Close", IDOK, 160, 72, 48, 14 + PUSHBUTTON "View &Licence", 101, 6, 72, 70, 14 + EDITTEXT 1000, 10, 6, 194, 64, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE END /* No accelerators used */ diff --git a/windows/puttygen.rc b/windows/puttygen.rc index 5c61ee7d..cd4072ea 100644 --- a/windows/puttygen.rc +++ b/windows/puttygen.rc @@ -29,14 +29,14 @@ BEGIN END /* Accelerators used: cl */ -213 DIALOG DISCARDABLE 140, 40, 214, 74 +213 DIALOG DISCARDABLE 140, 40, 214, 90 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About PuTTYgen" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Close", IDOK, 160, 56, 48, 14 - PUSHBUTTON "View &Licence", 101, 6, 56, 70, 14 - EDITTEXT 1000, 10, 6, 194, 48, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE + DEFPUSHBUTTON "&Close", IDOK, 160, 72, 48, 14 + PUSHBUTTON "View &Licence", 101, 6, 72, 70, 14 + EDITTEXT 1000, 10, 6, 194, 64, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE END /* No accelerators used */ diff --git a/windows/win_res.rc2 b/windows/win_res.rc2 index 28e66320..92d39cd5 100644 --- a/windows/win_res.rc2 +++ b/windows/win_res.rc2 @@ -16,15 +16,15 @@ IDI_MAINICON ICON "putty.ico" IDI_CFGICON ICON "puttycfg.ico" /* Accelerators used: clw */ -IDD_ABOUTBOX DIALOG DISCARDABLE 140, 40, 214, 74 +IDD_ABOUTBOX DIALOG DISCARDABLE 140, 40, 270, 106 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "About PuTTY" FONT 8, "MS Shell Dlg" BEGIN - DEFPUSHBUTTON "&Close", IDOK, 160, 56, 48, 14 - PUSHBUTTON "View &Licence", IDA_LICENCE, 6, 56, 70, 14 - PUSHBUTTON "Visit &Web Site", IDA_WEB, 84, 56, 70, 14 - EDITTEXT IDA_TEXT, 10, 6, 194, 48, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE + DEFPUSHBUTTON "&Close", IDOK, 216, 88, 48, 14 + PUSHBUTTON "View &Licence", IDA_LICENCE, 6, 88, 70, 14 + PUSHBUTTON "Visit &Web Site", IDA_WEB, 140, 88, 70, 14 + EDITTEXT IDA_TEXT, 10, 6, 250, 80, ES_READONLY | ES_MULTILINE | ES_CENTER, WS_EX_STATICEDGE END /* Accelerators used: aco */ diff --git a/windows/windlg.c b/windows/windlg.c index 17327866..e29f1291 100644 --- a/windows/windlg.c +++ b/windows/windlg.c @@ -200,10 +200,12 @@ static INT_PTR CALLBACK AboutProc(HWND hwnd, UINT msg, SetWindowText(hwnd, str); sfree(str); { + char *buildinfo_text = buildinfo("\r\n"); char *text = dupprintf - ("%s\r\n\r\n%s\r\n\r\n%s", - appname, ver, + ("%s\r\n\r\n%s\r\n\r\n%s\r\n\r\n%s", + appname, ver, buildinfo_text, "\251 " SHORT_COPYRIGHT_DETAILS ". All rights reserved."); + sfree(buildinfo_text); SetDlgItemText(hwnd, IDA_TEXT, text); sfree(text); } diff --git a/windows/winpgen.c b/windows/winpgen.c index 8468f805..4dd8272a 100644 --- a/windows/winpgen.c +++ b/windows/winpgen.c @@ -297,10 +297,12 @@ static INT_PTR CALLBACK AboutProc(HWND hwnd, UINT msg, } { + char *buildinfo_text = buildinfo("\r\n"); char *text = dupprintf - ("PuTTYgen\r\n\r\n%s\r\n\r\n%s", - ver, + ("PuTTYgen\r\n\r\n%s\r\n\r\n%s\r\n\r\n%s", + ver, buildinfo_text, "\251 " SHORT_COPYRIGHT_DETAILS ". All rights reserved."); + sfree(buildinfo_text); SetDlgItemText(hwnd, 1000, text); sfree(text); } diff --git a/windows/winpgnt.c b/windows/winpgnt.c index 06c5fac1..604d092f 100644 --- a/windows/winpgnt.c +++ b/windows/winpgnt.c @@ -152,10 +152,12 @@ static INT_PTR CALLBACK AboutProc(HWND hwnd, UINT msg, switch (msg) { case WM_INITDIALOG: { + char *buildinfo_text = buildinfo("\r\n"); char *text = dupprintf - ("Pageant\r\n\r\n%s\r\n\r\n%s", - ver, + ("Pageant\r\n\r\n%s\r\n\r\n%s\r\n\r\n%s", + ver, buildinfo_text, "\251 " SHORT_COPYRIGHT_DETAILS ". All rights reserved."); + sfree(buildinfo_text); SetDlgItemText(hwnd, 1000, text); sfree(text); } diff --git a/windows/winplink.c b/windows/winplink.c index 3b20a0ab..d916104e 100644 --- a/windows/winplink.c +++ b/windows/winplink.c @@ -223,7 +223,9 @@ static void usage(void) static void version(void) { - printf("plink: %s\n", ver); + char *buildinfo_text = buildinfo("\n"); + printf("plink: %s\n%s\n", ver, buildinfo_text); + sfree(buildinfo_text); exit(1); } diff --git a/windows/winstuff.h b/windows/winstuff.h index b9602243..9829f087 100644 --- a/windows/winstuff.h +++ b/windows/winstuff.h @@ -27,6 +27,8 @@ #include "winhelp.h" +#define BUILDINFO_PLATFORM "Windows" + struct Filename { char *path; };