]> git.sur5r.net Git - ngadmin/blobdiff - cli/admin.c
Added basic packet dumper.
[ngadmin] / cli / admin.c
index 3318cbc55086779e91bfb009c5d54c20bc290f68..b23018d25b5f3c1ff0717914b0c127b41534c58c 100644 (file)
@@ -1,5 +1,7 @@
 
 #include <stdio.h>
+#include <signal.h>
+#include <setjmp.h>
 
 #include <getopt.h>
 #include <readline/readline.h>
@@ -35,10 +37,7 @@ const struct TreeNode* getSubCom (char **com, int n, int *t) {
   for (next=cur->sub; next->name!=NULL && strcmp(next->name, com[i])!=0; ++next);
   
   // sub command not found, exit
-  if ( next->name==NULL ) {
-   next=NULL;
-   break;
-  }
+  if ( next->name==NULL ) break;
   
   // next command is now the current one
   cur=next;
@@ -78,14 +77,9 @@ char* my_generator (const char* text, int state) {
  }
  
  
- while ( (name=tn->name)!=NULL ) {
-  ++tn;
-  
-  if ( strncmp(name, text, len)==0 ) {
+ while ( (name=tn++->name)!=NULL )
+  if ( strncmp(name, text, len)==0 )
    return strdup(name);
-  }
-  
- }
  
  
  return NULL;
@@ -101,7 +95,6 @@ char** my_completion (const char *text, int start, int end UNUSED) {
  int i, n;
  
  
  memset(com, 0, MAXCOM*sizeof(char*));
  line=strdup(rl_line_buffer);
  line[start]=0;
@@ -114,6 +107,10 @@ char** my_completion (const char *text, int start, int end UNUSED) {
  if ( i<n ) compcur=NULL;
  matches=rl_completion_matches(text, my_generator);
  
+ for (i=0; com[i]!=NULL; ++i) {
+  free(com[i]);
+ }
  
  return matches;
  
@@ -121,29 +118,72 @@ char** my_completion (const char *text, int start, int end UNUSED) {
 
 
 
+static struct ngadmin *nga=NULL;
+static sigjmp_buf jmpbuf;
+struct termios orig_term, current_term;
+
+
+
+NORET static void handler (int sig) {
+ switch ( sig ) {
+  
+  case SIGTERM:
+  case SIGINT:
+   printf("interrupt\n");
+  
+   current_term.c_lflag|=ECHO;
+   tcsetattr(STDIN_FILENO, TCSANOW, &current_term);
+   
+   siglongjmp(jmpbuf, 1);
+  
+  default:
+   ngadmin_close(nga);
+   
+   tcsetattr(STDIN_FILENO, TCSANOW, &orig_term);
+   
+   exit(0);
+  
+ }
+}
+
+
 
 int main (int argc, char **argv) {
  
  static const struct option opts[]={
   {"keep-broadcasting", no_argument, NULL, 'b'}, 
   {"force-interface", no_argument, NULL, 'f'}, 
+  {"global-broadcast", no_argument, NULL, 'g'}, 
   {"interface", required_argument, NULL, 'i'}, 
   {"help", no_argument, NULL, 'h'}, 
+  {"timeout", required_argument, NULL, 't'}, 
   {0, 0, 0, 0}
  };
  char *line, *com[MAXCOM];
  const char *iface="eth0";
bool kb=false, force=false;
struct ngadmin *nga=NULL;
float timeout=0.f;
bool kb=false, force=false, global=false;
  struct timeval tv;
  const struct TreeNode *cur, *next;
  int i, n;
  
  
  
+ tcgetattr(STDIN_FILENO, &orig_term);
+ current_term=orig_term;
+ /*
+ current_term.c_lflag&=~ECHOCTL;
+ tcsetattr(STDIN_FILENO, TCSANOW, &current_term);
+ */
  opterr=0;
  
- while ( (n=getopt_long(argc, argv, "bfi:h", opts, NULL))!=-1 ) {
+ while ( (n=getopt_long(argc, argv, "bfgi:ht:", opts, NULL))!=-1 ) {
   switch ( n ) {
    
    case 'b':
@@ -154,14 +194,22 @@ int main (int argc, char **argv) {
     force=true;
    break;
    
+   case 'g':
+    global=true;
+   break;
+   
    case 'i':
     iface=optarg;
    break;
    
    case 'h':
-    printf("Usage: %s [-b] [-f] [-i <interface>]\n", argv[0]);
+    printf("Usage: %s [-b] [-f] [-g] [-i <interface>]\n", argv[0]);
     goto end;
    
+   case 't':
+    timeout=strtof(optarg, NULL);
+   break;
+   
    case '?':
     printf("Unknown option: \"%s\"\n", argv[optind-1]);
     goto end;
@@ -187,15 +235,20 @@ int main (int argc, char **argv) {
  }
  
  // set timeout
- tv.tv_sec=3;
- tv.tv_usec=0;
- ngadmin_setTimeout(nga, &tv);
+ if ( timeout>0.f ) {
+  tv.tv_sec=(int)timeout;
+  tv.tv_usec=(int)((timeout-(float)tv.tv_sec)*1.e6f);
+  ngadmin_setTimeout(nga, &tv);
+ }
  
  
  if ( kb && ngadmin_setKeepBroadcasting(nga, true)!=ERR_OK ) goto end;
  
  if ( force && ngadmin_forceInterface(nga)!=ERR_OK ) goto end;
  
+ if ( global && ngadmin_useGlobalBroadcast(nga, true)!=ERR_OK ) goto end;
  
  //rl_bind_key('\t', rl_abort); // disable auto completion
  //rl_bind_key('\t', rl_complete); // enable auto-complete
@@ -203,15 +256,26 @@ int main (int argc, char **argv) {
  rl_completion_entry_function=my_generator;
  
  
+ signal(SIGTERM, handler);
+ signal(SIGINT, handler);
+ sigsetjmp(jmpbuf, 1);
  while ( cont ) {
   
   if ( (line=readline("> "))==NULL ) goto end;
-  if ( *line!=0 ) add_history(line);
   trim(line, strlen(line));
   n=explode(line, com, MAXCOM);
-  free(line);
   
-  if ( n==0 ) continue;
+  if ( n==0 ) {
+   free(line);
+   continue;
+  } else {
+   add_history(line);
+   free(line);
+  }
   
   cur=getSubCom(com, n, &i);
   
@@ -246,21 +310,16 @@ int main (int argc, char **argv) {
   }
   
   
-  for (i=0; i<MAXCOM; i++) {
-   if ( com[i]!=NULL ) {
-    free(com[i]);
-    com[i]=NULL;
-   }
+  for (i=0; com[i]!=NULL; ++i) {
+   free(com[i]);
+   com[i]=NULL;
   }
   
  }
  
  
  end:
- ngadmin_close(nga);
- return 0;
+ handler(0);
  
 }