]> andersk Git - moira.git/blobdiff - clients/mrtest/mrtest.c
Block ^C during queries (or you'll screw up libmoira's internal state).
[moira.git] / clients / mrtest / mrtest.c
index bd588acadb568b507a9b8f8545bca49f565f2c92..1d2f87d64071be53b94b607343bd77b95be53158 100644 (file)
@@ -29,10 +29,10 @@ static char *rcsid_test_c = "$Header$";
 #include "readline.h"
 #endif
 
-int recursion = 0;
+int recursion = 0, interactive;
 extern int errno;
 extern int sending_version_no;
-int count, quit=0;
+int count, quit=0, cancel=0;
 char *whoami;
 #ifdef POSIX
 sigjmp_buf jb;
@@ -59,6 +59,7 @@ main(argc, argv)
 #endif
        
        whoami = argv[0];
+       interactive = (isatty(0) && isatty(1));
        
        initialize_sms_error_table();
        initialize_krb_error_table();
@@ -95,11 +96,18 @@ int
 discard_input()
 {
   putc('\n', stdout);
+
+  /* if we're inside a script, we have to clean up file descriptors,
+     so don't jump out yet */
+  if(recursion) {
+    cancel=1;
+  } else {
 #ifdef POSIX
-  siglongjmp(jb, 1);
+    siglongjmp(jb, 1);
 #else
-  longjmp(jb, 1);
+    longjmp(jb, 1);
 #endif
+  }
 }
 
 char *mr_gets(prompt, buf, len)
@@ -108,7 +116,7 @@ char *mr_gets(prompt, buf, len)
 {
   char *in;
 #ifdef USE_READLINE
-  if(isatty(0) && isatty(1)) {
+  if(interactive) {
     in=readline(prompt);
     
     if (!in) return NULL;
@@ -318,7 +326,7 @@ char *argv[];
 
     recursion++;
 
-    for(;;) {
+    while(!cancel) {
        if (fgets(input, BUFSIZ, inp) == NULL)
          break;
        if ((cp = strchr(input, '\n')) != (char *)NULL)
@@ -337,6 +345,7 @@ char *argv[];
     }
 
     recursion--;
+    if(!recursion) cancel=0;
 
     fclose(inp);
     if (argc == 3) {
@@ -370,13 +379,33 @@ test_query(argc, argv)
        char **argv;
 {
        int status;
+#ifdef POSIX
+       sigset_t sigs;
+#else
+       int mask;
+#endif
+
        if (argc < 2) {
                com_err("moira (query)", 0, "Usage: query handle [ args ... ]");
                return;
        }
 
        count = 0;
+       /* Don't allow ^C during the query: it will confuse libmoira's
+          internal state. (Yay static variables) */
+#ifdef POSIX
+       sigemptyset(&sigs);
+       sigaddset(&sigs, SIGINT);
+       sigprocmask(SIG_BLOCK, &sigs, NULL);
+#else
+       mask = sigblock(SIGINT);
+#endif
        status = mr_query(argv[1], argc-2, argv+2, print_reply, (char *)NULL);
+#ifdef POSIX
+       sigprocmask(SIG_UNBLOCK, &sigs, NULL);
+#else
+       sigsetmask(mask);
+#endif
        printf("%d tuple%s\n", count, ((count == 1) ? "" : "s"));
        if (status) com_err("moira (query)", status, "");
 }
This page took 0.042908 seconds and 4 git commands to generate.