Code

New function to for escaped strings from command line for send/quit.
authorTon Voon <tonvoon@users.sourceforge.net>
Wed, 29 Mar 2006 16:33:36 +0000 (16:33 +0000)
committerTon Voon <tonvoon@users.sourceforge.net>
Wed, 29 Mar 2006 16:33:36 +0000 (16:33 +0000)
Adapted from Sebastian Wiesinger's patch (1292404)

git-svn-id: https://nagiosplug.svn.sourceforge.net/svnroot/nagiosplug/nagiosplug/trunk@1365 f882894a-f735-0410-b71e-b25c423dba1c

THANKS.in
plugins/check_tcp.c
plugins/tests/test_utils.c
plugins/utils.c
plugins/utils.h

index 3b2405d25e9790e7fb522a17859c41a6b7d63df3..3fb69c8678c5cfd7a5e5c69b4e8570c7a7a40f2c 100644 (file)
--- a/THANKS.in
+++ b/THANKS.in
@@ -179,3 +179,4 @@ Steven Kreuzer
 Johan Fischer
 Sakari Lehtonen
 John Rouillard
+Sebastian Wiesinger
index d8fc26e7d3e7aee3f273c3f536ac0c8b27111ccf..5fe024bec4914a0f8650b32235f8d909dc55fc49 100644 (file)
@@ -54,8 +54,6 @@ static int server_port = 0;
 static char *server_address = NULL;
 static char *server_send = NULL;
 static char *server_quit = NULL;
-char *lineend = "";
-char *lineendquit = "\r\n";
 static char **server_expect;
 static size_t server_expect_count = 0;
 static size_t maxbytes = 0;
