jcs's openbsd hax
openbsd
at jcs 139 lines 2.4 kB view raw
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