]> andersk Git - moira.git/blobdiff - clients/mrtest/mrtest.c
new, more syntactically useful mrtest
[moira.git] / clients / mrtest / mrtest.c
index 9f00056d9253c03e873a7e615ea1fc9b58b7742c..80ecc5ee9938a8305f9175ebf983a6281b23f2fc 100644 (file)
@@ -21,49 +21,123 @@ static char *rcsid_test_c = "$Header$";
 #include <ctype.h>
 #include <string.h>
 #include <moira.h>
-#include <ss/ss.h>
+#include <com_err.h>
 
-int ss;
 int recursion = 0;
-extern ss_request_table moira_test;
+extern int errno;
 extern int sending_version_no;
-int count;
+int count, quit=0;
+char *whoami;
+
+#define MAXARGS 20
 
 main(argc, argv)
        int argc;
        char **argv;
 {      
        int status;
-       char *whoami;
+       char cmdbuf[BUFSIZ];
        
        whoami = argv[0];
        
-       init_ss_err_tbl();
        initialize_sms_error_table();
        initialize_krb_error_table();
 
-       ss = ss_create_invocation("moira", "2.0", (char *)NULL,
-                                 &moira_test, &status);
-       if (status != 0) {
-               com_err(whoami, status, "Unable to create invocation");
-               exit(1);
+       while(!quit) {
+               printf("moira:  ");
+               fflush(stdout);
+               if(!fgets(cmdbuf,BUFSIZ,stdin)) break;
+               execute_line(cmdbuf);
        }
-       if (argc > 1) {
-           argv++;
-           ss_execute_command(ss, argv);
+       mr_disconnect();
+       exit(0);
+}
+
+execute_line(cmdbuf)
+     char *cmdbuf;
+{
+  int argc;
+  char *argv[MAXARGS];
+
+  argc=parse(cmdbuf, argv);
+  if(argc==0) return;
+  if(!strcmp(argv[0],"noop"))
+    test_noop();
+  else if(!strcmp(argv[0],"connect") || !strcmp(argv[0],"c"))
+    test_connect(argc, argv);
+  else if(!strcmp(argv[0],"disconnect") || !strcmp(argv[0],"d"))
+    test_disconnect();
+  else if(!strcmp(argv[0],"host"))
+    test_host();
+  else if(!strcmp(argv[0],"new") || !strcmp(argv[0],"2"))
+    test_new();
+  else if(!strcmp(argv[0],"old") || !strcmp(argv[0],"1"))
+    test_old();
+  else if(!strcmp(argv[0],"motd"))
+    test_motd();
+  else if(!strcmp(argv[0],"query") || !strcmp(argv[0],"qy"))
+    test_query(argc, argv);
+  else if(!strcmp(argv[0],"auth") || !strcmp(argv[0],"a"))
+    test_auth(argc, argv);
+  else if(!strcmp(argv[0],"access"))
+    test_access(argc, argv);
+  else if(!strcmp(argv[0],"dcm"))
+    test_dcm();
+  else if(!strcmp(argv[0],"script") || !strcmp(argv[0],"s"))
+    test_script(argc, argv);
+  else if(!strcmp(argv[0],"list_requests") ||
+         !strcmp(argv[0],"lr") || !strcmp(argv[0],"?"))
+    test_list_requests();
+  else if(!strcmp(argv[0],"quit") || !strcmp(argv[0],"Q"))
+    quit=1;
+  else fprintf(stderr, "moira: Unknown request \"%s\"."
+              "Type \"?\" for a request list.\n", argv[0]);
+}
+
+int
+parse(buf, argv)
+     char *buf, *argv[MAXARGS];
+{
+  char *p;
+  int argc, num;
+       
+  for(p=buf, argc=0, argv[0]=buf; *p && *p!='\n'; p++) {
+    if(*p=='"') {
+      char *d=p++;
+      /* skip to close-quote, copying back over open-quote */
+      while(*p!='"') {
+       if(!*p || *p=='\n') {
+         fprintf(stderr, "moira: Unbalanced quotes in command line\n");
+         return 0;
        }
-       ss_listen(ss, &status);
-       if (status != 0) {
-               com_err(whoami, status, 0);
-               exit(1);
+       if(*p=='\\') {
+         if(*++p!='"' && (*p<'0' || *p>'9')) {
+           fprintf(stderr, "moira: Bad use of \\\n");
+           return 0;
+         } else if (*p!='"') {
+           num=(*p-'0')*64 + (*++p-'0')*8 + (*++p-'0');
+           *p=num;
+         }
        }
-       exit(0);
+       *d++=*p++;
+      }
+      if(p==d+1) {*d='\0'; p++;}
+      else while(p>=d) *p--=' ';
+    }
+    if(*p==' ' || *p=='\t') {
+      /* skip whitespace */
+      for(*p++='\0'; *p==' ' || *p=='\t'; p++);
+      if(*p && *p!='\n') argv[++argc]=p--;
+    }
+  }
+  if(*p=='\n') *p='\0';
+  return argc+1;
 }
 
 test_noop()
 {
        int status = mr_noop();
-       if (status) ss_perror(ss, status, "");
+       if (status) com_err("moira (noop)", status, "");
 }
 
 test_new()
@@ -87,13 +161,13 @@ char *argv[];
            server = argv[1];
        }
        status = mr_connect(server);
-       if (status) ss_perror(ss, status, "");
+       if (status) com_err("moira (connect)", status, "");
 }
 
 test_disconnect()
 {
        int status = mr_disconnect();
-       if (status) ss_perror(ss, status, "");
+       if (status) com_err("moira (disconnect)", status, "");
 }
 
 test_host()
@@ -104,17 +178,19 @@ test_host()
         memset(host, 0, sizeof(host));
 
        if (status = mr_host(host, sizeof(host) - 1))
-           ss_perror(ss, status, "");
+           com_err("moira (host)", status, "");
        else
            printf("You are connected to host %s\n", host);
 }
 
