svn commit: r314215 - head/sys/compat/linuxkpi/common/include/linux
Hans Petter Selasky
hselasky at FreeBSD.org
Fri Feb 24 17:36:57 UTC 2017
Author: hselasky
Date: Fri Feb 24 17:36:55 2017
New Revision: 314215
URL: https://svnweb.freebsd.org/changeset/base/314215
Log:
Implement more string functions in the LinuxKPI.
MFC after: 1 week
Sponsored by: Mellanox Technologies
Modified:
head/sys/compat/linuxkpi/common/include/linux/string.h
Modified: head/sys/compat/linuxkpi/common/include/linux/string.h
==============================================================================
--- head/sys/compat/linuxkpi/common/include/linux/string.h Fri Feb 24 17:03:14 2017 (r314214)
+++ head/sys/compat/linuxkpi/common/include/linux/string.h Fri Feb 24 17:36:55 2017 (r314215)
@@ -2,7 +2,7 @@
* Copyright (c) 2010 Isilon Systems, Inc.
* Copyright (c) 2010 iX Systems, Inc.
* Copyright (c) 2010 Panasas, Inc.
- * Copyright (c) 2013-2016 Mellanox Technologies, Ltd.
+ * Copyright (c) 2013-2017 Mellanox Technologies, Ltd.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -31,29 +31,111 @@
#ifndef _LINUX_STRING_H_
#define _LINUX_STRING_H_
+#include <sys/ctype.h>
+
#include <linux/types.h>
#include <linux/gfp.h>
#include <linux/slab.h>
+#include <linux/uaccess.h>
+#include <linux/err.h>
#include <sys/libkern.h>
#define strnicmp(...) strncasecmp(__VA_ARGS__)
+static inline int
+match_string(const char *const *table, int n, const char *key)
+{
+ int i;
+
+ for (i = 0; i != n && table[i] != NULL; i++) {
+ if (strcmp(table[i], key) == 0)
+ return (i);
+ }
+ return (-EINVAL);
+}
+
+static inline void *
+memdup_user(const void *ptr, size_t len)
+{
+ void *retval;
+ int error;
+
+ retval = malloc(len, M_KMALLOC, M_WAITOK);
+ error = linux_copyin(ptr, retval, len);
+ if (error != 0) {
+ free(retval, M_KMALLOC);
+ return (ERR_PTR(error));
+ }
+ return (retval);
+}
+
static inline void *
kmemdup(const void *src, size_t len, gfp_t gfp)
{
void *dst;
dst = kmalloc(len, gfp);
- if (dst)
+ if (dst != NULL)
memcpy(dst, src, len);
return (dst);
}
+static inline char *
+kstrdup(const char *string, gfp_t gfp)
+{
+ char *retval;
+ size_t len;
+
+ len = strlen(string) + 1;
+ retval = kmalloc(len, gfp);
+ if (retval != NULL)
+ memcpy(retval, string, len);
+ return (retval);
+}
+
+static inline char *
+kstrndup(const char *string, size_t len, gfp_t gfp)
+{
+ char *retval;
+
+ retval = kmalloc(len + 1, gfp);
+ if (retval != NULL)
+ strncpy(retval, string, len);
+ return (retval);
+}
+
static inline const char *
kstrdup_const(const char *src, gfp_t gfp)
{
return (kmemdup(src, strlen(src) + 1, gfp));
}
-#endif /* _LINUX_STRING_H_ */
+static inline char *
+skip_spaces(const char *str)
+{
+ while (isspace(*str))
+ ++str;
+ return (__DECONST(char *, str));
+}
+
+static inline void *
+memchr_inv(const void *start, int c, size_t length)
+{
+ const u8 *ptr;
+ const u8 *end;
+ u8 ch;
+
+ ch = c;
+ ptr = start;
+ end = ptr + length;
+
+ while (ptr != end) {
+ if (*ptr != ch)
+ return (__DECONST(void *, ptr));
+ ptr++;
+ }
+ return (NULL);
+}
+
+#endif /* _LINUX_STRING_H_ */
More information about the svn-src-all
mailing list