@@ -246,6 +244,12 @@ main (int argc, char **argv)
        }
 
        if(flags & FLAG_VERBOSE) {
+               if (server_send) {
+                       printf("Send string: %s\n", server_send);
+               }
+               if (server_quit) {
+                       printf("Quit string: %s\n", server_quit);
+               }
                printf("server_expect_count: %d\n", (int)server_expect_count);
                for(i = 0; i < server_expect_count; i++)
                        printf("\t%d: %s\n", i, server_expect[i]);
@@ -364,6 +368,7 @@ static int
 process_arguments (int argc, char **argv)
 {
        int c;
+       int escape = 0;
 
        int option = 0;
        static struct option longopts[] = {
@@ -375,7 +380,7 @@ process_arguments (int argc, char **argv)
                {"timeout", required_argument, 0, 't'},
                {"protocol", required_argument, 0, 'P'},
                {"port", required_argument, 0, 'p'},
-               {"lineend", required_argument, 0, 'l'},
+               {"escape", required_argument, 0, 'E'},
                {"send", required_argument, 0, 's'},
                {"expect", required_argument, 0, 'e'},
                {"maxbytes", required_argument, 0, 'm'},
@@ -417,7 +422,7 @@ process_arguments (int argc, char **argv)
        }
 
        while (1) {
-               c = getopt_long (argc, argv, "+hVv46H:l:s:e:q:m:c:w:t:p:C:W:d:Sr:jD:M:",
+               c = getopt_long (argc, argv, "+hVv46EH:s:e:q:m:c:w:t:p:C:W:d:Sr:jD:M:",
                                 longopts, &option);
 
                if (c == -1 || c == EOF || c == 1)
@@ -485,30 +490,14 @@ process_arguments (int argc, char **argv)
                        else
                                server_port = atoi (optarg);
                        break;
-               case 'l':
-                       switch (*optarg) {
-                               case 'n':
-                                 lineend = strdup("\n");
-                                 lineendquit = lineend;
-                                 break;
-                               case 'r':
-                                 lineend = strdup("\r");
-                                 lineendquit = lineend;
-                                 break;
-                               case 'b':
-                                 lineend = strdup("\r\n");
-                                 lineendquit = lineend;
-                                 break;
-                               case 'e':
-                                 lineend = strdup("");
-                                 lineendquit = lineend;
-                                 break;
-                               default:
-                                 usage4 (_("Unrecognized option to -l, must be r, n, b or e"));
-                        }
+               case 'E':
+                       escape = 1;
                        break;
                case 's':
-                       asprintf(&server_send, "%s%s", optarg, lineend);
+                       if (escape)
+                               server_send = np_escaped_string(optarg);
+                       else
+                               asprintf(&server_send, "%s", optarg);
                        break;
                case 'e': /* expect string (may be repeated) */
                        EXPECT = NULL;
@@ -525,7 +514,10 @@ process_arguments (int argc, char **argv)
                        else
                                maxbytes = strtol (optarg, NULL, 0);
                case 'q':
-                       asprintf(&server_quit, "%s%s", optarg, lineendquit);
+                       if (escape)
+                               server_quit = np_escaped_string(optarg);
+                       else
+                               asprintf(&server_quit, "%s\r\n", optarg);
                        break;
                case 'r':
                        if (!strncmp(optarg,"ok",2))
@@ -604,10 +596,9 @@ print_help (void)
        printf (_(UT_IPv46));
 
        printf (_("\
- -l, --lineend=b|e|n|r\n\
-    Ending on -s and -q strings. b - both: <cr><lf> style, e - empty no\n\
-    end, n - newline: newline end, r - return: carriage return end\n\
-    Default is \"-l e -s <send> -l b -q <quit>\".\n\
+ -E, --escape\n\
+    Can use \\n, \\r, \\t or \\ in send or quit string.\n\
+    Default: nothing added to send, \\r\\n added to end of quit\n\
  -s, --send=STRING\n\
     String to send to the server\n\
  -e, --expect=STRING\n\
@@ -653,6 +644,6 @@ Usage: %s -H host -p port [-w <warning time>] [-c <critical time>]\n\
                   [-s <send string>] [-e <expect string>] [-q <quit string>]\n\
                   [-m <maximum bytes>] [-d <delay>] [-t <timeout seconds>]\n\
                   [-r <refuse state>] [-M <mismatch state>] [-v] [-4|-6] [-j]\n\
-                  [-D <days to cert expiry>] [-S <use SSL>] [-l <n|r|b|e>]\n", progname);
+                  [-D <days to cert expiry>] [-S <use SSL>] [-E]\n", progname);
 }
 
index 27e28c7562ff3d0684d56acf99f3a60348caade9..5aa0028a8345dc14945a7df03d89bad4c387abb6 100644 (file)
@@ -34,7 +34,7 @@ main (int argc, char **argv)
        thresholds *thresholds = NULL;
        int     rc;
 
-       plan_tests(66);
+       plan_tests(73);
 
        range = parse_range_string("6");
        ok( range != NULL, "'6' is valid range");
@@ -136,6 +136,35 @@ main (int argc, char **argv)
        ok( get_status(30.0001, thresholds) == STATE_WARNING, "30.0001 - warning");
        ok( get_status(69, thresholds) == STATE_CRITICAL, "69 - critical");
 
+       char *test;
+       test = np_escaped_string("bob\\n");
+       ok( strcmp(test, "bob\n") == 0, "bob\\n ok");
+       free(test);
+
+       test = np_escaped_string("rhuba\\rb");
+       ok( strcmp(test, "rhuba\rb") == 0, "rhuba\\rb okay");
+       free(test);
+
+       test = np_escaped_string("ba\\nge\\r");
+       ok( strcmp(test, "ba\nge\r") == 0, "ba\\nge\\r okay");
+       free(test);
+
+       test = np_escaped_string("\\rabbi\\t");
+       ok( strcmp(test, "\rabbi\t") == 0, "\\rabbi\\t okay");
+       free(test);
+
+       test = np_escaped_string("and\\\\or");
+       ok( strcmp(test, "and\\or") == 0, "and\\\\or okay");
+       free(test);
+
+       test = np_escaped_string("bo\\gus");
+       ok( strcmp(test, "bogus") == 0, "bo\\gus okay");
+       free(test);
+
+       test = np_escaped_string("everything");
+       ok( strcmp(test, "everything") == 0, "everything okay");
+       free(test);
+
        return exit_status();
 }
 
index 685a638a0e321974261028e4f6b50f6b1f8defea..a5245c67ae73fa34ea6eb41920d5052bb87df686 100644 (file)
@@ -727,3 +727,33 @@ char *fperfdata (const char *label,
 
        return data;
 }
+
+char *np_escaped_string (const char *string) {
+       char *data;
+       int i, j=0;
+       data = strdup(string);
+       for (i=0; data[i]; i++) {
+               if (data[i] == '\\') {
+                       switch(data[++i]) {
+                               case 'n':
+                                       data[j++] = '\n';
+                                       break;
+                               case 'r':
+                                       data[j++] = '\r';
+                                       break;
+                               case 't':
+                                       data[j++] = '\t';
+                                       break;
+                               case '\\':
+                                       data[j++] = '\\';
+                                       break;
+                               default:
+                                       data[j++] = data[i];
+                       }
+               } else {
+                       data[j++] = data[i];
+               }
+       }
+       data[j] = '\0';
+       return data;
+}
index 2345ed560d24ab694052fa19578a325f9af5e273..4bbe33d0fa351a1b9fba23f41bd2ac42a3f3287a 100644 (file)
@@ -132,6 +132,8 @@ char *fperfdata (const char *,
  int,
  double);
 
+char *np_escaped_string (const char *);
+
 /* The idea here is that, although not every plugin will use all of these, 
    most will or should.  Therefore, for consistency, these very common 
    options should have only these meanings throughout the overall suite */