Inter-revision diff: patch 1

Comparing v4 (message) to v3 (message)

--- v4
+++ v3
@@ -7,100 +7,72 @@
 v3:
 - Addressed comments from Will
 - Added capability to have src == dst
-v4:
-- Add cmdline_strlcpy()
-- Removed cmdline_build() macro, __cmdline_build() becomes cmdline_build()
-- Fixed the destination length to COMMAND_LINE_SIZE
-- Truncate at a space not in a quote when too long
-- Added a message when forcing the command line
 ---
- include/linux/cmdline.h | 79 +++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 79 insertions(+)
+ include/linux/cmdline.h | 57 +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 57 insertions(+)
  create mode 100644 include/linux/cmdline.h
 
 diff --git a/include/linux/cmdline.h b/include/linux/cmdline.h
 new file mode 100644
-index 000000000000..a0773dc365c7
+index 000000000000..dea87edd41be
 --- /dev/null
 +++ b/include/linux/cmdline.h
-@@ -0,0 +1,79 @@
+@@ -0,0 +1,57 @@
 +/* SPDX-License-Identifier: GPL-2.0 */
 +#ifndef _LINUX_CMDLINE_H
 +#define _LINUX_CMDLINE_H
 +
 +#include <linux/string.h>
-+#include <linux/printk.h>
-+#include <asm/setup.h>
 +
-+/* Allow users to override strlcat/strlcpy, powerpc can't use strings so early*/
++/* Allow architectures to override strlcat, powerpc can't use strings so early */
 +#ifndef cmdline_strlcat
 +#define cmdline_strlcat strlcat
-+#define cmdline_strlcpy strlcpy
 +#endif
 +
 +/*
 + * This function will append or prepend a builtin command line to the command
 + * line provided by the bootloader. Kconfig options can be used to alter
 + * the behavior of this builtin command line.
-+ * @dst: The destination of the final command line (Min. size COMMAND_LINE_SIZE)
-+ * @src: The starting string or NULL if there isn't one. Must not equal dst.
-+ * Returns: false if the string was truncated, true otherwise
++ * @dst: The destination of the final appended/prepended string.
++ * @src: The starting string or NULL if there isn't one.
++ * @len: the length of dest buffer.
 + */
-+static __always_inline bool __cmdline_build(char *dst, const char *src)
++static __always_inline void __cmdline_build(char *dst, const char *src, size_t len)
 +{
-+	int len;
-+	char *ptr, *last_space;
-+	bool in_quote = false;
++	if (!len || src == dst)
++		return;
 +
-+	if (IS_ENABLED(CONFIG_CMDLINE_FORCE))
-+		src = NULL;
++	if (IS_ENABLED(CONFIG_CMDLINE_FORCE) || !src) {
++		dst[0] = 0;
++		cmdline_strlcat(dst, CONFIG_CMDLINE, len);
++		return;
++	}
 +
-+	dst[0] = 0;
++	if (dst != src)
++		dst[0] = 0;
 +
 +	if (IS_ENABLED(CONFIG_CMDLINE_PREPEND))
-+		len = cmdline_strlcat(dst, CONFIG_CMDLINE " ", COMMAND_LINE_SIZE);
++		cmdline_strlcat(dst, CONFIG_CMDLINE " ", len);
 +
-+	len = cmdline_strlcat(dst, src, COMMAND_LINE_SIZE);
++	cmdline_strlcat(dst, src, len);
 +
 +	if (IS_ENABLED(CONFIG_CMDLINE_EXTEND))
-+		len = cmdline_strlcat(dst, " " CONFIG_CMDLINE, COMMAND_LINE_SIZE);
-+
-+	if (len < COMMAND_LINE_SIZE - 1)
-+		return true;
-+
-+	for (ptr = dst; *ptr; ptr++) {
-+		if (*ptr == '"')
-+			in_quote = !in_quote;
-+		if (*ptr == ' ' && !in_quote)
-+			last_space = ptr;
-+	}
-+	if (last_space)
-+		*last_space = 0;
-+
-+	return false;
++		cmdline_strlcat(dst, " " CONFIG_CMDLINE, len);
 +}
 +
-+/*
-+ * This function will append or prepend a builtin command line to the command
-+ * line provided by the bootloader. Kconfig options can be used to alter
-+ * the behavior of this builtin command line.
-+ * @dst: The destination of the final command line (Min. size COMMAND_LINE_SIZE)
-+ * @src: The starting string or NULL if there isn't one.
-+ */
-+static __always_inline void cmdline_build(char *dst, const char *src)
-+{
-+	static char tmp[COMMAND_LINE_SIZE] __initdata;
-+
-+	if (src == dst) {
-+		cmdline_strlcpy(tmp, src, COMMAND_LINE_SIZE);
-+		src = tmp;
-+	}
-+	if (!__cmdline_build(dst, src))
-+		pr_warn("Command line is too long, it has been truncated\n");
-+
-+	if (IS_ENABLED(CONFIG_CMDLINE_FORCE))
-+		pr_info("Forcing kernel command line to: %s\n", dst);
-+}
++#define cmdline_build(dst, src, len) do {				\
++	char *__c_dst = (dst);						\
++	const char *__c_src = (src);					\
++									\
++	if (__c_src == __c_dst) {					\
++		static char __c_tmp[COMMAND_LINE_SIZE] __initdata = "";	\
++									\
++		cmdline_strlcat(__c_tmp, __c_src, COMMAND_LINE_SIZE);	\
++		__cmdline_build(__c_dst, __c_tmp, (len));		\
++	} else {							\
++		__cmdline_build(__c_dst, __c_src, (len));		\
++	}								\
++} while (0)
 +
 +#endif /* _LINUX_CMDLINE_H */
 -- 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help