mirror of https://github.com/wolfSSL/wolfssh.git
Echoserver Driver
1. Leave out the setup of the tcp_ready record when not using threading. 2. Don't change the echoserver directory when building for Integrity. 3. Change WEXIT to be a return(0) when building for Integrity. 4. The echoserver shouldn't call exit directly, it should save the return_code server args and then return to the caller. 5. When using forwarding, don't exit if the address is IPv6, return an error. 6. When exiting, close the listen file descriptor. 7. Reset myoptind to 0 before processing the options list.pull/474/head
parent
f0270d8920
commit
e5a1c38d86
|
@ -477,9 +477,11 @@ static int wolfSSH_FwdDefaultActions(WS_FwdCbAction action, void* vCtx,
|
|||
}
|
||||
else {
|
||||
printf("Not using IPv6 yet.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
ret = WS_FWD_SETUP_E;
|
||||
}
|
||||
}
|
||||
|
||||
if (ret == 0) {
|
||||
ret = bind(ctx->listenFd,
|
||||
(const struct sockaddr*)&addr, addrSz);
|
||||
}
|
||||
|
@ -1269,14 +1271,10 @@ static THREAD_RETURN WOLFSSH_THREAD server_worker(void* vArgs)
|
|||
ret = 0;
|
||||
break;
|
||||
|
||||
case WS_SFTP_COMPLETE:
|
||||
#ifdef WOLFSSH_SFTP
|
||||
case WS_SFTP_COMPLETE:
|
||||
ret = sftp_worker(threadCtx);
|
||||
break;
|
||||
#else
|
||||
err_sys("SFTP not compiled in. Please use --enable-sftp");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
NO_BREAK;
|
||||
#endif
|
||||
|
||||
case WS_SUCCESS:
|
||||
|
@ -2095,7 +2093,8 @@ static void ShowUsage(void)
|
|||
|
||||
static void SignalTcpReady(func_args* serverArgs, word16 port)
|
||||
{
|
||||
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) && !defined(__MINGW32__)
|
||||
#if defined(_POSIX_THREADS) && defined(NO_MAIN_DRIVER) && \
|
||||
!defined(__MINGW32__) && !defined(SINGLE_THREADED)
|
||||
tcp_ready* ready = serverArgs->signal;
|
||||
pthread_mutex_lock(&ready->mutex);
|
||||
ready->ready = 1;
|
||||
|
@ -2137,99 +2136,106 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
|
||||
int argc = serverArgs->argc;
|
||||
char** argv = serverArgs->argv;
|
||||
serverArgs->return_code = 0;
|
||||
serverArgs->return_code = EXIT_SUCCESS;
|
||||
|
||||
if (argc > 0) {
|
||||
while ((ch = mygetopt(argc, argv, "?1a:d:efEp:R:Ni:j:I:J:K:P:")) != -1) {
|
||||
switch (ch) {
|
||||
case '?' :
|
||||
ShowUsage();
|
||||
WEXIT(EXIT_SUCCESS);
|
||||
const char* optlist = "?1a:d:efEp:R:Ni:j:I:J:K:P:";
|
||||
myoptind = 0;
|
||||
while ((ch = mygetopt(argc, argv, optlist)) != -1) {
|
||||
switch (ch) {
|
||||
case '?' :
|
||||
ShowUsage();
|
||||
serverArgs->return_code = MY_EX_USAGE;
|
||||
return 0;
|
||||
|
||||
case '1':
|
||||
multipleConnections = 0;
|
||||
break;
|
||||
case '1':
|
||||
multipleConnections = 0;
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
#ifdef WOLFSSH_CERTS
|
||||
caCert = myoptarg;
|
||||
#endif
|
||||
break;
|
||||
case 'e' :
|
||||
userEcc = 1;
|
||||
break;
|
||||
|
||||
case 'E':
|
||||
peerEcc = 1;
|
||||
break;
|
||||
|
||||
case 'f':
|
||||
#ifdef WOLFSSH_SHELL
|
||||
echo = 1;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 'p':
|
||||
if (myoptarg == NULL) {
|
||||
err_sys("NULL port value");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
}
|
||||
else {
|
||||
port = (word16)atoi(myoptarg);
|
||||
#if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)
|
||||
if (port == 0) {
|
||||
err_sys("port number cannot be 0");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
}
|
||||
case 'a':
|
||||
#ifdef WOLFSSH_CERTS
|
||||
caCert = myoptarg;
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
break;
|
||||
case 'e' :
|
||||
userEcc = 1;
|
||||
break;
|
||||
|
||||
case 'R':
|
||||
readyFile = myoptarg;
|
||||
break;
|
||||
case 'E':
|
||||
peerEcc = 1;
|
||||
break;
|
||||
|
||||
case 'N':
|
||||
nonBlock = 1;
|
||||
break;
|
||||
case 'f':
|
||||
#ifdef WOLFSSH_SHELL
|
||||
echo = 1;
|
||||
#endif
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
defaultSftpPath = myoptarg;
|
||||
break;
|
||||
case 'p':
|
||||
if (myoptarg == NULL) {
|
||||
err_sys("NULL port value");
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
else {
|
||||
port = (word16)atoi(myoptarg);
|
||||
#if !defined(NO_MAIN_DRIVER) || defined(USE_WINDOWS_API)
|
||||
if (port == 0) {
|
||||
err_sys("port number cannot be 0");
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
break;
|
||||
|
||||
case 'j':
|
||||
userPubKey = myoptarg;
|
||||
break;
|
||||
case 'R':
|
||||
readyFile = myoptarg;
|
||||
break;
|
||||
|
||||
case 'I':
|
||||
sshPubKeyList = StrListAdd(sshPubKeyList, myoptarg);
|
||||
break;
|
||||
case 'N':
|
||||
nonBlock = 1;
|
||||
break;
|
||||
|
||||
case 'J':
|
||||
pemPubKeyList = StrListAdd(pemPubKeyList, myoptarg);
|
||||
break;
|
||||
case 'd':
|
||||
defaultSftpPath = myoptarg;
|
||||
break;
|
||||
|
||||
case 'K':
|
||||
derPubKeyList = StrListAdd(derPubKeyList, myoptarg);
|
||||
break;
|
||||
case 'j':
|
||||
userPubKey = myoptarg;
|
||||
break;
|
||||
|
||||
case 'P':
|
||||
passwdList = StrListAdd(passwdList, myoptarg);
|
||||
break;
|
||||
case 'I':
|
||||
sshPubKeyList = StrListAdd(sshPubKeyList, myoptarg);
|
||||
break;
|
||||
|
||||
default:
|
||||
ShowUsage();
|
||||
WEXIT(MY_EX_USAGE);
|
||||
case 'J':
|
||||
pemPubKeyList = StrListAdd(pemPubKeyList, myoptarg);
|
||||
break;
|
||||
|
||||
case 'K':
|
||||
derPubKeyList = StrListAdd(derPubKeyList, myoptarg);
|
||||
break;
|
||||
|
||||
case 'P':
|
||||
passwdList = StrListAdd(passwdList, myoptarg);
|
||||
break;
|
||||
|
||||
default:
|
||||
ShowUsage();
|
||||
serverArgs->return_code = MY_EX_USAGE;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
myoptind = 0; /* reset for test cases */
|
||||
wc_InitMutex(&doneLock);
|
||||
|
||||
#ifdef WOLFSSH_TEST_BLOCK
|
||||
if (!nonBlock) {
|
||||
err_sys("Use -N when testing forced non blocking");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -2247,13 +2253,15 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
|
||||
if (wolfSSH_Init() != WS_SUCCESS) {
|
||||
fprintf(stderr, "Couldn't initialize wolfSSH.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ctx = wolfSSH_CTX_new(WOLFSSH_ENDPOINT_SERVER, NULL);
|
||||
if (ctx == NULL) {
|
||||
fprintf(stderr, "Couldn't allocate SSH CTX data.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
WMEMSET(&pwMapList, 0, sizeof(pwMapList));
|
||||
|
@ -2303,7 +2311,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
keyLoadBuf = (byte*)WMALLOC(EXAMPLE_KEYLOAD_BUFFER_SZ,
|
||||
NULL, 0);
|
||||
if (keyLoadBuf == NULL) {
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
keyLoadBuf = buf;
|
||||
|
@ -2313,12 +2322,14 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
bufSz = load_key(peerEcc, keyLoadBuf, bufSz);
|
||||
if (bufSz == 0) {
|
||||
fprintf(stderr, "Couldn't load first key file.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
if (wolfSSH_CTX_UsePrivateKey_buffer(ctx, keyLoadBuf, bufSz,
|
||||
WOLFSSH_FORMAT_ASN1) < 0) {
|
||||
fprintf(stderr, "Couldn't use first key buffer.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
peerEcc = !peerEcc;
|
||||
|
@ -2327,12 +2338,14 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
bufSz = load_key(peerEcc, keyLoadBuf, bufSz);
|
||||
if (bufSz == 0) {
|
||||
fprintf(stderr, "Couldn't load second key file.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
if (wolfSSH_CTX_UsePrivateKey_buffer(ctx, keyLoadBuf, bufSz,
|
||||
WOLFSSH_FORMAT_ASN1) < 0) {
|
||||
fprintf(stderr, "Couldn't use second key buffer.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (userPubKey) {
|
||||
|
@ -2345,13 +2358,15 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
/* create temp buffer and load in file */
|
||||
if (userBufSz == 0) {
|
||||
fprintf(stderr, "Couldn't find size of file %s.\n", userPubKey);
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
userBuf = (byte*)WMALLOC(userBufSz, NULL, 0);
|
||||
if (userBuf == NULL) {
|
||||
fprintf(stderr, "WMALLOC failed\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
load_file(userPubKey, userBuf, &userBufSz);
|
||||
LoadPublicKeyBuffer(userBuf, userBufSz, &pwMapList);
|
||||
|
@ -2369,20 +2384,23 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
if (certBufSz == 0) {
|
||||
fprintf(stderr,
|
||||
"Couldn't find size of file %s.\n", caCert);
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
certBuf = (byte*)WMALLOC(certBufSz, NULL, 0);
|
||||
if (certBuf == NULL) {
|
||||
fprintf(stderr, "WMALLOC failed\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
load_file(caCert, certBuf, &certBufSz);
|
||||
ret = wolfSSH_CTX_AddRootCert_buffer(ctx, certBuf, certBufSz,
|
||||
WOLFSSH_FORMAT_PEM);
|
||||
if (ret != 0) {
|
||||
fprintf(stderr, "Couldn't add root cert\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
WFREE(certBuf, NULL, 0);
|
||||
}
|
||||
|
@ -2429,7 +2447,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
/* wait for network and storage device */
|
||||
if (NETBOOT_Wait_For_Network_Up(NU_SUSPEND) != NU_SUCCESS) {
|
||||
fprintf(stderr, "Couldn't find network.\r\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
for(i = 0; i < 15 && ret != NU_SUCCESS; i++)
|
||||
|
@ -2441,7 +2460,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
|
||||
if (ret != NU_SUCCESS) {
|
||||
fprintf(stderr, "Couldn't find storage device.\r\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
@ -2450,9 +2470,11 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
if (readyFile != NULL) {
|
||||
#ifdef NO_FILESYSTEM
|
||||
fprintf(stderr, "cannot create readyFile with no file system.\r\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
#endif
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
#else
|
||||
port = 0;
|
||||
#endif
|
||||
}
|
||||
tcp_listen(&listenFd, &port, 1);
|
||||
/* write out port number listing to, to user set ready file */
|
||||
|
@ -2483,7 +2505,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
NULL, 0);
|
||||
if (threadCtx == NULL) {
|
||||
fprintf(stderr, "Couldn't allocate thread context data.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
WMEMSET(threadCtx, 0, sizeof *threadCtx);
|
||||
|
||||
|
@ -2491,7 +2514,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
if (ssh == NULL) {
|
||||
WFREE(threadCtx, NULL, 0);
|
||||
fprintf(stderr, "Couldn't allocate SSH data.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
wolfSSH_SetUserAuthCtx(ssh, &pwMapList);
|
||||
/* Use the session object for its own highwater callback ctx */
|
||||
|
@ -2503,7 +2527,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
#ifdef WOLFSSH_SFTP
|
||||
if (SetDefaultSftpPath(ssh, defaultSftpPath) != 0) {
|
||||
fprintf(stderr, "Couldn't store default sftp path.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -2520,7 +2545,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
* 0.0.0.0 if ip adder any */
|
||||
if (NU_Get_Sock_Name(listenFd, &sock, &addrLength) != NU_SUCCESS) {
|
||||
fprintf(stderr, "Couldn't find network.\r\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
WMEMCPY(ipaddr, &sock.ip_num, MAX_ADDRESS_SIZE);
|
||||
|
@ -2539,7 +2565,8 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
#endif
|
||||
if (clientFd == -1) {
|
||||
err_sys("tcp accept failed");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (nonBlock)
|
||||
|
@ -2568,12 +2595,16 @@ THREAD_RETURN WOLFSSH_THREAD echoserver_test(void* args)
|
|||
|
||||
} while (multipleConnections && !quit);
|
||||
|
||||
if (listenFd != 0) {
|
||||
WCLOSESOCKET(listenFd);
|
||||
}
|
||||
wc_FreeMutex(&doneLock);
|
||||
PwMapListDelete(&pwMapList);
|
||||
wolfSSH_CTX_free(ctx);
|
||||
if (wolfSSH_Cleanup() != WS_SUCCESS) {
|
||||
fprintf(stderr, "Couldn't clean up wolfSSH.\n");
|
||||
WEXIT(EXIT_FAILURE);
|
||||
serverArgs->return_code = EXIT_FAILURE;
|
||||
return 0;
|
||||
}
|
||||
#if !defined(WOLFSSH_NO_ECC) && defined(FP_ECC) && defined(HAVE_THREAD_LS)
|
||||
wc_ecc_fp_free(); /* free per thread cache */
|
||||
|
@ -2604,7 +2635,7 @@ int wolfSSH_Echoserver(int argc, char** argv)
|
|||
wolfSSH_Debugging_ON();
|
||||
#endif
|
||||
|
||||
#ifndef WOLFSSL_NUCLEUS
|
||||
#if !defined(WOLFSSL_NUCLEUS) && !defined(INTEGRITY) && !defined(__INTEGRITY)
|
||||
ChangeToWolfSshRoot();
|
||||
#endif
|
||||
#ifndef NO_WOLFSSH_SERVER
|
||||
|
|
|
@ -76,7 +76,7 @@ extern "C" {
|
|||
|
||||
|
||||
#if defined(INTEGRITY) || defined(__INTEGRITY)
|
||||
#define WEXIT(n) return (n)
|
||||
#define WEXIT(n) return (0)
|
||||
#else
|
||||
#define WEXIT(n) exit((n))
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue