X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/b0e15bb5ce898143d473202aad9c2cf53e9b5876..ec5da3100dcef76794f5ef028f0f822f509bb832:/macosx/osxmain.m diff --git a/macosx/osxmain.m b/macosx/osxmain.m index bd579852..362f92bd 100644 --- a/macosx/osxmain.m +++ b/macosx/osxmain.m @@ -60,28 +60,47 @@ char *x_get_default(const char *key) return NULL; /* this is a stub */ } -void modalfatalbox(char *p, ...) +static void commonfatalbox(char *p, va_list ap) +{ + char errorbuf[2048]; + NSAlert *alert; + + /* + * We may have come here because we ran out of memory, in which + * case it's entirely likely that that further memory + * allocations will fail. So (a) we use vsnprintf to format the + * error message rather than the usual dupvprintf; and (b) we + * have a fallback way to get the message out via stderr if + * even creating an NSAlert fails. + */ + vsnprintf(errorbuf, lenof(errorbuf), p, ap); + + alert = [NSAlert alloc]; + if (!alert) { + fprintf(stderr, "fatal error (and NSAlert failed): %s\n", errorbuf); + } else { + alert = [[alert init] autorelease]; + [alert addButtonWithTitle:@"Terminate"]; + [alert setInformativeText:[NSString stringWithCString:errorbuf]]; + [alert runModal]; + } + exit(1); +} + +void fatalbox(char *p, ...) { - /* FIXME: proper OS X GUI stuff */ va_list ap; - fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); - vfprintf(stderr, p, ap); + commonfatalbox(p, ap); va_end(ap); - fputc('\n', stderr); - exit(1); } -void fatalbox(char *p, ...) +void modalfatalbox(char *p, ...) { - /* FIXME: proper OS X GUI stuff */ va_list ap; - fprintf(stderr, "FATAL ERROR: "); va_start(ap, p); - vfprintf(stderr, p, ap); + commonfatalbox(p, ap); va_end(ap); - fputc('\n', stderr); - exit(1); } void cmdline_error(char *p, ...)