xref: /freebsd-src/sys/compat/linuxkpi/common/include/linux/kstrtox.h (revision db42bd1f71b1a29b392aacbd5b7aaca4c8d7e85d)
1a97f3a9eSVladimir Kondratyev /*-
2a97f3a9eSVladimir Kondratyev  * Copyright (c) 2010 Isilon Systems, Inc.
3a97f3a9eSVladimir Kondratyev  * Copyright (c) 2010 iX Systems, Inc.
4a97f3a9eSVladimir Kondratyev  * Copyright (c) 2010 Panasas, Inc.
5a97f3a9eSVladimir Kondratyev  * Copyright (c) 2017-2018 Mellanox Technologies, Ltd.
6a97f3a9eSVladimir Kondratyev  * All rights reserved.
7a97f3a9eSVladimir Kondratyev  * Copyright (c) 2018 Johannes Lundberg <johalun0@gmail.com>
8a97f3a9eSVladimir Kondratyev  * Copyright (c) 2020-2022 The FreeBSD Foundation
9a97f3a9eSVladimir Kondratyev  * Copyright (c) 2021 Vladimir Kondratyev <wulf@FreeBSD.org>
10d207a2deSVladimir Kondratyev  * Copyright (c) 2023 Serenity Cyber Security, LLC
11a97f3a9eSVladimir Kondratyev  *
12a97f3a9eSVladimir Kondratyev  * Portions of this software were developed by Bjoern A. Zeeb and
13a97f3a9eSVladimir Kondratyev  * Emmanuel Vadot under sponsorship from the FreeBSD Foundation.
14a97f3a9eSVladimir Kondratyev  *
15a97f3a9eSVladimir Kondratyev  * Redistribution and use in source and binary forms, with or without
16a97f3a9eSVladimir Kondratyev  * modification, are permitted provided that the following conditions
17a97f3a9eSVladimir Kondratyev  * are met:
18a97f3a9eSVladimir Kondratyev  * 1. Redistributions of source code must retain the above copyright
19a97f3a9eSVladimir Kondratyev  *    notice unmodified, this list of conditions, and the following
20a97f3a9eSVladimir Kondratyev  *    disclaimer.
21a97f3a9eSVladimir Kondratyev  * 2. Redistributions in binary form must reproduce the above copyright
22a97f3a9eSVladimir Kondratyev  *    notice, this list of conditions and the following disclaimer in the
23a97f3a9eSVladimir Kondratyev  *    documentation and/or other materials provided with the distribution.
24a97f3a9eSVladimir Kondratyev  *
25a97f3a9eSVladimir Kondratyev  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
26a97f3a9eSVladimir Kondratyev  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
27a97f3a9eSVladimir Kondratyev  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
28a97f3a9eSVladimir Kondratyev  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
29a97f3a9eSVladimir Kondratyev  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30a97f3a9eSVladimir Kondratyev  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
31a97f3a9eSVladimir Kondratyev  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
32a97f3a9eSVladimir Kondratyev  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
33a97f3a9eSVladimir Kondratyev  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
34a97f3a9eSVladimir Kondratyev  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35a97f3a9eSVladimir Kondratyev  */
36a97f3a9eSVladimir Kondratyev 
37a97f3a9eSVladimir Kondratyev #ifndef	_LINUXKPI_LINUX_KSTRTOX_H_
38a97f3a9eSVladimir Kondratyev #define	_LINUXKPI_LINUX_KSTRTOX_H_
39a97f3a9eSVladimir Kondratyev 
40a97f3a9eSVladimir Kondratyev #include <sys/types.h>
41a97f3a9eSVladimir Kondratyev #include <sys/errno.h>
42a97f3a9eSVladimir Kondratyev #include <sys/libkern.h>
43a97f3a9eSVladimir Kondratyev 
44a97f3a9eSVladimir Kondratyev #include <linux/compiler.h>
45a97f3a9eSVladimir Kondratyev #include <linux/types.h>
46a97f3a9eSVladimir Kondratyev 
47a97f3a9eSVladimir Kondratyev #include <asm/uaccess.h>
48a97f3a9eSVladimir Kondratyev 
49a97f3a9eSVladimir Kondratyev static inline unsigned long long
simple_strtoull(const char * cp,char ** endp,unsigned int base)50a97f3a9eSVladimir Kondratyev simple_strtoull(const char *cp, char **endp, unsigned int base)
51a97f3a9eSVladimir Kondratyev {
52a97f3a9eSVladimir Kondratyev 	return (strtouq(cp, endp, base));
53a97f3a9eSVladimir Kondratyev }
54a97f3a9eSVladimir Kondratyev 
55a97f3a9eSVladimir Kondratyev static inline long long
simple_strtoll(const char * cp,char ** endp,unsigned int base)56a97f3a9eSVladimir Kondratyev simple_strtoll(const char *cp, char **endp, unsigned int base)
57a97f3a9eSVladimir Kondratyev {
58a97f3a9eSVladimir Kondratyev 	return (strtoq(cp, endp, base));
59a97f3a9eSVladimir Kondratyev }
60a97f3a9eSVladimir Kondratyev 
61a97f3a9eSVladimir Kondratyev static inline unsigned long
simple_strtoul(const char * cp,char ** endp,unsigned int base)62a97f3a9eSVladimir Kondratyev simple_strtoul(const char *cp, char **endp, unsigned int base)
63a97f3a9eSVladimir Kondratyev {
64a97f3a9eSVladimir Kondratyev 	return (strtoul(cp, endp, base));
65a97f3a9eSVladimir Kondratyev }
66a97f3a9eSVladimir Kondratyev 
67a97f3a9eSVladimir Kondratyev static inline long
simple_strtol(const char * cp,char ** endp,unsigned int base)68a97f3a9eSVladimir Kondratyev simple_strtol(const char *cp, char **endp, unsigned int base)
69a97f3a9eSVladimir Kondratyev {
70a97f3a9eSVladimir Kondratyev 	return (strtol(cp, endp, base));
71a97f3a9eSVladimir Kondratyev }
72a97f3a9eSVladimir Kondratyev 
73a97f3a9eSVladimir Kondratyev static inline int
kstrtoul(const char * cp,unsigned int base,unsigned long * res)74a97f3a9eSVladimir Kondratyev kstrtoul(const char *cp, unsigned int base, unsigned long *res)
75a97f3a9eSVladimir Kondratyev {
76a97f3a9eSVladimir Kondratyev 	char *end;
77a97f3a9eSVladimir Kondratyev 
78a97f3a9eSVladimir Kondratyev 	*res = strtoul(cp, &end, base);
79a97f3a9eSVladimir Kondratyev 
80a97f3a9eSVladimir Kondratyev 	/* skip newline character, if any */
81a97f3a9eSVladimir Kondratyev 	if (*end == '\n')
82a97f3a9eSVladimir Kondratyev 		end++;
83a97f3a9eSVladimir Kondratyev 	if (*cp == 0 || *end != 0)
84a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
85a97f3a9eSVladimir Kondratyev 	return (0);
86a97f3a9eSVladimir Kondratyev }
87a97f3a9eSVladimir Kondratyev 
88a97f3a9eSVladimir Kondratyev static inline int
kstrtol(const char * cp,unsigned int base,long * res)89a97f3a9eSVladimir Kondratyev kstrtol(const char *cp, unsigned int base, long *res)
90a97f3a9eSVladimir Kondratyev {
91a97f3a9eSVladimir Kondratyev 	char *end;
92a97f3a9eSVladimir Kondratyev 
93a97f3a9eSVladimir Kondratyev 	*res = strtol(cp, &end, base);
94a97f3a9eSVladimir Kondratyev 
95a97f3a9eSVladimir Kondratyev 	/* skip newline character, if any */
96a97f3a9eSVladimir Kondratyev 	if (*end == '\n')
97a97f3a9eSVladimir Kondratyev 		end++;
98a97f3a9eSVladimir Kondratyev 	if (*cp == 0 || *end != 0)
99a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
100a97f3a9eSVladimir Kondratyev 	return (0);
101a97f3a9eSVladimir Kondratyev }
102a97f3a9eSVladimir Kondratyev 
103a97f3a9eSVladimir Kondratyev static inline int
kstrtoint(const char * cp,unsigned int base,int * res)104a97f3a9eSVladimir Kondratyev kstrtoint(const char *cp, unsigned int base, int *res)
105a97f3a9eSVladimir Kondratyev {
106a97f3a9eSVladimir Kondratyev 	char *end;
107a97f3a9eSVladimir Kondratyev 	long temp;
108a97f3a9eSVladimir Kondratyev 
109a97f3a9eSVladimir Kondratyev 	*res = temp = strtol(cp, &end, base);
110a97f3a9eSVladimir Kondratyev 
111a97f3a9eSVladimir Kondratyev 	/* skip newline character, if any */
112a97f3a9eSVladimir Kondratyev 	if (*end == '\n')
113a97f3a9eSVladimir Kondratyev 		end++;
114a97f3a9eSVladimir Kondratyev 	if (*cp == 0 || *end != 0)
115a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
116a97f3a9eSVladimir Kondratyev 	if (temp != (int)temp)
117a97f3a9eSVladimir Kondratyev 		return (-ERANGE);
118a97f3a9eSVladimir Kondratyev 	return (0);
119a97f3a9eSVladimir Kondratyev }
120a97f3a9eSVladimir Kondratyev 
121a97f3a9eSVladimir Kondratyev static inline int
kstrtouint(const char * cp,unsigned int base,unsigned int * res)122a97f3a9eSVladimir Kondratyev kstrtouint(const char *cp, unsigned int base, unsigned int *res)
123a97f3a9eSVladimir Kondratyev {
124a97f3a9eSVladimir Kondratyev 	char *end;
125a97f3a9eSVladimir Kondratyev 	unsigned long temp;
126a97f3a9eSVladimir Kondratyev 
127a97f3a9eSVladimir Kondratyev 	*res = temp = strtoul(cp, &end, base);
128a97f3a9eSVladimir Kondratyev 
129a97f3a9eSVladimir Kondratyev 	/* skip newline character, if any */
130a97f3a9eSVladimir Kondratyev 	if (*end == '\n')
131a97f3a9eSVladimir Kondratyev 		end++;
132a97f3a9eSVladimir Kondratyev 	if (*cp == 0 || *end != 0)
133a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
134a97f3a9eSVladimir Kondratyev 	if (temp != (unsigned int)temp)
135a97f3a9eSVladimir Kondratyev 		return (-ERANGE);
136a97f3a9eSVladimir Kondratyev 	return (0);
137a97f3a9eSVladimir Kondratyev }
138a97f3a9eSVladimir Kondratyev 
139a97f3a9eSVladimir Kondratyev static inline int
kstrtou8(const char * cp,unsigned int base,uint8_t * res)140*db42bd1fSVladimir Kondratyev kstrtou8(const char *cp, unsigned int base, uint8_t *res)
141a97f3a9eSVladimir Kondratyev {
142a97f3a9eSVladimir Kondratyev 	char *end;
143a97f3a9eSVladimir Kondratyev 	unsigned long temp;
144a97f3a9eSVladimir Kondratyev 
145a97f3a9eSVladimir Kondratyev 	*res = temp = strtoul(cp, &end, base);
146a97f3a9eSVladimir Kondratyev 
147a97f3a9eSVladimir Kondratyev 	/* skip newline character, if any */
148a97f3a9eSVladimir Kondratyev 	if (*end == '\n')
149a97f3a9eSVladimir Kondratyev 		end++;
150a97f3a9eSVladimir Kondratyev 	if (*cp == 0 || *end != 0)
151a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
152*db42bd1fSVladimir Kondratyev 	if (temp != (uint8_t)temp)
153a97f3a9eSVladimir Kondratyev 		return (-ERANGE);
154a97f3a9eSVladimir Kondratyev 	return (0);
155a97f3a9eSVladimir Kondratyev }
156a97f3a9eSVladimir Kondratyev 
157a97f3a9eSVladimir Kondratyev static inline int
kstrtou16(const char * cp,unsigned int base,uint16_t * res)158*db42bd1fSVladimir Kondratyev kstrtou16(const char *cp, unsigned int base, uint16_t *res)
159a97f3a9eSVladimir Kondratyev {
160a97f3a9eSVladimir Kondratyev 	char *end;
161a97f3a9eSVladimir Kondratyev 	unsigned long temp;
162a97f3a9eSVladimir Kondratyev 
163a97f3a9eSVladimir Kondratyev 	*res = temp = strtoul(cp, &end, base);
164a97f3a9eSVladimir Kondratyev 
165a97f3a9eSVladimir Kondratyev 	/* skip newline character, if any */
166a97f3a9eSVladimir Kondratyev 	if (*end == '\n')
167a97f3a9eSVladimir Kondratyev 		end++;
168a97f3a9eSVladimir Kondratyev 	if (*cp == 0 || *end != 0)
169a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
170*db42bd1fSVladimir Kondratyev 	if (temp != (uint16_t)temp)
171a97f3a9eSVladimir Kondratyev 		return (-ERANGE);
172a97f3a9eSVladimir Kondratyev 	return (0);
173a97f3a9eSVladimir Kondratyev }
174a97f3a9eSVladimir Kondratyev 
175a97f3a9eSVladimir Kondratyev static inline int
kstrtou32(const char * cp,unsigned int base,uint32_t * res)176*db42bd1fSVladimir Kondratyev kstrtou32(const char *cp, unsigned int base, uint32_t *res)
177a97f3a9eSVladimir Kondratyev {
178a97f3a9eSVladimir Kondratyev 
179a97f3a9eSVladimir Kondratyev 	return (kstrtouint(cp, base, res));
180a97f3a9eSVladimir Kondratyev }
181a97f3a9eSVladimir Kondratyev 
182a97f3a9eSVladimir Kondratyev static inline int
kstrtos64(const char * cp,unsigned int base,int64_t * res)183*db42bd1fSVladimir Kondratyev kstrtos64(const char *cp, unsigned int base, int64_t *res)
184a97f3a9eSVladimir Kondratyev {
185a97f3a9eSVladimir Kondratyev 	char *end;
186a97f3a9eSVladimir Kondratyev 
187a97f3a9eSVladimir Kondratyev 	*res = strtoq(cp, &end, base);
188a97f3a9eSVladimir Kondratyev 
189a97f3a9eSVladimir Kondratyev 	/* skip newline character, if any */
190a97f3a9eSVladimir Kondratyev 	if (*end == '\n')
191a97f3a9eSVladimir Kondratyev 		end++;
192a97f3a9eSVladimir Kondratyev 	if (*cp == 0 || *end != 0)
193a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
194a97f3a9eSVladimir Kondratyev 	return (0);
195a97f3a9eSVladimir Kondratyev }
196a97f3a9eSVladimir Kondratyev 
197a97f3a9eSVladimir Kondratyev static inline int
kstrtoll(const char * cp,unsigned int base,long long * res)198d207a2deSVladimir Kondratyev kstrtoll(const char *cp, unsigned int base, long long *res)
199d207a2deSVladimir Kondratyev {
200*db42bd1fSVladimir Kondratyev 	return (kstrtos64(cp, base, (int64_t *)res));
201d207a2deSVladimir Kondratyev }
202d207a2deSVladimir Kondratyev 
203d207a2deSVladimir Kondratyev static inline int
kstrtou64(const char * cp,unsigned int base,u64 * res)204a97f3a9eSVladimir Kondratyev kstrtou64(const char *cp, unsigned int base, u64 *res)
205a97f3a9eSVladimir Kondratyev {
206a97f3a9eSVladimir Kondratyev 	char *end;
207a97f3a9eSVladimir Kondratyev 
208a97f3a9eSVladimir Kondratyev 	*res = strtouq(cp, &end, base);
209a97f3a9eSVladimir Kondratyev 
210a97f3a9eSVladimir Kondratyev 	/* skip newline character, if any */
211a97f3a9eSVladimir Kondratyev 	if (*end == '\n')
212a97f3a9eSVladimir Kondratyev 		end++;
213a97f3a9eSVladimir Kondratyev 	if (*cp == 0 || *end != 0)
214a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
215a97f3a9eSVladimir Kondratyev 	return (0);
216a97f3a9eSVladimir Kondratyev }
217a97f3a9eSVladimir Kondratyev 
218a97f3a9eSVladimir Kondratyev static inline int
kstrtoull(const char * cp,unsigned int base,unsigned long long * res)219a97f3a9eSVladimir Kondratyev kstrtoull(const char *cp, unsigned int base, unsigned long long *res)
220a97f3a9eSVladimir Kondratyev {
221*db42bd1fSVladimir Kondratyev 	return (kstrtou64(cp, base, (uint64_t *)res));
222a97f3a9eSVladimir Kondratyev }
223a97f3a9eSVladimir Kondratyev 
224a97f3a9eSVladimir Kondratyev static inline int
kstrtobool(const char * s,bool * res)225a97f3a9eSVladimir Kondratyev kstrtobool(const char *s, bool *res)
226a97f3a9eSVladimir Kondratyev {
227a97f3a9eSVladimir Kondratyev 	int len;
228a97f3a9eSVladimir Kondratyev 
229a97f3a9eSVladimir Kondratyev 	if (s == NULL || (len = strlen(s)) == 0 || res == NULL)
230a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
231a97f3a9eSVladimir Kondratyev 
232a97f3a9eSVladimir Kondratyev 	/* skip newline character, if any */
233a97f3a9eSVladimir Kondratyev 	if (s[len - 1] == '\n')
234a97f3a9eSVladimir Kondratyev 		len--;
235a97f3a9eSVladimir Kondratyev 
236a97f3a9eSVladimir Kondratyev 	if (len == 1 && strchr("yY1", s[0]) != NULL)
237a97f3a9eSVladimir Kondratyev 		*res = true;
238a97f3a9eSVladimir Kondratyev 	else if (len == 1 && strchr("nN0", s[0]) != NULL)
239a97f3a9eSVladimir Kondratyev 		*res = false;
240a97f3a9eSVladimir Kondratyev 	else if (strncasecmp("on", s, len) == 0)
241a97f3a9eSVladimir Kondratyev 		*res = true;
242a97f3a9eSVladimir Kondratyev 	else if (strncasecmp("off", s, len) == 0)
243a97f3a9eSVladimir Kondratyev 		*res = false;
244a97f3a9eSVladimir Kondratyev 	else
245a97f3a9eSVladimir Kondratyev 		return (-EINVAL);
246a97f3a9eSVladimir Kondratyev 
247a97f3a9eSVladimir Kondratyev 	return (0);
248a97f3a9eSVladimir Kondratyev }
249a97f3a9eSVladimir Kondratyev 
250a97f3a9eSVladimir Kondratyev static inline int
kstrtobool_from_user(const char __user * s,size_t count,bool * res)251a97f3a9eSVladimir Kondratyev kstrtobool_from_user(const char __user *s, size_t count, bool *res)
252a97f3a9eSVladimir Kondratyev {
253a97f3a9eSVladimir Kondratyev 	char buf[8] = {};
254a97f3a9eSVladimir Kondratyev 
255a97f3a9eSVladimir Kondratyev 	if (count > (sizeof(buf) - 1))
256a97f3a9eSVladimir Kondratyev 		count = (sizeof(buf) - 1);
257a97f3a9eSVladimir Kondratyev 
258a97f3a9eSVladimir Kondratyev 	if (copy_from_user(buf, s, count))
259a97f3a9eSVladimir Kondratyev 		return (-EFAULT);
260a97f3a9eSVladimir Kondratyev 
261a97f3a9eSVladimir Kondratyev 	return (kstrtobool(buf, res));
262a97f3a9eSVladimir Kondratyev }
263a97f3a9eSVladimir Kondratyev 
264a97f3a9eSVladimir Kondratyev static inline int
kstrtoint_from_user(const char __user * s,size_t count,unsigned int base,int * p)265a97f3a9eSVladimir Kondratyev kstrtoint_from_user(const char __user *s, size_t count, unsigned int base,
266a97f3a9eSVladimir Kondratyev     int *p)
267a97f3a9eSVladimir Kondratyev {
268a97f3a9eSVladimir Kondratyev 	char buf[36] = {};
269a97f3a9eSVladimir Kondratyev 
270a97f3a9eSVladimir Kondratyev 	if (count > (sizeof(buf) - 1))
271a97f3a9eSVladimir Kondratyev 		count = (sizeof(buf) - 1);
272a97f3a9eSVladimir Kondratyev 
273a97f3a9eSVladimir Kondratyev 	if (copy_from_user(buf, s, count))
274a97f3a9eSVladimir Kondratyev 		return (-EFAULT);
275a97f3a9eSVladimir Kondratyev 
276a97f3a9eSVladimir Kondratyev 	return (kstrtoint(buf, base, p));
277a97f3a9eSVladimir Kondratyev }
278a97f3a9eSVladimir Kondratyev 
279a97f3a9eSVladimir Kondratyev static inline int
kstrtouint_from_user(const char __user * s,size_t count,unsigned int base,unsigned int * p)280a97f3a9eSVladimir Kondratyev kstrtouint_from_user(const char __user *s, size_t count, unsigned int base,
281a97f3a9eSVladimir Kondratyev     unsigned int *p)
282a97f3a9eSVladimir Kondratyev {
283a97f3a9eSVladimir Kondratyev 	char buf[36] = {};
284a97f3a9eSVladimir Kondratyev 
285a97f3a9eSVladimir Kondratyev 	if (count > (sizeof(buf) - 1))
286a97f3a9eSVladimir Kondratyev 		count = (sizeof(buf) - 1);
287a97f3a9eSVladimir Kondratyev 
288a97f3a9eSVladimir Kondratyev 	if (copy_from_user(buf, s, count))
289a97f3a9eSVladimir Kondratyev 		return (-EFAULT);
290a97f3a9eSVladimir Kondratyev 
291a97f3a9eSVladimir Kondratyev 	return (kstrtouint(buf, base, p));
292a97f3a9eSVladimir Kondratyev }
293a97f3a9eSVladimir Kondratyev 
294a97f3a9eSVladimir Kondratyev static inline int
kstrtou32_from_user(const char __user * s,size_t count,unsigned int base,unsigned int * p)295a97f3a9eSVladimir Kondratyev kstrtou32_from_user(const char __user *s, size_t count, unsigned int base,
296a97f3a9eSVladimir Kondratyev     unsigned int *p)
297a97f3a9eSVladimir Kondratyev {
298a97f3a9eSVladimir Kondratyev 
299a97f3a9eSVladimir Kondratyev 	return (kstrtouint_from_user(s, count, base, p));
300a97f3a9eSVladimir Kondratyev }
301a97f3a9eSVladimir Kondratyev 
302a97f3a9eSVladimir Kondratyev static inline int
kstrtou8_from_user(const char __user * s,size_t count,unsigned int base,uint8_t * p)303a97f3a9eSVladimir Kondratyev kstrtou8_from_user(const char __user *s, size_t count, unsigned int base,
304*db42bd1fSVladimir Kondratyev     uint8_t *p)
305a97f3a9eSVladimir Kondratyev {
306a97f3a9eSVladimir Kondratyev 	char buf[8] = {};
307a97f3a9eSVladimir Kondratyev 
308a97f3a9eSVladimir Kondratyev 	if (count > (sizeof(buf) - 1))
309a97f3a9eSVladimir Kondratyev 		count = (sizeof(buf) - 1);
310a97f3a9eSVladimir Kondratyev 
311a97f3a9eSVladimir Kondratyev 	if (copy_from_user(buf, s, count))
312a97f3a9eSVladimir Kondratyev 		return (-EFAULT);
313a97f3a9eSVladimir Kondratyev 
314a97f3a9eSVladimir Kondratyev 	return (kstrtou8(buf, base, p));
315a97f3a9eSVladimir Kondratyev }
316a97f3a9eSVladimir Kondratyev 
317a97f3a9eSVladimir Kondratyev #endif	/* _LINUXKPI_LINUX_KSTRTOX_H_ */
318