Work on ac schell

FossilOrigin-Name: 7188e8ddbaef3bc96052497ec6ce4e422eb60bfa9d8f8e7a2b6f0c6a44c7da74
This commit is contained in:
7u83@mail.ru
2018-05-02 09:03:05 +00:00
parent 474245812f
commit d1c04bc7fd
9 changed files with 227 additions and 25 deletions

View File

@ -58,6 +58,7 @@ AC_OBJS = \
db.o \
ac_global.o \
discovery_cache.o\
shell.o\
${AC_MODULES}

View File

@ -230,6 +230,7 @@ int main (int argc, char *argv[])
FILE * file;
mavl_t types_tree, global_cfg;
const cw_Type_t **ti;
/* parse arguments */
parse_args (argc, argv, &bootcfg);
@ -278,7 +279,10 @@ exit(0);
if (!read_config ("ac.conf"))
return 1;
start_shell();
/* Show debug options if there are any set */
if (cw_dbg_opt_level)
cw_log (LOG_INFO, "Debug Options: %08X", cw_dbg_opt_level);

View File

@ -0,0 +1,110 @@
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include "cw/sock.h"
#include "cw/log.h"
#include "cw/dbg.h"
void execute_cmd(const char *str)
{
char cmd[1024];
char args[1024];
sscanf(str,"%s%s",cmd,args);
printf("CMD: %s, ARGS: %s\n",cmd,args);
}
void shell_loop(FILE *file)
{
int c;
/* setvbuf(file,NULL,_IONBF,0);
fflush(file);
*/
char str[2048];
do {
fprintf(file,"actube[%d]:>",fileno(file));
fflush(file);
fgets(str,sizeof(str),file);
execute_cmd(str);
}while (c!=EOF);
}
void * run_shell(void * arg)
{
struct sockaddr_storage server, client;
socklen_t client_size;
char sockstr[SOCK_ADDR_BUFSIZE];
int rc;
const char * addr = "127.0.0.1:5000";
int sockfd, clientsock;
int yes;
rc = sock_strtoaddr(addr,(struct sockaddr*)&server);
if (! rc ){
cw_log(LOG_ERR,"Can't parse address '%s', %s",addr,strerror(errno));
}
sockfd = socket(((struct sockaddr*)&server)->sa_family,SOCK_STREAM,0);
yes = 1;
/* reuse address */
setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes));
/* bind address */
rc = bind(sockfd,(struct sockaddr*)&server,sizeof(server));
if (rc ){
cw_log(LOG_ERR,"Can't bind socket address '%s', %s",addr,strerror(errno));
}
rc = listen(sockfd,5);
if (rc ){
cw_log(LOG_ERR,"Can't listen on address '%s', %s",addr,strerror(errno));
}
client_size = sizeof(client);
clientsock = accept(sockfd,(struct sockaddr*)&client,&client_size);
if (clientsock>0){
sock_addr2str_p(&client,sockstr);
cw_dbg(DBG_INFO, "Acceptiong session from %s",sockstr);
shell_loop(fdopen(clientsock,"a+"));
close(clientsock);
}
printf("Accepting %i, %s",rc,strerror(errno));
return NULL;
}
void start_shell()
{
pthread_t thread;
pthread_create(&thread, NULL, run_shell,
NULL);
}