rsyslog/tests/mangle_qi.c
Rainer Gerhards cd329c3232
CI: user newer OS versions in CI workflow
also bump default development container to Ubuntu 24.04

This commit also contains some nitfixes that were detected
by the newer CI components. If it is just nitfixes, we do not
create separate commits for them.
2024-11-23 11:09:25 +01:00

114 lines
2.3 KiB
C

/* 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;
(void) 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;
}