jcs's openbsd hax
openbsd
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#include <linux/err.h>
14
15void *memchr_inv(const void *, int, size_t);
16
17static inline bool
18mem_is_zero(const void *b, size_t len)
19{
20 return (memchr_inv(b, 0, len) == NULL);
21}
22
23static inline void *
24memset32(uint32_t *b, uint32_t c, size_t len)
25{
26 uint32_t *dst = b;
27 while (len--)
28 *dst++ = c;
29 return b;
30}
31
32static inline void *
33memset64(uint64_t *b, uint64_t c, size_t len)
34{
35 uint64_t *dst = b;
36 while (len--)
37 *dst++ = c;
38 return b;
39}
40
41static inline void *
42memset_p(void **p, void *v, size_t n)
43{
44#ifdef __LP64__
45 return memset64((uint64_t *)p, (uintptr_t)v, n);
46#else
47 return memset32((uint32_t *)p, (uintptr_t)v, n);
48#endif
49}
50
51static inline void *
52kmemdup(const void *src, size_t len, int flags)
53{
54 void *p = malloc(len, M_DRM, flags);
55 if (p)
56 memcpy(p, src, len);
57 return (p);
58}
59
60static inline void *
61kmemdup_array(const void *src, size_t nemb, size_t size, int flags)
62{
63 void *p = mallocarray(nemb, size, M_DRM, flags);
64 if (p)
65 memcpy(p, src, nemb * size);
66 return (p);
67}
68
69static inline void *
70memdup_array_user(const void *src, size_t nemb, size_t size)
71{
72 void *p = mallocarray(nemb, size, M_DRM, M_WAITOK | M_CANFAIL);
73 if (p == NULL)
74 return ERR_PTR(-ENOMEM);
75
76 if (copyin(src, p, nemb * size) != 0) {
77 free(p, M_DRM, nemb * size);
78 return ERR_PTR(-EFAULT);
79 }
80 return (p);
81}
82
83static inline void *
84kstrdup(const char *str, int flags)
85{
86 size_t len;
87 char *p;
88
89 if (str == NULL)
90 return NULL;
91
92 len = strlen(str) + 1;
93 p = malloc(len, M_DRM, flags);
94 if (p)
95 memcpy(p, str, len);
96 return (p);
97}
98
99static inline const char *
100kstrdup_const(const char *str, int flags)
101{
102 return kstrdup(str, flags);
103}
104
105void kfree_const(const void *);
106
107static inline int
108match_string(const char * const *array, size_t n, const char *str)
109{
110 int i;
111
112 for (i = 0; i < n; i++) {
113 if (array[i] == NULL)
114 break;
115 if (!strcmp(array[i], str))
116 return i;
117 }
118
119 return -EINVAL;
120}
121
122static inline ssize_t
123strscpy(char *dst, const char *src, size_t dstsize)
124{
125 ssize_t r;
126 r = strlcpy(dst, src, dstsize);
127 if (dstsize == 0 || r >= dstsize)
128 return -E2BIG;
129 return r;
130}
131
132static inline ssize_t
133strscpy_pad(char *dst, const char *src, size_t dstsize)
134{
135 memset(dst, 0, dstsize);
136 return strscpy(dst, src, dstsize);
137}
138
139#endif