From c58c53293c28f3cfd5f3e37d9833887a64dba5c4 Mon Sep 17 00:00:00 2001
From: Max Kellermann <max@musicpd.org>
Date: Sun, 7 Feb 2021 21:17:24 +0100
Subject: [PATCH] test/run_input: add option --seek

---
 test/run_input.cxx | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/test/run_input.cxx b/test/run_input.cxx
index 648efd6e1..0607dd3c6 100644
--- a/test/run_input.cxx
+++ b/test/run_input.cxx
@@ -56,6 +56,8 @@ struct CommandLine {
 
 	FromNarrowPath config_path;
 
+	std::size_t seek = 0;
+
 	std::size_t chunk_size = MAX_CHUNK_SIZE;
 
 	bool verbose = false;
@@ -67,6 +69,7 @@ enum Option {
 	OPTION_CONFIG,
 	OPTION_VERBOSE,
 	OPTION_SCAN,
+	OPTION_SEEK,
 	OPTION_CHUNK_SIZE,
 };
 
@@ -74,6 +77,7 @@ static constexpr OptionDef option_defs[] = {
 	{"config", 0, true, "Load a MPD configuration file"},
 	{"verbose", 'v', false, "Verbose logging"},
 	{"scan", 0, false, "Scan tags instead of reading raw data"},
+	{"seek", 0, true, "Start reading at this position"},
 	{"chunk-size", 0, true, "Read this number of bytes at a time"},
 };
 
@@ -108,6 +112,10 @@ ParseCommandLine(int argc, char **argv)
 			c.scan = true;
 			break;
 
+		case OPTION_SEEK:
+			c.seek = ParseSize(o.value);
+			break;
+
 		case OPTION_CHUNK_SIZE:
 			c.chunk_size = ParseSize(o.value);
 			if (c.chunk_size <= 0 || c.chunk_size > MAX_CHUNK_SIZE)
@@ -153,10 +161,14 @@ tag_save(FILE *file, const Tag &tag)
 }
 
 static int
-dump_input_stream(InputStream &is, FileDescriptor out, size_t chunk_size)
+dump_input_stream(InputStream &is, FileDescriptor out,
+		  offset_type seek, size_t chunk_size)
 {
 	std::unique_lock<Mutex> lock(is.mutex);
 
+	if (seek > 0)
+		is.Seek(lock, seek);
+
 	/* print meta data */
 
 	if (is.HasMimeType())
@@ -256,7 +268,7 @@ try {
 	Mutex mutex;
 	auto is = InputStream::OpenReady(c.uri, mutex);
 	return dump_input_stream(*is, FileDescriptor(STDOUT_FILENO),
-				 c.chunk_size);
+				 c.seek, c.chunk_size);
 } catch (...) {
 	PrintException(std::current_exception());
 	return EXIT_FAILURE;