linux-rt-users.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Daniel Wagner <dwagner@suse.de>
To: Clark Williams <williams@redhat.com>, John Kacur <jkacur@redhat.com>
Cc: linux-rt-users@vger.kernel.org, Daniel Wagner <dwagner@suse.de>
Subject: [PATCH rt-tests v3 04/33] rt-util: Add rt_init function
Date: Sat, 20 Mar 2021 19:38:00 +0100	[thread overview]
Message-ID: <20210320183829.1318-5-dwagner@suse.de> (raw)
In-Reply-To: <20210320183829.1318-1-dwagner@suse.de>

rt_init() should be called as first in the test program.
The main job for this function is to copy the command line
before getopt() runs. By default, getopt_long() permutes
the contents of argv as it scans, so that eventually all the
nonoptions are at the end. This is confusing in the JSON
output, thus copy the command line before we call getopt_long().

Signed-off-by: Daniel Wagner <dwagner@suse.de>
---
 src/include/rt-utils.h |  2 ++
 src/lib/rt-utils.c     | 47 +++++++++++++++++++++++++++++++++++-------
 2 files changed, 42 insertions(+), 7 deletions(-)

diff --git a/src/include/rt-utils.h b/src/include/rt-utils.h
index 36af92b170df..1dbd3f1dd8e3 100644
--- a/src/include/rt-utils.h
+++ b/src/include/rt-utils.h
@@ -80,6 +80,8 @@ static inline int64_t calctime(struct timespec t)
 	return time;
 }
 
+void rt_init(int argc, char *argv[]);
+
 void rt_write_json(const char *filename, int argc, char *argv[],
 		   void (*cb)(FILE *, void *),
 		   void *data);
diff --git a/src/lib/rt-utils.c b/src/lib/rt-utils.c
index 00907c573d6a..8f0e0943b137 100644
--- a/src/lib/rt-utils.c
+++ b/src/lib/rt-utils.c
@@ -29,12 +29,15 @@
 #include "rt-error.h"
 
 #define  TRACEBUFSIZ  1024
+#define  MAX_COMMAND_LINE 4096
 
 static char debugfileprefix[MAX_PATH];
 static char *fileprefix;
 static int trace_fd = -1;
 static int tracemark_fd = -1;
 static __thread char tracebuf[TRACEBUFSIZ];