-test_auth()
+test_auth(argc, argv)
+int argc;
+char *argv[];
 {
        int status;
 
        status = mr_auth("mrtest");
-       if (status) ss_perror(ss, status, "");
+       if (status) com_err("moira (auth)", status, "");
 }
 
 test_script(argc, argv)
@@ -126,19 +202,19 @@ char *argv[];
     int status, oldstdout, oldstderr;
 
     if (recursion > 8) {
-       ss_perror(ss, 0, "too many levels deep in script files\n");
+       com_err("moira (script)", 0, "too many levels deep in script files\n");
        return;
     }
 
     if (argc < 2) {
-       ss_perror(ss, 0, "Usage: script input_file [ output_file ]");
+       com_err("moira (script)", 0, "Usage: script input_file [ output_file ]");
        return;
     }
 
     inp = fopen(argv[1], "r");
     if (inp == NULL) {
        sprintf(input, "Cannot open input file %s", argv[1]);
-       ss_perror(ss, 0, input);
+       com_err("moira (script)", 0, input);
        return;
     }
 
@@ -153,7 +229,7 @@ char *argv[];
            dup2(oldstdout, 1);
            argc = 2;
            sprintf(input, "Unable to redirect output to %s\n", argv[2]);
-           ss_perror(ss, errno, input);
+           com_err("moira (script)", errno, input);
        } else {
            fflush(stderr);
            oldstderr = dup(2);
@@ -179,10 +255,7 @@ char *argv[];
            continue;
        }
        printf("Executing: %s\n", input);
-       ss_execute_line(ss, input, &status);
-       if (status == SS_ET_COMMAND_NOT_FOUND) {
-           printf("Bad command: %s\n", input);
-       }
+       execute_line(input);
     }
 
     recursion--;
@@ -200,28 +273,6 @@ char *argv[];
     }
 }
 
-char *concat(str1, str2)
-       char *str1, *str2;
-{
-       char *rtn;
-       extern char *malloc();
-       
-       if (!str1) {
-               int len = strlen(str2) + 1 ;
-               rtn = malloc(len);
-               memcpy(rtn, str2, len);
-       } else {
-               int len1 = strlen(str1);
-               int len2 = strlen(str2) + 1;
-               rtn = malloc(len1+len2);
-               memcpy(rtn, str1, len1);
-               memcpy(rtn+len1, str2, len2);
-       }
-       return rtn;
-}
-
-
-
 print_reply(argc, argv)
        int argc;
        char **argv;
@@ -242,14 +293,14 @@ test_query(argc, argv)
 {
        int status;
        if (argc < 2) {
-               ss_perror(ss, 0, "Usage: query handle [ args ... ]");
+               com_err("moira (query)", 0, "Usage: query handle [ args ... ]");
                return;
        }
 
        count = 0;
        status = mr_query(argv[1], argc-2, argv+2, print_reply, (char *)NULL);
        printf("%d tuple%s\n", count, ((count == 1) ? "" : "s"));
-       if (status) ss_perror(ss, status, "");
+       if (status) com_err("moira (query)", status, "");
 }
 
 test_access(argc, argv)
@@ -258,11 +309,11 @@ test_access(argc, argv)
 {
        int status;
        if (argc < 2) {
-               ss_perror(ss, 0, "Usage: access handle [ args ... ]");
+               com_err("moira (access)", 0, "Usage: access handle [ args ... ]");
                return;
        }
        status = mr_access(argv[1], argc-2, argv+2);
-       if (status) ss_perror(ss, status, "");
+       if (status) com_err("moira (access)", status, "");
 }
 
 
@@ -273,7 +324,7 @@ test_dcm(argc, argv)
        int status;
 
        if (status = mr_do_update())
-         ss_perror(ss, status, " while triggering dcm");
+         com_err("moira (dcm)", status, " while triggering dcm");
 }
 
 
@@ -285,9 +336,29 @@ test_motd(argc, argv)
        char *motd;
 
        if (status = mr_motd(&motd))
-         ss_perror(ss, status, " while getting motd");
+         com_err("moira (motd)", status, " while getting motd");
        if (motd)
          printf("%s\n", motd);
        else
          printf("No message of the day.\n");
 }
+
+test_list_requests()
+{
+       printf("Available moira requests:\n");
+       printf("\n");
+       printf("noop\t\t\tAsk Moira to do nothing\n");
+       printf("connect, c\t\tConnect to Moira server\n");
+       printf("disconnect, d\t\tDisconnect from server\n");
+       printf("host\t\t\tIdentify the server host\n");
+       printf("new, 2\t\t\tUse new protocol\n");
+       printf("old, 1\t\t\tUse old protocol\n");
+       printf("motd, m\t\t\tGet the Message of the Day\n");
+       printf("query, qy\t\tMake a query.\n");
+       printf("auth, a\t\t\tAuthenticate to Moira.\n");
+       printf("access\t\t\tCheck access to a Moira query.\n");
+       printf("dcm\t\t\tTrigger the DCM\n");
+       printf("script, s\t\tRead commands from a script.\n");
+       printf("list_requests, lr, ?\tList available commands.\n");
+       printf("quit, Q\t\t\tLeave the subsystem.\n");
+}
This page took 0.047455 seconds and 4 git commands to generate.