2017-12-19 15:49:03 +00:00
|
|
|
/* SPDX-License-Identifier: BSD-3-Clause
|
2019-04-01 20:54:52 -07:00
|
|
|
* Copyright(c) 2010-2019 Intel Corporation
|
2012-09-04 13:54:00 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @file
|
|
|
|
*
|
2013-03-22 16:34:54 +01:00
|
|
|
* String-related functions as replacement for libc equivalents
|
2012-09-04 13:54:00 +01:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _RTE_STRING_FNS_H_
|
|
|
|
#define _RTE_STRING_FNS_H_
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
eal: support strlcpy function
The strncpy function is error prone for doing "safe" string copies, so
we generally try to use "snprintf" instead in the code. The function
"strlcpy" is a better alternative, since it better conveys the
intention of the programmer, and doesn't suffer from the non-null
terminating behaviour of it's n'ed brethern.
The downside of this function is that it is not available by default
on linux, though standard in the BSD's. It is available on most
distros by installing "libbsd" package.
This patch therefore provides the following in rte_string_fns.h to ensure
that strlcpy is available there:
* for BSD, include string.h as normal
* if RTE_USE_LIBBSD is set, include <bsd/string.h>
* if not set, fallback to snprintf for strlcpy
Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
but when using meson, it's automatically set based on what is available
on the platform.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
2018-03-12 11:32:59 +00:00
|
|
|
#include <stdio.h>
|
2018-10-04 11:20:38 +01:00
|
|
|
#include <string.h>
|
eal: support strlcpy function
The strncpy function is error prone for doing "safe" string copies, so
we generally try to use "snprintf" instead in the code. The function
"strlcpy" is a better alternative, since it better conveys the
intention of the programmer, and doesn't suffer from the non-null
terminating behaviour of it's n'ed brethern.
The downside of this function is that it is not available by default
on linux, though standard in the BSD's. It is available on most
distros by installing "libbsd" package.
This patch therefore provides the following in rte_string_fns.h to ensure
that strlcpy is available there:
* for BSD, include string.h as normal
* if RTE_USE_LIBBSD is set, include <bsd/string.h>
* if not set, fallback to snprintf for strlcpy
Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
but when using meson, it's automatically set based on what is available
on the platform.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
2018-03-12 11:32:59 +00:00
|
|
|
|
2019-04-01 20:54:52 -07:00
|
|
|
#include <rte_common.h>
|
|
|
|
|
2012-09-04 13:54:00 +01:00
|
|
|
/**
|
|
|
|
* Takes string "string" parameter and splits it at character "delim"
|
|
|
|
* up to maxtokens-1 times - to give "maxtokens" resulting tokens. Like
|
|
|
|
* strtok or strsep functions, this modifies its input string, by replacing
|
2013-03-22 16:34:54 +01:00
|
|
|
* instances of "delim" with '\\0'. All resultant tokens are returned in the
|
2012-09-04 13:54:00 +01:00
|
|
|
* "tokens" array which must have enough entries to hold "maxtokens".
|
|
|
|
*
|
|
|
|
* @param string
|
|
|
|
* The input string to be split into tokens
|
|
|
|
*
|
|
|
|
* @param stringlen
|
|
|
|
* The max length of the input buffer
|
|
|
|
*
|
|
|
|
* @param tokens
|
|
|
|
* The array to hold the pointers to the tokens in the string
|
|
|
|
*
|
|
|
|
* @param maxtokens
|
|
|
|
* The number of elements in the tokens array. At most, maxtokens-1 splits
|
|
|
|
* of the string will be done.
|
|
|
|
*
|
|
|
|
* @param delim
|
|
|
|
* The character on which the split of the data will be done
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* The number of tokens in the tokens array.
|
|
|
|
*/
|
2014-05-02 16:42:53 -07:00
|
|
|
int
|
2012-09-04 13:54:00 +01:00
|
|
|
rte_strsplit(char *string, int stringlen,
|
2014-05-02 16:42:53 -07:00
|
|
|
char **tokens, int maxtokens, char delim);
|
2012-09-04 13:54:00 +01:00
|
|
|
|
eal: support strlcpy function
The strncpy function is error prone for doing "safe" string copies, so
we generally try to use "snprintf" instead in the code. The function
"strlcpy" is a better alternative, since it better conveys the
intention of the programmer, and doesn't suffer from the non-null
terminating behaviour of it's n'ed brethern.
The downside of this function is that it is not available by default
on linux, though standard in the BSD's. It is available on most
distros by installing "libbsd" package.
This patch therefore provides the following in rte_string_fns.h to ensure
that strlcpy is available there:
* for BSD, include string.h as normal
* if RTE_USE_LIBBSD is set, include <bsd/string.h>
* if not set, fallback to snprintf for strlcpy
Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
but when using meson, it's automatically set based on what is available
on the platform.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
2018-03-12 11:32:59 +00:00
|
|
|
/**
|
|
|
|
* @internal
|
|
|
|
* DPDK-specific version of strlcpy for systems without
|
|
|
|
* libc or libbsd copies of the function
|
|
|
|
*/
|
|
|
|
static inline size_t
|
|
|
|
rte_strlcpy(char *dst, const char *src, size_t size)
|
|
|
|
{
|
2018-05-17 22:03:48 +08:00
|
|
|
return (size_t)snprintf(dst, size, "%s", src);
|
eal: support strlcpy function
The strncpy function is error prone for doing "safe" string copies, so
we generally try to use "snprintf" instead in the code. The function
"strlcpy" is a better alternative, since it better conveys the
intention of the programmer, and doesn't suffer from the non-null
terminating behaviour of it's n'ed brethern.
The downside of this function is that it is not available by default
on linux, though standard in the BSD's. It is available on most
distros by installing "libbsd" package.
This patch therefore provides the following in rte_string_fns.h to ensure
that strlcpy is available there:
* for BSD, include string.h as normal
* if RTE_USE_LIBBSD is set, include <bsd/string.h>
* if not set, fallback to snprintf for strlcpy
Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
but when using meson, it's automatically set based on what is available
on the platform.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
2018-03-12 11:32:59 +00:00
|
|
|
}
|
|
|
|
|
2019-01-17 17:30:32 +00:00
|
|
|
/**
|
|
|
|
* @internal
|
|
|
|
* DPDK-specific version of strlcat for systems without
|
|
|
|
* libc or libbsd copies of the function
|
|
|
|
*/
|
|
|
|
static inline size_t
|
|
|
|
rte_strlcat(char *dst, const char *src, size_t size)
|
|
|
|
{
|
|
|
|
size_t l = strnlen(dst, size);
|
|
|
|
if (l < size)
|
|
|
|
return l + rte_strlcpy(&dst[l], src, size - l);
|
|
|
|
return l + strlen(src);
|
|
|
|
}
|
|
|
|
|
eal: support strlcpy function
The strncpy function is error prone for doing "safe" string copies, so
we generally try to use "snprintf" instead in the code. The function
"strlcpy" is a better alternative, since it better conveys the
intention of the programmer, and doesn't suffer from the non-null
terminating behaviour of it's n'ed brethern.
The downside of this function is that it is not available by default
on linux, though standard in the BSD's. It is available on most
distros by installing "libbsd" package.
This patch therefore provides the following in rte_string_fns.h to ensure
that strlcpy is available there:
* for BSD, include string.h as normal
* if RTE_USE_LIBBSD is set, include <bsd/string.h>
* if not set, fallback to snprintf for strlcpy
Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
but when using meson, it's automatically set based on what is available
on the platform.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
2018-03-12 11:32:59 +00:00
|
|
|
/* pull in a strlcpy function */
|
2019-03-06 16:22:40 +00:00
|
|
|
#ifdef RTE_EXEC_ENV_FREEBSD
|
eal: support strlcpy function
The strncpy function is error prone for doing "safe" string copies, so
we generally try to use "snprintf" instead in the code. The function
"strlcpy" is a better alternative, since it better conveys the
intention of the programmer, and doesn't suffer from the non-null
terminating behaviour of it's n'ed brethern.
The downside of this function is that it is not available by default
on linux, though standard in the BSD's. It is available on most
distros by installing "libbsd" package.
This patch therefore provides the following in rte_string_fns.h to ensure
that strlcpy is available there:
* for BSD, include string.h as normal
* if RTE_USE_LIBBSD is set, include <bsd/string.h>
* if not set, fallback to snprintf for strlcpy
Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
but when using meson, it's automatically set based on what is available
on the platform.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
2018-03-12 11:32:59 +00:00
|
|
|
#ifndef __BSD_VISIBLE /* non-standard functions are hidden */
|
|
|
|
#define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
|
2019-01-17 17:30:32 +00:00
|
|
|
#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
|
eal: support strlcpy function
The strncpy function is error prone for doing "safe" string copies, so
we generally try to use "snprintf" instead in the code. The function
"strlcpy" is a better alternative, since it better conveys the
intention of the programmer, and doesn't suffer from the non-null
terminating behaviour of it's n'ed brethern.
The downside of this function is that it is not available by default
on linux, though standard in the BSD's. It is available on most
distros by installing "libbsd" package.
This patch therefore provides the following in rte_string_fns.h to ensure
that strlcpy is available there:
* for BSD, include string.h as normal
* if RTE_USE_LIBBSD is set, include <bsd/string.h>
* if not set, fallback to snprintf for strlcpy
Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
but when using meson, it's automatically set based on what is available
on the platform.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
2018-03-12 11:32:59 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
#else /* non-BSD platforms */
|
|
|
|
#ifdef RTE_USE_LIBBSD
|
|
|
|
#include <bsd/string.h>
|
|
|
|
|
|
|
|
#else /* no BSD header files, create own */
|
|
|
|
#define strlcpy(dst, src, size) rte_strlcpy(dst, src, size)
|
2019-01-17 17:30:32 +00:00
|
|
|
#define strlcat(dst, src, size) rte_strlcat(dst, src, size)
|
eal: support strlcpy function
The strncpy function is error prone for doing "safe" string copies, so
we generally try to use "snprintf" instead in the code. The function
"strlcpy" is a better alternative, since it better conveys the
intention of the programmer, and doesn't suffer from the non-null
terminating behaviour of it's n'ed brethern.
The downside of this function is that it is not available by default
on linux, though standard in the BSD's. It is available on most
distros by installing "libbsd" package.
This patch therefore provides the following in rte_string_fns.h to ensure
that strlcpy is available there:
* for BSD, include string.h as normal
* if RTE_USE_LIBBSD is set, include <bsd/string.h>
* if not set, fallback to snprintf for strlcpy
Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
but when using meson, it's automatically set based on what is available
on the platform.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
2018-03-12 11:32:59 +00:00
|
|
|
|
|
|
|
#endif /* RTE_USE_LIBBSD */
|
2019-03-06 16:22:40 +00:00
|
|
|
#endif /* FREEBSD */
|
eal: support strlcpy function
The strncpy function is error prone for doing "safe" string copies, so
we generally try to use "snprintf" instead in the code. The function
"strlcpy" is a better alternative, since it better conveys the
intention of the programmer, and doesn't suffer from the non-null
terminating behaviour of it's n'ed brethern.
The downside of this function is that it is not available by default
on linux, though standard in the BSD's. It is available on most
distros by installing "libbsd" package.
This patch therefore provides the following in rte_string_fns.h to ensure
that strlcpy is available there:
* for BSD, include string.h as normal
* if RTE_USE_LIBBSD is set, include <bsd/string.h>
* if not set, fallback to snprintf for strlcpy
Using make build system, the RTE_USE_LIBBSD is a hard-coded value to "n",
but when using meson, it's automatically set based on what is available
on the platform.
Signed-off-by: Bruce Richardson <bruce.richardson@intel.com>
Reviewed-by: Stephen Hemminger <stephen@networkplumber.org>
2018-03-12 11:32:59 +00:00
|
|
|
|
2018-09-11 17:00:49 +02:00
|
|
|
/**
|
|
|
|
* Copy string src to buffer dst of size dsize.
|
|
|
|
* At most dsize-1 chars will be copied.
|
|
|
|
* Always NUL-terminates, unless (dsize == 0).
|
|
|
|
* Returns number of bytes copied (terminating NUL-byte excluded) on success ;
|
|
|
|
* negative errno on error.
|
|
|
|
*
|
|
|
|
* @param dst
|
|
|
|
* The destination string.
|
|
|
|
*
|
|
|
|
* @param src
|
|
|
|
* The input string to be copied.
|
|
|
|
*
|
|
|
|
* @param dsize
|
|
|
|
* Length in bytes of the destination buffer.
|
|
|
|
*
|
|
|
|
* @return
|
|
|
|
* The number of bytes copied on success
|
|
|
|
* -E2BIG if the destination buffer is too small.
|
|
|
|
*/
|
|
|
|
ssize_t
|
|
|
|
rte_strscpy(char *dst, const char *src, size_t dsize);
|
|
|
|
|
2012-09-04 13:54:00 +01:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#endif /* RTE_STRING_FNS_H */
|