aboutsummaryrefslogtreecommitdiff
path: root/sys/compat/linuxkpi/common/include/linux
diff options
context:
space:
mode:
authorVladimir Kondratyev <wulf@FreeBSD.org>2021-07-05 00:20:42 +0000
committerVladimir Kondratyev <wulf@FreeBSD.org>2021-07-05 00:20:42 +0000
commit019391bf852771070cb739900f9e20ae6c41c746 (patch)
tree807246fb56bd6578050ef1abeb980f5164c426ff /sys/compat/linuxkpi/common/include/linux
parent98a6984a9e10c5c1677643eb4d9a758e3af131da (diff)
downloadsrc-019391bf852771070cb739900f9e20ae6c41c746.tar.gz
src-019391bf852771070cb739900f9e20ae6c41c746.zip
LinuxKPI: Implement strscpy
strscpy copies the src string, or as much of it as fits, into the dst buffer. The dst buffer is always NUL terminated, unless it's zero-sized. strscpy returns the number of characters copied (not including the trailing NUL) or -E2BIG if len is 0 or src was truncated. Currently drm-kmod replaces strscpy with strncpy that is not quite correct as strncpy does not NUL-terminate truncated strings and returns different values on exit. Reviewed by: hselasky, imp, manu MFC after: 2 weeks Differential revision: https://reviews.freebsd.org/D31005
Diffstat (limited to 'sys/compat/linuxkpi/common/include/linux')
-rw-r--r--sys/compat/linuxkpi/common/include/linux/string.h16
1 files changed, 16 insertions, 0 deletions
diff --git a/sys/compat/linuxkpi/common/include/linux/string.h b/sys/compat/linuxkpi/common/include/linux/string.h
index 39201e203162..659a48d93596 100644
--- a/sys/compat/linuxkpi/common/include/linux/string.h
+++ b/sys/compat/linuxkpi/common/include/linux/string.h
@@ -167,4 +167,20 @@ str_has_prefix(const char *str, const char *prefix)
return (strncmp(str, prefix, len) == 0 ? len : 0);
}
+static inline ssize_t
+strscpy(char* dst, const char* src, size_t len)
+{
+ size_t i;
+
+ if (len <= INT_MAX) {
+ for (i = 0; i < len; i++)
+ if ('\0' == (dst[i] = src[i]))
+ return ((ssize_t)i);
+ if (i != 0)
+ dst[--i] = '\0';
+ }
+
+ return (-E2BIG);
+}
+
#endif /* _LINUX_STRING_H_ */