1 /* Public domain. */ 2 3#ifndef _LINUX_STRING_H 4#define _LINUX_STRING_H 5 6#include <sys/types.h> 7#include <sys/systm.h> 8#include <sys/malloc.h> 9#include <sys/stdint.h> 10#include <sys/errno.h> 11 12#include <linux/compiler.h> 13 14 void *memchr_inv(const void *, int, size_t); 15 16 static inline bool 17 mem_is_zero(const void *b, size_t len) 18{ 19 return (memchr_inv(b, 0, len) == NULL); 20} 21 22 static inline void * 23 memset32(uint32_t *b, uint32_t c, size_t len) 24{ 25 uint32_t *dst = b; 26 while (len--) 27 *dst++ = c; 28 return b; 29} 30 31 static inline void * 32 memset64(uint64_t *b, uint64_t c, size_t len) 33{ 34 uint64_t *dst = b; 35 while (len--) 36 *dst++ = c; 37 return b; 38} 39 40 static inline void * 41 memset_p(void **p, void *v, size_t n) 42{ 43#ifdef __LP64__ 44 return memset64((uint64_t *)p, (uintptr_t)v, n); 45#else 46 return memset32((uint32_t *)p, (uintptr_t)v, n); 47#endif 48} 49 50 static inline void * 51 kmemdup(const void *src, size_t len, int flags) 52{ 53 void *p = malloc(len, M_DRM, flags); 54 if (p) 55 memcpy(p, src, len); 56 return (p); 57} 58 59 static inline void * 60 kmemdup_array(const void *src, size_t nemb, size_t size, int flags) 61{ 62 void *p = mallocarray(nemb, size, M_DRM, flags); 63 if (p) 64 memcpy(p, src, nemb * size); 65 return (p); 66} 67 68 static inline void * 69 kstrdup(const char *str, int flags) 70{ 71 size_t len; 72 char *p; 73 74 if (str == NULL) 75 return NULL; 76 77 len = strlen(str) + 1; 78 p = malloc(len, M_DRM, flags); 79 if (p) 80 memcpy(p, str, len); 81 return (p); 82} 83 84 static inline const char * 85 kstrdup_const(const char *str, int flags) 86{ 87 return kstrdup(str, flags); 88} 89 90 void kfree_const(const void *); 91 92 static inline int 93 match_string(const char * const *array, size_t n, const char *str) 94{ 95 int i; 96 97 for (i = 0; i < n; i++) { 98 if (array[i] == NULL) 99 break; 100 if (!strcmp(array[i], str)) 101 return i; 102 } 103 104 return -EINVAL; 105} 106 107 static inline ssize_t 108 strscpy(char *dst, const char *src, size_t dstsize) 109{ 110 ssize_t r; 111 r = strlcpy(dst, src, dstsize); 112 if (dstsize == 0 || r >= dstsize) 113 return -E2BIG; 114 return r; 115} 116 117 static inline ssize_t 118 strscpy_pad(char *dst, const char *src, size_t dstsize) 119{ 120 memset(dst, 0, dstsize); 121 return strscpy(dst, src, dstsize); 122} 123 124#endif 125