code cleanup and minor bug fixes

This commit is contained in:
cy384 2020-09-12 20:16:51 -04:00
parent 4785ea821a
commit 0b20b994a6
3 changed files with 58 additions and 84 deletions

View File

@ -2,19 +2,16 @@ cmake_minimum_required(VERSION 3.9)
add_application(ssheven CREATOR "SSH7" ssheven.c ssheven-console.c ssheven.r) add_application(ssheven CREATOR "SSH7" ssheven.c ssheven-console.c ssheven.r)
set_target_properties(ssheven PROPERTIES COMPILE_OPTIONS -ffunction-sections)
IF(CMAKE_SYSTEM_NAME MATCHES Retro68) IF(CMAKE_SYSTEM_NAME MATCHES Retro68)
# for 68k # for 68k
#enable this once we figure out the compiler bug issue # add "-mcpu=68020" once we figure out retro68 bug
#add_compile_options(-mcpu=68020) set_target_properties(ssheven PROPERTIES COMPILE_FLAGS "-ffunction-sections -O3 -Wall -Wextra -Wno-unused-parameter")
#add_compile_options(-O2 -flto)
set_target_properties(ssheven PROPERTIES LINK_FLAGS "-Wl,-gc-sections -Wl,--mac-segments -Wl,${CMAKE_CURRENT_SOURCE_DIR}/ssheven.segmap") set_target_properties(ssheven PROPERTIES LINK_FLAGS "-Wl,-gc-sections -Wl,--mac-segments -Wl,${CMAKE_CURRENT_SOURCE_DIR}/ssheven.segmap")
target_link_libraries(ssheven ssh2 mbedtls mbedx509 mbedcrypto OpenTransportApp OpenTransport OpenTptInet vterm) target_link_libraries(ssheven ssh2 mbedtls mbedx509 mbedcrypto OpenTransportApp OpenTransport OpenTptInet vterm retrocrt)
ELSE() ELSE()
# for PPC # for PPC
add_compile_options(-O2 -flto) set_target_properties(ssheven PROPERTIES COMPILE_FLAGS "-ffunction-sections -O3 -Wall -Wextra -Wno-unused-parameter")
set_target_properties(ssheven PROPERTIES LINK_FLAGS "-Wl,-gc-sections") set_target_properties(ssheven PROPERTIES LINK_FLAGS "-Wl,-gc-sections")
target_link_libraries(ssheven ThreadsLib ssh2 mbedtls mbedx509 mbedcrypto OpenTransportAppPPC OpenTransportLib OpenTptInternetLib vterm) target_link_libraries(ssheven ThreadsLib ssh2 mbedtls mbedx509 mbedcrypto OpenTransportAppPPC OpenTransportLib OpenTptInternetLib vterm retrocrt)
ENDIF() ENDIF()

View File

