mirror of https://github.com/cy384/ssheven.git
code cleanup and minor bug fixes
This commit is contained in:
parent
4785ea821a
commit
0b20b994a6
|
@ -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()
|
||||||
|
|
||||||
|
|
|
@ -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
123
ssheven.c
|
@ -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();
|
||||||
|
|
Loading…
Reference in New Issue