1 #ifndef __XEN_STRING_H__
2 #define __XEN_STRING_H__
3 
4 #include <xen/types.h>	/* for size_t */
5 
6 /*
7  * Include machine specific inline routines
8  */
9 #include <asm/string.h>
10 
11 /*
12  * These string functions are considered too dangerous for normal use.
13  * Use safe_strcpy(), safe_strcat(), strlcpy(), strlcat() as appropriate.
14  */
15 #define strcpy  __xen_has_no_strcpy__
16 #define strcat  __xen_has_no_strcat__
17 #define strncpy __xen_has_no_strncpy__
18 #define strncat __xen_has_no_strncat__
19 
20 #ifndef __HAVE_ARCH_STRLCPY
21 size_t strlcpy(char *, const char *, size_t);
22 #endif
23 
24 #ifndef __HAVE_ARCH_STRLCAT
25 size_t strlcat(char *, const char *, size_t);
26 #endif
27 
28 #ifndef __HAVE_ARCH_STRCMP
29 int strcmp(const char *, const char *);
30 #define strcmp(s1, s2) __builtin_strcmp(s1, s2)
31 #endif
32 
33 #ifndef __HAVE_ARCH_STRNCMP
34 int strncmp(const char *, const char *, size_t);
35 #define strncmp(s1, s2, n) __builtin_strncmp(s1, s2, n)
36 #endif
37 
38 #ifndef __HAVE_ARCH_STRNICMP
39 int strnicmp(const char *, const char *, size_t);
40 #endif
41 
42 #ifndef __HAVE_ARCH_STRCASECMP
43 int strcasecmp(const char *, const char *);
44 #define strcasecmp(s1, s2) __builtin_strcasecmp(s1, s2)
45 #endif
46 
47 #ifndef __HAVE_ARCH_STRCHR
48 char *strchr(const char *, int);
49 #define strchr(s1, c) __builtin_strchr(s1, c)
50 #endif
51 
52 #ifndef __HAVE_ARCH_STRRCHR
53 char *strrchr(const char *, int);
54 #define strrchr(s1, c) __builtin_strrchr(s1, c)
55 #endif
56 
57 #ifndef __HAVE_ARCH_STRSTR
58 char *strstr(const char *, const char *);
59 #define strstr(s1, s2) __builtin_strstr(s1, s2)
60 #endif
61 
62 #ifndef __HAVE_ARCH_STRLEN
63 size_t strlen(const char *);
64 #define strlen(s1) __builtin_strlen(s1)
65 #endif
66 
67 #ifndef __HAVE_ARCH_STRNLEN
68 size_t strnlen(const char *, size_t);
69 #endif
70 
71 #ifndef __HAVE_ARCH_STRPBRK
72 char *strpbrk(const char *, const char *);
73 #endif
74 
75 #ifndef __HAVE_ARCH_STRSEP
76 char *strsep(char **, const char *);
77 #endif
78 
79 #ifndef __HAVE_ARCH_STRSPN
80 size_t strspn(const char *, const char *);
81 #endif
82 
83 
84 #ifndef __HAVE_ARCH_MEMSET
85 void *memset(void *, int, size_t);
86 #define memset(s, c, n) __builtin_memset(s, c, n)
87 #endif
88 
89 #ifndef __HAVE_ARCH_MEMCPY
90 void *memcpy(void *, const void *, size_t);
91 #define memcpy(d, s, n) __builtin_memcpy(d, s, n)
92 #endif
93 
94 #ifndef __HAVE_ARCH_MEMMOVE
95 void *memmove(void *, const void *, size_t);
96 #define memmove(d, s, n) __builtin_memmove(d, s, n)
97 #endif
98 
99 #ifndef __HAVE_ARCH_MEMSCAN
100 void *memscan(void *, int, size_t);
101 #endif
102 
103 #ifndef __HAVE_ARCH_MEMCMP
104 int memcmp(const void *, const void *, size_t);
105 #define memcmp(s1, s2, n) __builtin_memcmp(s1, s2, n)
106 #endif
107 
108 #ifndef __HAVE_ARCH_MEMCHR
109 void *memchr(const void *, int, size_t);
110 #define memchr(s, c, n) __builtin_memchr(s, c, n)
111 #endif
112 
113 #define is_char_array(x) __builtin_types_compatible_p(typeof(x), char[])
114 
115 /* safe_xxx always NUL-terminates and returns !=0 if result is truncated. */
116 #define safe_strcpy(d, s) ({                    \
117     BUILD_BUG_ON(!is_char_array(d));            \
118     (strlcpy(d, s, sizeof(d)) >= sizeof(d));    \
119 })
120 #define safe_strcat(d, s) ({                    \
121     BUILD_BUG_ON(!is_char_array(d));            \
122     (strlcat(d, s, sizeof(d)) >= sizeof(d));    \
123 })
124 
125 #endif /* __XEN_STRING_H__ */
126 /*
127  * Local variables:
128  * mode: C
129  * c-file-style: "BSD"
130  * c-basic-offset: 4
131  * indent-tabs-mode: nil
132  * End:
133  */
134