@ -61,7 +61,7 @@ void toggle_cursor(void)
void check_cursor(void) void check_cursor(void)
{ {
long int now = TickCount(); long unsigned int now = TickCount();
if ((now - con.last_cursor_blink) > GetCaretTime()) if ((now - con.last_cursor_blink) > GetCaretTime())
{ {
toggle_cursor(); toggle_cursor();
@ -246,7 +246,7 @@ void printf_i(const char* str, ...)
void set_window_title(WindowPtr w, const char* c_name) void set_window_title(WindowPtr w, const char* c_name)
{ {
Str255 pascal_name; Str255 pascal_name;
strncpy((char *) &pascal_name[1], c_name, 255); strncpy((char *) &pascal_name[1], c_name, 254);
pascal_name[0] = strlen(c_name); pascal_name[0] = strlen(c_name);
SetWTitle(w, pascal_name); SetWTitle(w, pascal_name);
@ -369,8 +369,6 @@ void console_setup(void)
SetPort(win); SetPort(win);
EraseRect(&portRect); EraseRect(&portRect);
int exit_main_loop = 0;
con.win = win; con.win = win;
con.cursor_x = 0; con.cursor_x = 0;

123
ssheven.c
View File

@ -40,24 +40,10 @@ pascal void ButtonFrameProc(DialogRef dlg, DialogItemIndex itemNo)
FrameRoundRect(&box, 16, 16); FrameRoundRect(&box, 16, 16);
} }
// event handler for a thread to yield when blocked
static pascal void yield_notifier(void* contextPtr, OTEventCode code, OTResult result, void* cookie)
{
switch (code)
{
case kOTSyncIdleEvent:
YieldToAnyThread();
break;
default:
break;
}
}
// read from the channel and print to console // read from the channel and print to console
void ssh_read(void) void ssh_read(void)
{ {
size_t rc = libssh2_channel_read(ssh_con.channel, ssh_con.recv_buffer, SSHEVEN_BUFFER_SIZE); ssize_t rc = libssh2_channel_read(ssh_con.channel, ssh_con.recv_buffer, SSHEVEN_BUFFER_SIZE);
if (rc == 0) return; if (rc == 0) return;
@ -72,7 +58,7 @@ void ssh_read(void)
} }
} }
int end_connection(void) void end_connection(void)
{ {
read_thread_state = CLEANUP; read_thread_state = CLEANUP;
@ -91,10 +77,9 @@ int end_connection(void)
if (ssh_con.endpoint != kOTInvalidEndpointRef) if (ssh_con.endpoint != kOTInvalidEndpointRef)
{ {
// request to close the TCP connection // request to close the TCP connection
//OT_CHECK(OTSndOrderlyDisconnect(ssh_con.endpoint));
OTSndOrderlyDisconnect(ssh_con.endpoint); OTSndOrderlyDisconnect(ssh_con.endpoint);
// get and discard remaining data so we can finish closing the connection // discard remaining data so we can finish closing the connection
int rc = 1; int rc = 1;
OTFlags ot_flags; OTFlags ot_flags;
while (rc != kOTLookErr) while (rc != kOTLookErr)
@ -120,16 +105,16 @@ int end_connection(void)
break; break;
default: default:
printf_i("unexpected OTLook result while closing: %s\r\n", OT_event_string(result)); printf_i("Unexpected OTLook result while closing: %s\r\n", OT_event_string(result));
break; break;
} }
// release endpoint // release endpoint
err = OTUnbind(ssh_con.endpoint); err = OTUnbind(ssh_con.endpoint);
if (err != noErr) printf_i("OTUnbind failed\r\n"); if (err != noErr) printf_i("OTUnbind failed.\r\n");
err = OTCloseProvider(ssh_con.endpoint); err = OTCloseProvider(ssh_con.endpoint);
if (err != noErr) printf_i("OTCloseProvider failed\r\n"); if (err != noErr) printf_i("OTCloseProvider failed.\r\n");
} }
read_thread_state = DONE; read_thread_state = DONE;
@ -197,10 +182,10 @@ void ssh_write(char* buf, size_t len)
if (read_thread_state == OPEN && read_thread_command != EXIT) if (read_thread_state == OPEN && read_thread_command != EXIT)
{ {
int r = libssh2_channel_write(ssh_con.channel, buf, len); int r = libssh2_channel_write(ssh_con.channel, buf, len);
if (r < 1) if (r < 1)
{ {
printf_i("failed to write to channel!\r\n"); printf_i("Failed to write to channel, closing connection.\r\n");
printf_i("closing connection!\r\n");
read_thread_command = EXIT; read_thread_command = EXIT;
} }
} }
@ -221,7 +206,7 @@ void ssh_paste(void)
DisposeHandle(buf); DisposeHandle(buf);
} }
/* returns 1 if quit selected, else 0 */ // returns 1 if quit selected, else 0
int process_menu_select(int32_t result) int process_menu_select(int32_t result)
{ {
int exit = 0; int exit = 0;
@ -267,7 +252,10 @@ void resize_con_window(WindowPtr eventWin, EventRecord event)
// bottom = max vertical // bottom = max vertical
// left = min horizontal // left = min horizontal
// right = max horizontal // right = max horizontal
Rect window_limits = { .top = con.cell_height*2 + 2, .bottom = con.cell_height*100 + 2, .left = con.cell_width*10 + 4, .right = con.cell_width*200 + 4 }; Rect window_limits = { .top = con.cell_height*2 + 2,
.bottom = con.cell_height*100 + 2,
.left = con.cell_width*10 + 4,
.right = con.cell_width*200 + 4 };
long growResult = GrowWindow(eventWin, event.where, &window_limits); long growResult = GrowWindow(eventWin, event.where, &window_limits);
@ -299,7 +287,7 @@ void event_loop(void)
WindowPtr eventWin; WindowPtr eventWin;
// maximum length of time to sleep (in ticks) // maximum length of time to sleep (in ticks)
// GetCaretTime gets the number of ticks between caret on/off time // GetCaretTime gets the number of ticks between system caret on/off time
long int sleep_time = GetCaretTime() / 4; long int sleep_time = GetCaretTime() / 4;
do do
@ -318,9 +306,9 @@ void event_loop(void)
// might need to toggle our cursor even if we got an event // might need to toggle our cursor even if we got an event
check_cursor(); check_cursor();
// handle any mac gui events // handle any GUI events
char c = 0; unsigned char c = 0;
int r = 0;
switch(event.what) switch(event.what)
{ {
case updateEvt: case updateEvt:
@ -409,16 +397,15 @@ int init_connection(char* hostname)
OSStatus err = noErr; OSStatus err = noErr;
TCall sndCall; TCall sndCall;
DNSAddress hostDNSAddress; DNSAddress hostDNSAddress;
OSStatus result;
printf_i("opening and configuring endpoint... "); YieldToAnyThread(); printf_i("Opening and configuring endpoint... "); YieldToAnyThread();
// open TCP endpoint // open TCP endpoint
ssh_con.endpoint = OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, nil, &err); ssh_con.endpoint = OTOpenEndpoint(OTCreateConfiguration(kTCPName), 0, nil, &err);
if (err != noErr || ssh_con.endpoint == kOTInvalidEndpointRef) if (err != noErr || ssh_con.endpoint == kOTInvalidEndpointRef)
{ {
printf_i("failed to open OT TCP endpoint\r\n"); printf_i("failed to open Open Transport TCP endpoint.\r\n");
return 0; return 0;
} }
@ -426,7 +413,6 @@ int init_connection(char* hostname)
OT_CHECK(OTSetBlocking(ssh_con.endpoint)); OT_CHECK(OTSetBlocking(ssh_con.endpoint));
OT_CHECK(OTUseSyncIdleEvents(ssh_con.endpoint, false)); OT_CHECK(OTUseSyncIdleEvents(ssh_con.endpoint, false));
OT_CHECK(OTBind(ssh_con.endpoint, nil, nil)); OT_CHECK(OTBind(ssh_con.endpoint, nil, nil));
OT_CHECK(OTSetNonBlocking(ssh_con.endpoint)); OT_CHECK(OTSetNonBlocking(ssh_con.endpoint));
@ -439,28 +425,28 @@ int init_connection(char* hostname)
sndCall.addr.buf = (UInt8 *) &hostDNSAddress; sndCall.addr.buf = (UInt8 *) &hostDNSAddress;
sndCall.addr.len = OTInitDNSAddress(&hostDNSAddress, (char *) hostname); sndCall.addr.len = OTInitDNSAddress(&hostDNSAddress, (char *) hostname);
printf_i("connecting endpoint... "); YieldToAnyThread(); printf_i("Connecting endpoint... "); YieldToAnyThread();
OT_CHECK(OTConnect(ssh_con.endpoint, &sndCall, nil)); OT_CHECK(OTConnect(ssh_con.endpoint, &sndCall, nil));
printf_i("done.\r\n"); YieldToAnyThread(); printf_i("done.\r\n"); YieldToAnyThread();
printf_i("initializing SSH... "); YieldToAnyThread(); printf_i("Initializing SSH... "); YieldToAnyThread();
// init libssh2 // init libssh2
SSH_CHECK(libssh2_init(0)); SSH_CHECK(libssh2_init(0));
printf_i("done.\r\n"); YieldToAnyThread(); printf_i("done.\r\n"); YieldToAnyThread();
printf_i("opening SSH session... "); YieldToAnyThread(); printf_i("Opening SSH session... "); YieldToAnyThread();
ssh_con.session = libssh2_session_init(); ssh_con.session = libssh2_session_init();
if (ssh_con.session == 0) if (ssh_con.session == 0)
{ {
printf_i("failed to initialize SSH library\r\n"); printf_i("failed to initialize SSH session.\r\n");
return 0; return 0;
} }
printf_i("done.\r\n"); YieldToAnyThread(); printf_i("done.\r\n"); YieldToAnyThread();
long s = TickCount(); long s = TickCount();
printf_i("beginning SSH session handshake... "); YieldToAnyThread(); printf_i("Beginning SSH session handshake... "); YieldToAnyThread();
SSH_CHECK(libssh2_session_handshake(ssh_con.session, ssh_con.endpoint)); SSH_CHECK(libssh2_session_handshake(ssh_con.session, ssh_con.endpoint));
printf_i("done. (%d ticks)\r\n", TickCount() - s); YieldToAnyThread(); printf_i("done. (%d ticks)\r\n", TickCount() - s); YieldToAnyThread();
@ -472,7 +458,6 @@ int init_connection(char* hostname)
int ssh_password_auth(char* username, char* password) int ssh_password_auth(char* username, char* password)
{ {
OSStatus err = noErr;
int rc = 1; int rc = 1;
SSH_CHECK(libssh2_userauth_password(ssh_con.session, username, password)); SSH_CHECK(libssh2_userauth_password(ssh_con.session, username, password));
@ -496,7 +481,7 @@ pascal Boolean TwoItemFilter(DialogPtr dlog, EventRecord *event, short *itemHit)
{ {
DialogPtr evtDlog; DialogPtr evtDlog;
short selStart, selEnd; short selStart, selEnd;
long ticks; long unsigned ticks;
Handle itemH; Handle itemH;
DialogItemType type; DialogItemType type;
Rect box; Rect box;
@ -534,6 +519,7 @@ pascal Boolean TwoItemFilter(DialogPtr dlog, EventRecord *event, short *itemHit)
*itemHit = 6; *itemHit = 6;
return true; return true;
} }
break;
case kLeftArrowCharCode: case kLeftArrowCharCode:
case kRightArrowCharCode: case kRightArrowCharCode:
@ -563,6 +549,7 @@ pascal Boolean TwoItemFilter(DialogPtr dlog, EventRecord *event, short *itemHit)
// 1 for ok, 0 for cancel // 1 for ok, 0 for cancel
int password_dialog(void) int password_dialog(void)
{ {
int ret = 1;
// n.b. dialog strings can't be longer than this, so no overflow risk // n.b. dialog strings can't be longer than this, so no overflow risk
//static char password[256]; //static char password[256];
DialogPtr dlog; DialogPtr dlog;
@ -581,15 +568,15 @@ int password_dialog(void)
ModalDialog(NewModalFilterUPP(TwoItemFilter), &item); ModalDialog(NewModalFilterUPP(TwoItemFilter), &item);
} while (item != 1 && item != 6); // until OK or cancel } while (item != 1 && item != 6); // until OK or cancel
if (6 == item) return 0; if (6 == item) ret = 0;
// read out of the hidden text box // read out of the hidden text box
GetDialogItem(dlog, 5, &type, &itemH, &box); GetDialogItem(dlog, 5, &type, &itemH, &box);
GetDialogItemText(itemH, password); GetDialogItemText(itemH, (unsigned char*)password);
DisposeDialog(dlog); DisposeDialog(dlog);
return 1; return ret;
} }
int intro_dialog(char* hostname, char* username, char* password) int intro_dialog(char* hostname, char* username, char* password)
@ -609,7 +596,7 @@ int intro_dialog(char* hostname, char* username, char* password)
// draw default button indicator around the connect button // draw default button indicator around the connect button
GetDialogItem(dlg, 2, &type, &itemH, &box); GetDialogItem(dlg, 2, &type, &itemH, &box);
SetDialogItem(dlg, 2, type, (Handle) NewUserItemUPP(&ButtonFrameProc), &box); SetDialogItem(dlg, 2, type, (Handle)NewUserItemUPP(&ButtonFrameProc), &box);
// get the handles for each of the text boxes // get the handles for each of the text boxes
ControlHandle address_text_box; ControlHandle address_text_box;
@ -632,11 +619,11 @@ int intro_dialog(char* hostname, char* username, char* password)
} while(item != 1 && item != 8); } while(item != 1 && item != 8);
// copy the text out of the boxes // copy the text out of the boxes
GetDialogItemText((Handle)address_text_box, hostname); GetDialogItemText((Handle)address_text_box, (unsigned char *)hostname);
GetDialogItemText((Handle)username_text_box, username); GetDialogItemText((Handle)username_text_box, (unsigned char *)username);
// splice the port number onto the hostname (n.b. they're pascal strings) // splice the port number onto the hostname (n.b. they're pascal strings)
GetDialogItemText((Handle)port_text_box, hostname+hostname[0]+1); GetDialogItemText((Handle)port_text_box, (unsigned char *)hostname+hostname[0]+1);
hostname[hostname[0]+1] = ':'; hostname[hostname[0]+1] = ':';
// clean it up // clean it up
@ -644,15 +631,11 @@ int intro_dialog(char* hostname, char* username, char* password)
FlushEvents(everyEvent, -1); FlushEvents(everyEvent, -1);
// if we hit cancel, 0 // if we hit cancel, 0
if (item == 7) return 0; if (item == 8) return 0;
return password_dialog(); return password_dialog();
} }
//enum { WAIT, READ, EXIT } read_thread_command = WAIT;
//enum { UNITIALIZED, OPEN, CLEANUP, DONE } read_thread_state = UNITIALIZED;
// TODO: threads
void* read_thread(void* arg) void* read_thread(void* arg)
{ {
int ok = 1; int ok = 1;
@ -870,14 +853,15 @@ int main(int argc, char** argv)
draw_screen(&(con.win->portRect)); draw_screen(&(con.win->portRect));
EndUpdate(con.win); EndUpdate(con.win);
if (!intro_dialog(hostname, username, password)) ok = 0; ok = intro_dialog(hostname, username, password);
if (!ok) printf_i("Cancelled, not connecting.\r\n"); if (!ok) printf_i("Cancelled, not connecting.\r\n");
if (ok) if (ok)
{ {
if (InitOpenTransport() != noErr) if (InitOpenTransport() != noErr)
{ {
printf_i("failed to initialize OT\r\n"); printf_i("Failed to initialize Open Transport.\r\n");
ok = 0; ok = 0;
} }
} }
@ -889,14 +873,13 @@ int main(int argc, char** argv)
if (ssh_con.recv_buffer == NULL || ssh_con.send_buffer == NULL) if (ssh_con.recv_buffer == NULL || ssh_con.send_buffer == NULL)
{ {
printf_i("failed to allocate network buffers\r\n"); printf_i("Failed to allocate network data buffers.\r\n");
ok = 0; ok = 0;
} }
} }
// create the network read/print thread // create the network read/print thread
read_thread_command = WAIT; read_thread_command = WAIT;
int read_thread_result = 0;
ThreadID read_thread_id = 0; ThreadID read_thread_id = 0;
if (ok) if (ok)
@ -905,8 +888,8 @@ int main(int argc, char** argv)
if (err < 0) if (err < 0)
{ {
printf_i("Failed to create network read thread.\r\n");
ok = 0; ok = 0;
printf_i("failed to create network read thread\r\n");
} }
} }
@ -914,24 +897,20 @@ int main(int argc, char** argv)
if (ok) read_thread_command = READ; if (ok) read_thread_command = READ;
// procede into our main event loop // procede into our main event loop
if (ok) event_loop(); event_loop();
// tell the read thread to quit, then let it run to actually do so // tell the read thread to finish, then let it run to actually do so
read_thread_command = EXIT; read_thread_command = EXIT;
if (read_thread_state != UNINTIALIZED) if (read_thread_state != UNINTIALIZED)
while (read_thread_state != DONE)
YieldToAnyThread();
//OTCancelSynchronousCalls(ssh_con.endpoint, kOTCanceledErr);
//YieldToThread(read_thread_id);
// err = DisposeThread(read_thread_id, (void*)&read_thread_result, 0);
//err = DisposeThread(read_thread_id, NULL, 0);
if (ok)
{ {
BeginUpdate(con.win); while (read_thread_state != DONE)
draw_screen(&(con.win->portRect)); {
EndUpdate(con.win); BeginUpdate(con.win);
draw_screen(&(con.win->portRect));
EndUpdate(con.win);
YieldToAnyThread();
}
} }
if (ssh_con.recv_buffer != NULL) OTFreeMem(ssh_con.recv_buffer); if (ssh_con.recv_buffer != NULL) OTFreeMem(ssh_con.recv_buffer);
@ -939,7 +918,7 @@ int main(int argc, char** argv)
if (con.vterm != NULL) vterm_free(con.vterm); if (con.vterm != NULL) vterm_free(con.vterm);
if (ok) if (ssh_con.endpoint != kOTInvalidEndpointRef)
{ {
err = OTCancelSynchronousCalls(ssh_con.endpoint, kOTCanceledErr); err = OTCancelSynchronousCalls(ssh_con.endpoint, kOTCanceledErr);
CloseOpenTransport(); CloseOpenTransport();