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_ */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to