X-Git-Url: https://git.distorted.org.uk/u/mdw/putty/blobdiff_plain/713b8b7a02c4385426cc06071142c50d042dd16b..0c4b77992e89ec742c9a938395ddaf979b2747e0:/mac/mac.c diff --git a/mac/mac.c b/mac/mac.c index 54ed35ca..21a2f010 100644 --- a/mac/mac.c +++ b/mac/mac.c @@ -1,4 +1,4 @@ -/* $Id: mac.c,v 1.9 2002/12/29 19:14:56 ben Exp $ */ +/* $Id: mac.c,v 1.20 2003/01/08 22:46:12 ben Exp $ */ /* * Copyright (c) 1999 Ben Harris * All rights reserved. @@ -40,6 +40,7 @@ #include #include #include +#include #include #include #include @@ -56,10 +57,13 @@ #include "macresid.h" #include "putty.h" +#include "ssh.h" #include "mac.h" QDGlobals qd; +Session *sesslist; + static int cold = 1; struct mac_gestalts mac_gestalts; @@ -83,7 +87,7 @@ static void mac_adjustmenus(void); static void mac_closewindow(WindowPtr); static void mac_zoomwindow(WindowPtr, short); static void mac_shutdown(void); -#pragma noreturn (mac_shutdown) +#pragma noreturn (cleanup_exit) struct mac_windows { WindowPtr about; @@ -117,14 +121,13 @@ static void mac_startup(void) { /* Init TextEdit */ TEInit(); /* Init Dialog Manager */ - InitDialogs(nil); + InitDialogs(NULL); cold = 0; /* Get base system version (only used if there's no better selector) */ if (Gestalt(gestaltSystemVersion, &mac_gestalts.sysvers) != noErr || - (mac_gestalts.sysvers & 0xffff) < 0x700) + (mac_gestalts.sysvers &= 0xffff) < 0x700) fatalbox("PuTTY requires System 7 or newer"); - mac_gestalts.sysvers &= 0xffff; /* Find out if we've got Color Quickdraw */ if (Gestalt(gestaltQuickdrawVersion, &mac_gestalts.qdvers) != noErr) mac_gestalts.qdvers = gestaltOriginalQD; @@ -139,12 +142,19 @@ static void mac_startup(void) { if (&RegisterAppearanceClient == kUnresolvedCFragSymbolAddress) mac_gestalts.apprvers = 0; #endif +#if TARGET_CPU_68K + mac_gestalts.cntlattr = 0; + mac_gestalts.windattr = 0; +#else /* Mac OS 8.5 Control Manager (proportional scrollbars)? */ - if (Gestalt(gestaltControlMgrAttr, &mac_gestalts.cntlattr) != noErr) + if (Gestalt(gestaltControlMgrAttr, &mac_gestalts.cntlattr) != noErr || + &SetControlViewSize == kUnresolvedCFragSymbolAddress) mac_gestalts.cntlattr = 0; /* Mac OS 8.5 Window Manager? */ - if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr) + if (Gestalt(gestaltWindowMgrAttr, &mac_gestalts.windattr) != noErr || + &SetWindowContentColor == kUnresolvedCFragSymbolAddress) mac_gestalts.windattr = 0; +#endif /* Text Encoding Conversion Manager? */ if ( #if TARGET_RT_MAC_CFM @@ -156,9 +166,12 @@ static void mac_startup(void) { mac_gestalts.encvvers = 0; else { mac_gestalts.encvvers = (*ti)->tecVersion; + mac_gestalts.uncvattr = (*ti)->tecUnicodeConverterFeatures; DisposeHandle((Handle)ti); } + mactcp_init(); + /* We've been tested with the Appearance Manager */ if (mac_gestalts.apprvers != 0) RegisterAppearanceClient(); @@ -174,6 +187,29 @@ static void mac_startup(void) { windows.about = NULL; windows.licence = NULL; + default_protocol = DEFAULT_PROTOCOL; + default_port = DEFAULT_PORT; + flags = FLAG_INTERACTIVE; + + /* + * Really grotty hack to ensure that anything that looks at the + * global "cfg" variable gets something vaguely sensible. + * Obviously, nothing should actually be using it, but that will + * take a while to arrange. + */ + do_defaults(NULL, &cfg); + + { + short vol; + long dirid; + + /* Set the default directory for loading and saving settings. */ + /* XXX Should we create it? */ + if (get_session_dir(FALSE, &vol, &dirid) == noErr) { + LMSetSFSaveDisk(-vol); + LMSetCurDirStore(dirid); + } + } init_ucs(); } @@ -189,6 +225,8 @@ static void mac_eventloop(void) { mac_adjustcursor(cursrgn); if (gotevent) mac_event(&event); + mactcp_poll(); + mac_pollterm(); } DisposeRgn(cursrgn); } @@ -261,13 +299,16 @@ static void mac_contentclick(WindowPtr window, EventRecord *event) { mac_clickterm(window, event); break; case wAbout: - if (DialogSelect(event, &(DialogPtr)window, &item)) + if (DialogSelect(event, &window, &item)) switch (item) { case wiAboutLicence: mac_openlicence(); break; } break; + case wSettings: + mac_clickdlg(window, event); + break; } } @@ -288,6 +329,9 @@ static void mac_activatewindow(WindowPtr window, EventRecord *event) { case wTerminal: mac_activateterm(window, active); break; + case wSettings: + mac_activatedlg(window, event); + break; case wAbout: mac_activateabout(window, event); break; @@ -314,6 +358,7 @@ static void mac_updatewindow(WindowPtr window) { mac_updateterm(window); break; case wAbout: + case wSettings: BeginUpdate(window); UpdateDialog(window, window->visRgn); EndUpdate(window); @@ -351,6 +396,7 @@ static void mac_updatelicence(WindowPtr window) */ static int mac_windowtype(WindowPtr window) { int kind; + long refcon; if (window == NULL) return wNone; @@ -359,7 +405,11 @@ static int mac_windowtype(WindowPtr window) { return wDA; if (GetWVariant(window) == zoomDocProc) return wTerminal; - return GetWRefCon(window); + refcon = GetWRefCon(window); + if (refcon < 1024) + return refcon; + else + return wSettings; } /* @@ -413,11 +463,14 @@ static void mac_menucommand(long result) { case iNew: mac_newsession(); goto done; + case iOpen: + mac_opensession(); + goto done; case iClose: mac_closewindow(window); goto done; case iQuit: - mac_shutdown(); + cleanup_exit(0); goto done; } break; @@ -557,13 +610,15 @@ static void mac_adjustcursor(RgnHandle cursrgn) { } } -static void mac_shutdown(void) { +void cleanup_exit(int status) +{ #if !TARGET_RT_MAC_CFM if (mac_gestalts.encvvers != 0) TerminateUnicodeConverter(); #endif - exit(0); + mactcp_shutdown(); + exit(status); } void fatalbox(char *fmt, ...) { @@ -575,7 +630,7 @@ void fatalbox(char *fmt, ...) { stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); va_end(ap); ParamText(stuff, NULL, NULL, NULL); - StopAlert(128, nil); + StopAlert(128, NULL); exit(1); } @@ -588,10 +643,57 @@ void modalfatalbox(char *fmt, ...) { stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); va_end(ap); ParamText(stuff, NULL, NULL, NULL); - StopAlert(128, nil); + StopAlert(128, NULL); + exit(1); +} + +/* This should only kill the current session, not the whole application. */ +void connection_fatal(void *fontend, char *fmt, ...) { + va_list ap; + Str255 stuff; + + va_start(ap, fmt); + /* We'd like stuff to be a Pascal string */ + stuff[0] = vsprintf((char *)(&stuff[1]), fmt, ap); + va_end(ap); + ParamText(stuff, NULL, NULL, NULL); + StopAlert(128, NULL); exit(1); } +/* Null SSH agent client -- never finds an agent. */ + +int agent_exists(void) +{ + + return FALSE; +} + +void agent_query(void *in, int inlen, void **out, int *outlen) +{ + + *out = NULL; + *outlen = 0; +} + +/* Temporary null routines for testing. */ + +void verify_ssh_host_key(void *frontend, char *host, int port, char *keytype, + char *keystr, char *fingerprint) +{ + +} + +void askcipher(void *frontend, char *ciphername, int cs) +{ + +} + +void old_keyfile_warning(void) +{ + +} + /* * Local Variables: * c-file-style: "simon"