mirror of
https://github.com/eddyem/BTA_utils.git
synced 2026-08-13 19:49:24 +03:00
add simplest terminal
This commit is contained in:
@@ -328,18 +328,9 @@ static char *time_asc(double t){
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void clientproc(SSL_CTX *ctx, int fd){
|
// open SSL connection for client
|
||||||
FNAME();
|
static SSL *openConn(SSL_CTX *ctx, int fd){
|
||||||
SSL *ssl;
|
SSL *ssl = SSL_new(ctx);
|
||||||
char buf[1024];
|
|
||||||
int bytes;
|
|
||||||
sdat.mode |= 0200; // allow W
|
|
||||||
sdat.atflag = 0; // clear SHM_RDONLY
|
|
||||||
if(!get_shm_block(&sdat, ClientSide)){
|
|
||||||
LOGERR("Can't get SHM block");
|
|
||||||
ERRX("Can't get SHM block");
|
|
||||||
}
|
|
||||||
ssl = SSL_new(ctx);
|
|
||||||
SSL_set_fd(ssl, fd);
|
SSL_set_fd(ssl, fd);
|
||||||
int c = SSL_connect(ssl);
|
int c = SSL_connect(ssl);
|
||||||
if(c < 0){
|
if(c < 0){
|
||||||
@@ -351,6 +342,21 @@ void clientproc(SSL_CTX *ctx, int fd){
|
|||||||
LOGERR("Can't make socket nonblocking");
|
LOGERR("Can't make socket nonblocking");
|
||||||
ERRX("ioctl()");
|
ERRX("ioctl()");
|
||||||
}
|
}
|
||||||
|
return ssl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// run main client process
|
||||||
|
void clientproc(SSL_CTX *ctx, int fd){
|
||||||
|
FNAME();
|
||||||
|
char buf[1024];
|
||||||
|
SSL *ssl = openConn(ctx, fd);
|
||||||
|
if(!ssl) return;
|
||||||
|
sdat.mode |= 0200; // allow W
|
||||||
|
sdat.atflag = 0; // clear SHM_RDONLY
|
||||||
|
if(!get_shm_block(&sdat, ClientSide)){
|
||||||
|
LOGERR("Can't get SHM block");
|
||||||
|
ERRX("Can't get SHM block");
|
||||||
|
}
|
||||||
while(isrunning){
|
while(isrunning){
|
||||||
if(!process_system(ssl)){
|
if(!process_system(ssl)){
|
||||||
LOGERR("Motors error");
|
LOGERR("Motors error");
|
||||||
@@ -360,7 +366,7 @@ void clientproc(SSL_CTX *ctx, int fd){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
// clear receiving buffer (TODO: parse it?)
|
// clear receiving buffer (TODO: parse it?)
|
||||||
bytes = SSL_nbread(ssl, buf, sizeof(buf));
|
int bytes = SSL_nbread(ssl, buf, sizeof(buf)-1);
|
||||||
if(bytes > 0){
|
if(bytes > 0){
|
||||||
buf[bytes] = 0;
|
buf[bytes] = 0;
|
||||||
fprintf(stderr, "Received: \"%s\"\n", buf);
|
fprintf(stderr, "Received: \"%s\"\n", buf);
|
||||||
@@ -373,3 +379,40 @@ void clientproc(SSL_CTX *ctx, int fd){
|
|||||||
DBG("Exit; isrunning=%d", isrunning);
|
DBG("Exit; isrunning=%d", isrunning);
|
||||||
SSL_free(ssl);
|
SSL_free(ssl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// run in terminal mode
|
||||||
|
void terminal(SSL_CTX *ctx, int fd){
|
||||||
|
FNAME();
|
||||||
|
char buf[1024], *lptr = NULL;
|
||||||
|
size_t N = 0;
|
||||||
|
SSL *ssl = openConn(ctx, fd);
|
||||||
|
if(!ssl) return;
|
||||||
|
int printed = FALSE;
|
||||||
|
while(isrunning){
|
||||||
|
if(!printed){
|
||||||
|
printf("> ");
|
||||||
|
fflush(stdout);
|
||||||
|
printed = TRUE;
|
||||||
|
}
|
||||||
|
if(sl_canread(0)){
|
||||||
|
ssize_t L = getline(&lptr, &N, stdin);
|
||||||
|
if(L > (ssize_t)(sizeof(buf)-1)) WARNX("String too long!");
|
||||||
|
else if(L > 0){
|
||||||
|
SSL_write(ssl, lptr, L);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int bytes = 0;
|
||||||
|
while((bytes = SSL_nbread(ssl, buf, sizeof(buf)-1))){
|
||||||
|
if(bytes > 0){
|
||||||
|
buf[bytes] = 0;
|
||||||
|
printf("< %s\n", buf);
|
||||||
|
}else{
|
||||||
|
LOGWARN("Server disconnected or other error");
|
||||||
|
ERRX("Disconnected");
|
||||||
|
}
|
||||||
|
usleep(10000);
|
||||||
|
printed = FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SSL_free(ssl);
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,3 +21,4 @@
|
|||||||
#include "sslsock.h"
|
#include "sslsock.h"
|
||||||
|
|
||||||
void clientproc(SSL_CTX *ctx, int fd);
|
void clientproc(SSL_CTX *ctx, int fd);
|
||||||
|
void terminal(SSL_CTX *ctx, int fd);
|
||||||
|
|||||||
@@ -72,6 +72,7 @@ static sl_option_t cmdlnopts[] = {
|
|||||||
{"server", NEED_ARG, NULL, 's', arg_string, APTR(&G.serverhost), _("server node, IP:port")},
|
{"server", NEED_ARG, NULL, 's', arg_string, APTR(&G.serverhost), _("server node, IP:port")},
|
||||||
{"lostsync",NEED_ARG, NULL, 'L', arg_double, APTR(&G.T_sync_lost),_("\"lost synchronization\" timeout, s (default: 5)")},
|
{"lostsync",NEED_ARG, NULL, 'L', arg_double, APTR(&G.T_sync_lost),_("\"lost synchronization\" timeout, s (default: 5)")},
|
||||||
{"emulation",NO_ARGS, NULL, 'e', arg_int, APTR(&G.emulmode), _("run even in emulation mode")},
|
{"emulation",NO_ARGS, NULL, 'e', arg_int, APTR(&G.emulmode), _("run even in emulation mode")},
|
||||||
|
{"terminal",NO_ARGS, NULL, 'T', arg_int, APTR(&G.terminal), _("run client in terminal mode")},
|
||||||
#endif
|
#endif
|
||||||
end_option
|
end_option
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -35,6 +35,7 @@
|
|||||||
*/
|
*/
|
||||||
typedef struct{
|
typedef struct{
|
||||||
int emulmode; // emulation mode: don't check server & run in model mode
|
int emulmode; // emulation mode: don't check server & run in model mode
|
||||||
|
int terminal; // run client in terminal mode
|
||||||
double acc_timeout; // network timeout, s
|
double acc_timeout; // network timeout, s
|
||||||
double T_sync_lost; // "lost synchronization" timeout, s
|
double T_sync_lost; // "lost synchronization" timeout, s
|
||||||
double speedchk_interval;// interval of motors' speed checking (resend command if don't reach yet)
|
double speedchk_interval;// interval of motors' speed checking (resend command if don't reach yet)
|
||||||
|
|||||||
@@ -72,6 +72,10 @@ int start_daemon(){
|
|||||||
#ifdef CLIENT
|
#ifdef CLIENT
|
||||||
//DBG("server: %s", G.serverhost);
|
//DBG("server: %s", G.serverhost);
|
||||||
if(!G.serverhost) ERRX("Point server name");
|
if(!G.serverhost) ERRX("Point server name");
|
||||||
|
if(G.terminal){
|
||||||
|
isrunning = TRUE;
|
||||||
|
return open_socket();
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
if(G.logfile){
|
if(G.logfile){
|
||||||
int lvl = LOGLEVEL_WARN + G.verbose;
|
int lvl = LOGLEVEL_WARN + G.verbose;
|
||||||
|
|||||||
@@ -24,6 +24,5 @@
|
|||||||
int main(int argc, char **argv){
|
int main(int argc, char **argv){
|
||||||
sl_init();
|
sl_init();
|
||||||
parse_args(argc, argv);
|
parse_args(argc, argv);
|
||||||
DBG("START");
|
|
||||||
return start_daemon();
|
return start_daemon();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -139,7 +139,8 @@ int open_socket(){
|
|||||||
#ifdef SERVER
|
#ifdef SERVER
|
||||||
serverproc(ctx, fd);
|
serverproc(ctx, fd);
|
||||||
#else
|
#else
|
||||||
clientproc(ctx, fd);
|
if(G.terminal) terminal(ctx, fd);
|
||||||
|
else clientproc(ctx, fd);
|
||||||
#endif
|
#endif
|
||||||
// newer reached
|
// newer reached
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|||||||
Reference in New Issue
Block a user