summaryrefslogtreecommitdiffstats
path: root/tests/mangle_qi.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/mangle_qi.c')
-rw-r--r--tests/mangle_qi.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/tests/mangle_qi.c b/tests/mangle_qi.c
new file mode 100644
index 0000000..3775c96
--- /dev/null
+++ b/tests/mangle_qi.c
@@ -0,0 +1,113 @@
+/* rsyslog testbench tool to mangle .qi files
+ *
+ * Copyright (C) 2016 by Rainer Gerhards
+ * Released uner ASL 2.0
+ */
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <string.h>
+
+static int debug = 0;
+
+void
+usage(void)
+{
+ fprintf(stderr, "mangle_qi -d -q <.qi-file>\n"
+ "-d enables debug messages\n");
+ exit(1);
+}
+
+void
+processQI(FILE *const __restrict__ qi)
+{
+ char lnbuf[4096];
+ char propname[64];
+ int rectype;
+ int length;
+ int queuesize;
+ int i;
+ int c;
+ fgets(lnbuf, sizeof(lnbuf), qi);
+ fputs(lnbuf, stdout);
+ /* we now read the queue size line */
+ /* note: this is quick and dirty, no error checks
+ * are done!
+ */
+ fgetc(qi); /* skip '+' */
+ for(i = 0 ; (c = fgetc(qi)) != ':' ; ++i) {
+ propname[i] = c;
+ }
+ propname[i] = '\0';
+ if(strcmp(propname, "iQueueSize")) {
+ fprintf(stderr, ".qi file format unknown: line 2 does "
+ "not contain iQueueSize property, instead '%s'\n",
+ propname);
+ exit(1);
+ }
+
+ rectype = 0;
+ for(c = fgetc(qi) ; isdigit(c) ; c = fgetc(qi))
+ rectype = rectype * 10 + c - '0';
+
+ length = 0;
+ for(c = fgetc(qi) ; isdigit(c) ; c = fgetc(qi))
+ length = length * 10 + c - '0';
+
+ queuesize = 0;
+ for(c = fgetc(qi) ; isdigit(c) ; c = fgetc(qi))
+ queuesize = queuesize * 10 + c - '0';
+
+ int maxval_for_length = 10;
+ for(i = 1 ; i < length ; ++i)
+ maxval_for_length *= 10; /* simulate int-exp() */
+
+ if(debug) {
+ fprintf(stderr, "rectype: %d\n", rectype);
+ fprintf(stderr, "length: %d\n", length);
+ fprintf(stderr, "queuesize: %d\n", queuesize);
+ fprintf(stderr, "maxval_for_length: %d\n", maxval_for_length);
+ }
+
+ queuesize += 1; /* fake invalid queue size */
+ if(queuesize > maxval_for_length)
+ ++length;
+
+ /* ready to go, write mangled queue size */
+ printf("+%s:%d:%d:%d:", propname, rectype, length, queuesize);
+ /* copy rest of file */
+ while((c = fgetc(qi)) != EOF)
+ putchar(c);
+}
+
+int
+main(int argc, char *argv[])
+{
+ char *qifile = NULL;
+ FILE *qi;
+ int opt;
+ while((opt = getopt(argc, argv, "dq:")) != -1) {
+ switch (opt) {
+ case 'q': qifile = optarg;
+ break;
+ case 'd': debug = 1;
+ break;
+ default: usage();
+ break;
+ }
+ }
+
+ if(qifile == NULL) {
+ fprintf(stderr, "ERROR: -q option MUST be specified\n");
+ usage();
+ }
+
+ if((qi = fopen(qifile, "r")) == NULL) {
+ perror(qifile);
+ exit(1);
+ }
+ processQI(qi);
+ return 0;
+}