diff --git a/ssheven-debug.h b/ssheven-debug.h new file mode 100644 index 0000000..e87daf4 --- /dev/null +++ b/ssheven-debug.h @@ -0,0 +1,192 @@ +// handy debugging string conversions + +// convert libssh2 errors into strings +const char* libssh2_error_string(int i) +{ + switch (i) + { + case LIBSSH2_ERROR_NONE: + return "no error (LIBSSH2_ERROR_NONE)"; + case LIBSSH2_ERROR_BANNER_RECV: + return "LIBSSH2_ERROR_BANNER_RECV"; + case LIBSSH2_ERROR_BANNER_SEND: + return "LIBSSH2_ERROR_BANNER_SEND"; + case LIBSSH2_ERROR_INVALID_MAC: + return "LIBSSH2_ERROR_INVALID_MAC"; + case LIBSSH2_ERROR_KEX_FAILURE: + return "LIBSSH2_ERROR_KEX_FAILURE"; + case LIBSSH2_ERROR_ALLOC: + return "LIBSSH2_ERROR_ALLOC"; + case LIBSSH2_ERROR_SOCKET_SEND: + return "LIBSSH2_ERROR_SOCKET_SEND"; + case LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE: + return "LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE"; + case LIBSSH2_ERROR_TIMEOUT: + return "LIBSSH2_ERROR_TIMEOUT"; + case LIBSSH2_ERROR_HOSTKEY_INIT: + return "LIBSSH2_ERROR_HOSTKEY_INIT"; + case LIBSSH2_ERROR_HOSTKEY_SIGN: + return "LIBSSH2_ERROR_HOSTKEY_SIGN"; + case LIBSSH2_ERROR_DECRYPT: + return "LIBSSH2_ERROR_DECRYPT"; + case LIBSSH2_ERROR_SOCKET_DISCONNECT: + return "LIBSSH2_ERROR_SOCKET_DISCONNECT"; + case LIBSSH2_ERROR_PROTO: + return "LIBSSH2_ERROR_PROTO"; + case LIBSSH2_ERROR_PASSWORD_EXPIRED: + return "LIBSSH2_ERROR_PASSWORD_EXPIRED"; + case LIBSSH2_ERROR_FILE: + return "LIBSSH2_ERROR_FILE"; + case LIBSSH2_ERROR_METHOD_NONE: + return "LIBSSH2_ERROR_METHOD_NONE"; + case LIBSSH2_ERROR_AUTHENTICATION_FAILED: + return "LIBSSHLIBSSH2_ERROR_AUTHENTICATION_FAILED2_ERROR_NONE"; + case LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED: + return "LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED"; + case LIBSSH2_ERROR_CHANNEL_OUTOFORDER: + return "LIBSSH2_ERROR_CHANNEL_OUTOFORDER"; + case LIBSSH2_ERROR_CHANNEL_FAILURE: + return "LIBSSH2_ERROR_CHANNEL_FAILURE"; + case LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED: + return "LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED"; + case LIBSSH2_ERROR_CHANNEL_UNKNOWN: + return "LIBSSH2_ERROR_CHANNEL_UNKNOWN"; + case LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED: + return "LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED"; + case LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED: + return "LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED"; + case LIBSSH2_ERROR_CHANNEL_CLOSED: + return "LIBSSH2_ERROR_CHANNEL_CLOSED"; + case LIBSSH2_ERROR_CHANNEL_EOF_SENT: + return "LIBSSH2_ERROR_CHANNEL_EOF_SENT"; + case LIBSSH2_ERROR_SCP_PROTOCOL: + return "LIBSSH2_ERROR_SCP_PROTOCOL"; + case LIBSSH2_ERROR_ZLIB: + return "LIBSSH2_ERROR_ZLIB"; + case LIBSSH2_ERROR_SOCKET_TIMEOUT: + return "LIBSSH2_ERROR_SOCKET_TIMEOUT"; + case LIBSSH2_ERROR_SFTP_PROTOCOL: + return "LIBSSH2_ERROR_SFTP_PROTOCOL"; + case LIBSSH2_ERROR_REQUEST_DENIED: + return "LIBSSH2_ERROR_REQUEST_DENIED"; + case LIBSSH2_ERROR_METHOD_NOT_SUPPORTED: + return "LIBSSH2_ERROR_METHOD_NOT_SUPPORTED"; + case LIBSSH2_ERROR_INVAL: + return "LIBSSH2_ERROR_INVAL"; + case LIBSSH2_ERROR_INVALID_POLL_TYPE: + return "LIBSSH2_ERROR_INVALID_POLL_TYPE"; + case LIBSSH2_ERROR_PUBLICKEY_PROTOCOL: + return "LIBSSH2_ERROR_PUBLICKEY_PROTOCOL"; + case LIBSSH2_ERROR_EAGAIN: + return "LIBSSH2_ERROR_EAGAIN"; + case LIBSSH2_ERROR_BUFFER_TOO_SMALL: + return "LIBSSH2_ERROR_BUFFER_TOO_SMALL"; + case LIBSSH2_ERROR_BAD_USE: + return "LIBSSH2_ERROR_BAD_USE"; + case LIBSSH2_ERROR_COMPRESS: + return "LIBSSH2_ERROR_COMPRESS"; + case LIBSSH2_ERROR_OUT_OF_BOUNDARY: + return "LIBSSH2_ERROR_OUT_OF_BOUNDARY"; + case LIBSSH2_ERROR_AGENT_PROTOCOL: + return "LIBSSH2_ERROR_SOCKET_RECV"; + case LIBSSH2_ERROR_SOCKET_RECV: + return "LIBSSH2_ERROR_ENCRYPT"; + case LIBSSH2_ERROR_ENCRYPT: + return "LIBSSH2_ERROR_ENCRYPT"; + case LIBSSH2_ERROR_BAD_SOCKET: + return "LIBSSH2_ERROR_BAD_SOCKET"; + case LIBSSH2_ERROR_KNOWN_HOSTS: + return "LIBSSH2_ERROR_KNOWN_HOSTS"; + case LIBSSH2_ERROR_CHANNEL_WINDOW_FULL: + return "LIBSSH2_ERROR_CHANNEL_WINDOW_FULL"; + case LIBSSH2_ERROR_KEYFILE_AUTH_FAILED: + return "LIBSSH2_ERROR_KEYFILE_AUTH_FAILED"; + + default: + return "LIBSSH2 unknown error number"; + } + + return "libssh2_error_string should never return from here"; +} + +// convert OT event types into strings +const char* OT_event_string(int i) +{ + switch (i) + { + case T_LISTEN: + return "T_LISTEN"; + case T_CONNECT: + return "T_CONNECT"; + case T_DATA: + return "T_DATA"; + case T_EXDATA: + return "T_EXDATA"; + case T_DISCONNECT: + return "T_DISCONNECT"; + case T_ERROR: + return "T_ERROR"; + case T_UDERR: + return "T_UDERR"; + case T_ORDREL: + return "T_ORDREL"; + case T_GODATA: + return "T_GODATA"; + case T_GOEXDATA: + return "T_GOEXDATA"; + case T_REQUEST: + return "T_REQUEST"; + case T_REPLY: + return "T_REPLY"; + case T_PASSCON: + return "T_PASSCON"; + case T_RESET: + return "T_RESET"; + case T_BINDCOMPLETE: + return "T_BINDCOMPLETE"; + case T_UNBINDCOMPLETE: + return "T_UNBINDCOMPLETE"; + case T_ACCEPTCOMPLETE: + return "T_ACCEPTCOMPLETE"; + case T_REPLYCOMPLETE: + return "T_REPLYCOMPLETE"; + case T_DISCONNECTCOMPLETE: + return "T_DISCONNECTCOMPLETE"; + case T_OPTMGMTCOMPLETE: + return "T_OPTMGMTCOMPLETE"; + case T_OPENCOMPLETE: + return "T_OPENCOMPLETE"; + case T_GETPROTADDRCOMPLETE: + return "T_GETPROTADDRCOMPLETE"; + case T_RESOLVEADDRCOMPLETE: + return "T_RESOLVEADDRCOMPLETE"; + case T_GETINFOCOMPLETE: + return "T_GETINFOCOMPLETE"; + case T_SYNCCOMPLETE: + return "T_SYNCCOMPLETE"; + case T_MEMORYRELEASED: + return "T_MEMORYRELEASED"; + case T_REGNAMECOMPLETE: + return "T_REGNAMECOMPLETE"; + case T_DELNAMECOMPLETE: + return "T_DELNAMECOMPLETE"; + case T_LKUPNAMECOMPLETE: + return "T_LKUPNAMECOMPLETE"; + case T_LKUPNAMERESULT: + return "T_LKUPNAMERESULT"; + case kOTProviderIsDisconnected: + return "kOTProviderIsDisconnected"; + case kOTSyncIdleEvent: + return "kOTSyncIdleEvent"; + case kOTProviderIsReconnected: + return "kOTProviderIsReconnected"; + case kOTProviderWillClose: + return "kOTProviderWillClose"; + case kOTProviderIsClosed: + return "kOTProviderIsClosed"; + default: + return "unknown OT event type"; + } + + return "OTLook_string should never return from here"; +} diff --git a/ssheven.c b/ssheven.c index 2c93acc..37ae892 100644 --- a/ssheven.c +++ b/ssheven.c @@ -18,120 +18,17 @@ // libssh2 #include +// functions to convert error and status codes to strings +#include "ssheven-debug.h" + +#define SSHEVEN_VERSION "0.0.0" + // network buffer size enum { buffer_size = 4096 }; // text input buffer size enum { input_buffer_size = 128 }; -const char* libssh2_error_string(int i) -{ - switch (i) - { - case LIBSSH2_ERROR_NONE: - return "no error (LIBSSH2_ERROR_NONE)"; - case LIBSSH2_ERROR_BANNER_RECV: - return "LIBSSH2_ERROR_BANNER_RECV"; - case LIBSSH2_ERROR_BANNER_SEND: - return "LIBSSH2_ERROR_BANNER_SEND"; - case LIBSSH2_ERROR_INVALID_MAC: - return "LIBSSH2_ERROR_INVALID_MAC"; - case LIBSSH2_ERROR_KEX_FAILURE: - return "LIBSSH2_ERROR_KEX_FAILURE"; - case LIBSSH2_ERROR_ALLOC: - return "LIBSSH2_ERROR_ALLOC"; - case LIBSSH2_ERROR_SOCKET_SEND: - return "LIBSSH2_ERROR_SOCKET_SEND"; - case LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE: - return "LIBSSH2_ERROR_KEY_EXCHANGE_FAILURE"; - case LIBSSH2_ERROR_TIMEOUT: - return "LIBSSH2_ERROR_TIMEOUT"; - case LIBSSH2_ERROR_HOSTKEY_INIT: - return "LIBSSH2_ERROR_HOSTKEY_INIT"; - case LIBSSH2_ERROR_HOSTKEY_SIGN: - return "LIBSSH2_ERROR_HOSTKEY_SIGN"; - case LIBSSH2_ERROR_DECRYPT: - return "LIBSSH2_ERROR_DECRYPT"; - case LIBSSH2_ERROR_SOCKET_DISCONNECT: - return "LIBSSH2_ERROR_SOCKET_DISCONNECT"; - case LIBSSH2_ERROR_PROTO: - return "LIBSSH2_ERROR_PROTO"; - case LIBSSH2_ERROR_PASSWORD_EXPIRED: - return "LIBSSH2_ERROR_PASSWORD_EXPIRED"; - case LIBSSH2_ERROR_FILE: - return "LIBSSH2_ERROR_FILE"; - case LIBSSH2_ERROR_METHOD_NONE: - return "LIBSSH2_ERROR_METHOD_NONE"; - case LIBSSH2_ERROR_AUTHENTICATION_FAILED: - return "LIBSSHLIBSSH2_ERROR_AUTHENTICATION_FAILED2_ERROR_NONE"; - case LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED: - return "LIBSSH2_ERROR_PUBLICKEY_UNVERIFIED"; - case LIBSSH2_ERROR_CHANNEL_OUTOFORDER: - return "LIBSSH2_ERROR_CHANNEL_OUTOFORDER"; - case LIBSSH2_ERROR_CHANNEL_FAILURE: - return "LIBSSH2_ERROR_CHANNEL_FAILURE"; - case LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED: - return "LIBSSH2_ERROR_CHANNEL_REQUEST_DENIED"; - case LIBSSH2_ERROR_CHANNEL_UNKNOWN: - return "LIBSSH2_ERROR_CHANNEL_UNKNOWN"; - case LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED: - return "LIBSSH2_ERROR_CHANNEL_WINDOW_EXCEEDED"; - case LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED: - return "LIBSSH2_ERROR_CHANNEL_PACKET_EXCEEDED"; - case LIBSSH2_ERROR_CHANNEL_CLOSED: - return "LIBSSH2_ERROR_CHANNEL_CLOSED"; - case LIBSSH2_ERROR_CHANNEL_EOF_SENT: - return "LIBSSH2_ERROR_CHANNEL_EOF_SENT"; - case LIBSSH2_ERROR_SCP_PROTOCOL: - return "LIBSSH2_ERROR_SCP_PROTOCOL"; - case LIBSSH2_ERROR_ZLIB: - return "LIBSSH2_ERROR_ZLIB"; - case LIBSSH2_ERROR_SOCKET_TIMEOUT: - return "LIBSSH2_ERROR_SOCKET_TIMEOUT"; - case LIBSSH2_ERROR_SFTP_PROTOCOL: - return "LIBSSH2_ERROR_SFTP_PROTOCOL"; - case LIBSSH2_ERROR_REQUEST_DENIED: - return "LIBSSH2_ERROR_REQUEST_DENIED"; - case LIBSSH2_ERROR_METHOD_NOT_SUPPORTED: - return "LIBSSH2_ERROR_METHOD_NOT_SUPPORTED"; - case LIBSSH2_ERROR_INVAL: - return "LIBSSH2_ERROR_INVAL"; - case LIBSSH2_ERROR_INVALID_POLL_TYPE: - return "LIBSSH2_ERROR_INVALID_POLL_TYPE"; - case LIBSSH2_ERROR_PUBLICKEY_PROTOCOL: - return "LIBSSH2_ERROR_PUBLICKEY_PROTOCOL"; - case LIBSSH2_ERROR_EAGAIN: - return "LIBSSH2_ERROR_EAGAIN"; - case LIBSSH2_ERROR_BUFFER_TOO_SMALL: - return "LIBSSH2_ERROR_BUFFER_TOO_SMALL"; - case LIBSSH2_ERROR_BAD_USE: - return "LIBSSH2_ERROR_BAD_USE"; - case LIBSSH2_ERROR_COMPRESS: - return "LIBSSH2_ERROR_COMPRESS"; - case LIBSSH2_ERROR_OUT_OF_BOUNDARY: - return "LIBSSH2_ERROR_OUT_OF_BOUNDARY"; - case LIBSSH2_ERROR_AGENT_PROTOCOL: - return "LIBSSH2_ERROR_SOCKET_RECV"; - case LIBSSH2_ERROR_SOCKET_RECV: - return "LIBSSH2_ERROR_ENCRYPT"; - case LIBSSH2_ERROR_ENCRYPT: - return "LIBSSH2_ERROR_ENCRYPT"; - case LIBSSH2_ERROR_BAD_SOCKET: - return "LIBSSH2_ERROR_BAD_SOCKET"; - case LIBSSH2_ERROR_KNOWN_HOSTS: - return "LIBSSH2_ERROR_KNOWN_HOSTS"; - case LIBSSH2_ERROR_CHANNEL_WINDOW_FULL: - return "LIBSSH2_ERROR_CHANNEL_WINDOW_FULL"; - case LIBSSH2_ERROR_KEYFILE_AUTH_FAILED: - return "LIBSSH2_ERROR_KEYFILE_AUTH_FAILED"; - - default: - return "unknown error number"; - } - - return "should never return from here?"; -} - // event handler to yield whenever we're blocked static pascal void yield_notifier(void* contextPtr, OTEventCode code, OTResult result, void* cookie) { @@ -304,7 +201,7 @@ int main(int argc, char** argv) printf("WARNING: this is a prototype with a bad RNG and no host key checks," " do not use over untrusted networks or with untrusted SSH servers!\n\n"); - printf("ssheven by cy384 version 0.0.0\n\n"); + printf("ssheven by cy384 version " SSHEVEN_VERSION "\n\n"); printf("enter a host:port >"); fflush(stdout); get_line(hostname);