X-Git-Url: http://andersk.mit.edu/gitweb/moira.git/blobdiff_plain/2b6bd16d8fa3f8136749b37b496a34588644c62c..f281aa291c7e53c7dcb18e9606c36a649475f24c:/clients/mrtest/mrtest.c diff --git a/clients/mrtest/mrtest.c b/clients/mrtest/mrtest.c index 9f00056d..597784f5 100644 --- a/clients/mrtest/mrtest.c +++ b/clients/mrtest/mrtest.c @@ -21,49 +21,176 @@ static char *rcsid_test_c = "$Header$"; #include #include #include -#include +#include +#include +#include + +#ifdef USE_READLINE +#include "readline.h" +#endif -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; +jmp_buf jb; + +#define MAXARGS 20 + +void discard_input(int, int, struct sigcontext *); +char *mr_gets(char *, char *, size_t); main(argc, argv) int argc; char **argv; { int status; - char *whoami; + char cmdbuf[BUFSIZ]; +#ifdef POSIX + struct sigaction action; +#endif 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); +#ifdef POSIX + action.sa_handler = discard_input; + action.sa_flags = 0; + sigemptyset(&action.sa_mask); + sigaction(SIGINT, &action, NULL); +#else + signal(SIGINT, discard_input); +#endif + setjmp(jb); + + while(!quit) { + if(!mr_gets("moira: ",cmdbuf,BUFSIZ)) break; + execute_line(cmdbuf); } - if (argc > 1) { - argv++; - ss_execute_command(ss, argv); + mr_disconnect(); + exit(0); +} + +void discard_input(int sig, int code, struct sigcontext *scp) +{ + putc('\n', stdout); + longjmp(jb, 1); +} + +char *mr_gets(char *prompt, char *buf, size_t len) +{ + char *in; +#ifdef USE_READLINE + if(isatty(0)) { + in=readline(prompt); + + if (!in) return NULL; + if (*in) { + add_history(in); + strncpy(buf, in, len-1); + buf[len]=0; + } + + return buf; + } +#endif + printf("%s", prompt); + fflush(stdout); + in=fgets(buf, len, stdin); + if(!in) return in; + if(strchr(buf,'\n')) *(strchr(buf,'\n'))=0; + return buf; +} + +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; + + if(!*buf) return 0; + + 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') && (*p!='\\')) { + fprintf(stderr, "moira: Bad use of \\\n"); + return 0; + } else if (*p>='0' && *p<='9') { + 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 +214,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 +231,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 +255,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 +282,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 +308,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 +326,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 +346,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 +362,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 +377,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 +389,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"); +}