+static char test_cmdline[MAX_COMMAND_LINE];
+static int rt_init_run;
 
 /*
  * Finds the tracing directory in a mounted debugfs
@@ -486,6 +489,34 @@ void disable_trace_mark(void)
 	close_tracemark_fd();
 }
 
+void rt_init(int argc, char *argv[])
+{
+	int offset = 0;
+	int len, i;
+
+	test_cmdline[0] = '\0';
+
+	/*
+	 * getopt_long() permutes the contents of argv as it scans, so
+	 * that eventually all the nonoptions are at the end. Make a
+	 * copy before calling getopt_long().
+	 */
+	for (i = 0; i < argc;) {
+		len = strlen(argv[i]);
+		if (offset + len + 1 >= MAX_COMMAND_LINE)
+			break;
+
+		strcat(test_cmdline, argv[i]);
+		i++;
+		if (i < argc)
+			strcat(test_cmdline, " ");
+
+		offset += len + 1;
+	}
+
+	rt_init_run = 1;
+}
+
 static char *get_cmdline(int argc, char *argv[])
 {
 	char *cmdline;
@@ -519,7 +550,7 @@ void rt_write_json(const char *filename, int argc, char *argv[],
 	struct timeval tv;
 	char tsbuf[64];
 	struct tm *tm;
-	char *cmdline;
+	char *cmdline = NULL;
 	FILE *f, *s;
 	time_t t;
 	size_t n;
@@ -533,10 +564,11 @@ void rt_write_json(const char *filename, int argc, char *argv[],
 			err_exit(errno, "Failed to open '%s'\n", filename);
 	}
 
-	cmdline = get_cmdline(argc, argv);
-	if (!cmdline)
-		err_exit(ENOMEM, "get_cmdline()");
-
+	if (!rt_init_run) {
+		cmdline = get_cmdline(argc, argv);
+		if (!cmdline)
+			err_exit(ENOMEM, "get_cmdline()");
+	}
 
 	gettimeofday(&tv, NULL);
 	t = tv.tv_sec;
@@ -557,7 +589,7 @@ void rt_write_json(const char *filename, int argc, char *argv[],
 
 	fprintf(f, "{\n");
 	fprintf(f, "  \"file_version\": 1,\n");
-	fprintf(f, "  \"cmdline:\": \"%s\",\n", cmdline);
+	fprintf(f, "  \"cmdline:\": \"%s\",\n", rt_init_run? test_cmdline : cmdline);
 	fprintf(f, "  \"rt_test_version:\": \"%1.2f\",\n", VERSION);
 	fprintf(f, "  \"finished\": \"%s\",\n", tsbuf);
 	fprintf(f, "  \"sysinfo\": {\n");
@@ -573,7 +605,8 @@ void rt_write_json(const char *filename, int argc, char *argv[],
 
 	fprintf(f, "}\n");
 
-	free(cmdline);
+	if (!rt_init_run)
+		free(cmdline);
 
 	if (!filename || strcmp("-", filename))
 		fclose(f);
-- 
2.30.2


  parent reply	other threads:[~2021-03-20 18:39 UTC|newest]

Thread overview: 73+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-20 18:37 [PATCH rt-tests v3 00/33] JSON cleanups and more tests updated Daniel Wagner
2021-03-20 18:37 ` [PATCH rt-tests v3 01/33] cyclictest: Remove unused include header Daniel Wagner
2021-05-07 16:17   ` John Kacur
2021-03-20 18:37 ` [PATCH rt-tests v3 02/33] cyclicdeadline: " Daniel Wagner
2021-05-07 16:19   ` John Kacur
2021-03-20 18:37 ` [PATCH rt-tests v3 03/33] signaltest: Add missing --output usage info Daniel Wagner
2021-05-07 16:26   ` John Kacur
2021-03-20 18:38 ` Daniel Wagner [this message]
2021-05-07 16:27   ` [PATCH rt-tests v3 04/33] rt-util: Add rt_init function John Kacur
2021-05-12  7:30     ` Daniel Wagner
2021-03-20 18:38 ` [PATCH rt-tests v3 05/33] cyclictest: Initialize rt-util Daniel Wagner
2021-05-07 16:28   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 06/33] oslat: " Daniel Wagner
2021-05-07 16:29   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 07/33] pmqtest: " Daniel Wagner
2021-05-07 16:29   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 08/33] ptsematest: " Daniel Wagner
2021-05-07 16:30   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 09/33] rt-migrate-test: " Daniel Wagner
2021-05-07 16:31   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 10/33] cyclicdeadline: " Daniel Wagner
2021-05-07 16:31   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 11/33] signaltest: " Daniel Wagner
2021-05-07 16:32   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 12/33] sigwaittest: " Daniel Wagner
2021-05-07 16:33   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 13/33] svematest: " Daniel Wagner
2021-05-07 16:34   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 14/33] rt-util: Remove superfluous arguments from rt_write_json Daniel Wagner
2021-05-07 16:36   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 15/33] rt-util: Introduce rt_test_start() Daniel Wagner
2021-05-07 16:40   ` John Kacur
2021-05-12  7:33     ` Daniel Wagner
2021-03-20 18:38 ` [PATCH rt-tests v3 16/33] cyclictest: Record start of test execution Daniel Wagner
2021-05-07 16:41   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 17/33] oslat: " Daniel Wagner
2021-05-07 16:41   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 18/33] pmqtest: " Daniel Wagner
2021-05-07 16:43   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 19/33] ptesematest: " Daniel Wagner
2021-05-07 16:43   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 20/33] rt-migrate-test: " Daniel Wagner
2021-05-07 16:44   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 21/33] cyclicdeadline: " Daniel Wagner
2021-05-07 16:45   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 22/33] signaltest: " Daniel Wagner
2021-05-07 16:45   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 23/33] sigwaittest: " Daniel Wagner
2021-05-07 16:46   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 24/33] svsematest: " Daniel Wagner
2021-05-07 16:46   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 25/33] rt-util: Add return_code to common section of JSON output Daniel Wagner
2021-05-07 16:49   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 26/33] pip_stress: Move test result output to main Daniel Wagner
2021-05-07 16:55   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 27/33] pip_stress: Return failure code if test fails Daniel Wagner
2021-05-07 16:54   ` John Kacur
2021-05-12  7:35     ` Daniel Wagner
2021-05-13 19:27       ` John Kacur
2021-05-14  6:58         ` Daniel Wagner
2021-03-20 18:38 ` [PATCH rt-tests v3 28/33] pip_stress: Prepare arg parser to accept only long options Daniel Wagner
2021-05-07 16:55   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 29/33] pip_stress: Add JSON output feature Daniel Wagner
2021-05-07 16:58   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 30/33] pi_stress: Prepare command line parser for long options only Daniel Wagner
2021-05-07 16:58   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 31/33] pi_stress: Add JSON output feature Daniel Wagner
2021-05-07 16:59   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 32/33] ssdd: Add quiet command line option Daniel Wagner
2021-05-07 17:00   ` John Kacur
2021-03-20 18:38 ` [PATCH rt-tests v3 33/33] ssdd: Add JSON output feature Daniel Wagner
2021-05-07 17:00   ` John Kacur
2021-03-22 15:50 ` [PATCH rt-tests v3 00/33] JSON cleanups and more tests updated John Kacur

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210320183829.1318-5-dwagner@suse.de \
    --to=dwagner@suse.de \
    --cc=jkacur@redhat.com \
    --cc=linux-rt-users@vger.kernel.org \
    --cc=williams@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).