From 18c6850fe1d06a31834da340387f94a6940197b9 Mon Sep 17 00:00:00 2001
From: David Sterba <dsterba@suse.com>
Date: Thu, 16 Jun 2016 13:27:18 +0200
Subject: [PATCH] btrfs-progs: new helper for option parsing, more permissive
 for "no options"

Signed-off-by: David Sterba <dsterba@suse.com>
---
 utils.c | 18 ++++++++++++++++++
 utils.h |  2 ++
 2 files changed, 20 insertions(+)

diff --git a/utils.c b/utils.c
index 72dc7d20..578fdb04 100644
--- a/utils.c
+++ b/utils.c
@@ -3930,6 +3930,24 @@ void clean_args_no_options(int argc, char *argv[], const char * const *usagestr)
 	}
 }
 
+/*
+ * Same as clean_args_no_options but pass through arguments that could look
+ * like short options. Eg. reisze which takes a negative resize argument like
+ * '-123M' .
+ *
+ * This accepts only two forms:
+ * - "-- option1 option2 ..."
+ * - "option1 option2 ..."
+ */
+void clean_args_no_options_relaxed(int argc, char *argv[], const char * const *usagestr)
+{
+	if (argc <= 1)
+		return;
+
+	if (strcmp(argv[1], "--") == 0)
+		optind = 2;
+}
+
 /* Subvolume helper functions */
 /*
  * test if name is a correct subvolume name
diff --git a/utils.h b/utils.h
index c79f81e6..98bfb34d 100644
--- a/utils.h
+++ b/utils.h
@@ -303,6 +303,8 @@ const char *get_argv0_buf(void);
 
 unsigned int get_unit_mode_from_arg(int *argc, char *argv[], int df_mode);
 void clean_args_no_options(int argc, char *argv[], const char * const *usage);
+void clean_args_no_options_relaxed(int argc, char *argv[],
+		const char * const *usagestr);
 int string_is_numerical(const char *str);
 
 __attribute__ ((format (printf, 1, 2)))