Module Name: src Committed By: skrll Date: Thu Apr 20 09:04:45 UTC 2023
Modified Files: src/sys/kern: subr_optstr.c src/sys/sys: optstr.h Log Message: Extend optstr(9) to provide some functions to convert the value. Proposed on tech-kern some time ago. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 src/sys/kern/subr_optstr.c cvs rdiff -u -r1.3 -r1.4 src/sys/sys/optstr.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/kern/subr_optstr.c diff -u src/sys/kern/subr_optstr.c:1.7 src/sys/kern/subr_optstr.c:1.8 --- src/sys/kern/subr_optstr.c:1.7 Sat Nov 19 15:30:12 2022 +++ src/sys/kern/subr_optstr.c Thu Apr 20 09:04:45 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: subr_optstr.c,v 1.7 2022/11/19 15:30:12 skrll Exp $ */ +/* $NetBSD: subr_optstr.c,v 1.8 2023/04/20 09:04:45 skrll Exp $ */ /*- * Copyright (c) 2006 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: subr_optstr.c,v 1.7 2022/11/19 15:30:12 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: subr_optstr.c,v 1.8 2023/04/20 09:04:45 skrll Exp $"); #include <sys/param.h> #include <sys/optstr.h> @@ -43,13 +43,15 @@ __KERNEL_RCSID(0, "$NetBSD: subr_optstr. * with a maximum of bufsize bytes. If the key is found, returns true; * otherwise FALSE. */ -bool -optstr_get(const char *optstr, const char *key, char *buf, size_t bufsize) + + +static bool +optstr_get_pointer(const char *optstr, const char *key, const char **result) { bool found = false; - /* Skip any initial spaces until we find a word. */ - while (*optstr == ' ') + /* Skip any initial spaces or tabs until we find a word. */ + while (*optstr == ' ' || *optstr == '\t') optstr++; /* Search for the given key within the option string. */ @@ -76,17 +78,118 @@ optstr_get(const char *optstr, const cha } } - /* If the key was found; copy its value to the target buffer. */ if (found) { - const char *lastbuf; + optstr++; /* Skip '='. */ + *result = optstr; + } - lastbuf = buf + (bufsize - 1); + return found; +} - optstr++; /* Skip '='. */ - while (buf != lastbuf && *optstr != ' ' && *optstr != '\0') - *buf++ = *optstr++; +bool +optstr_get(const char *optstr, const char *key, char *buf, size_t bufsize) +{ + const char *data; + bool found = optstr_get_pointer(optstr, key, &data); + + /* If the key was found; copy its value to the target buffer. */ + if (found) { + const char *lastbuf = buf + (bufsize - 1); + + while (buf != lastbuf && *data != ' ' && *data != '\0') + *buf++ = *data++; *buf = '\0'; } + return found; +} + + +bool +optstr_get_string(const char *optstr, const char *key, const char **result) +{ + const char *data; + const bool found = optstr_get_pointer(optstr, key, &data); + + /* If the key was found; copy its value to the target buffer. */ + if (found) { + *result = data; + } + return found; +} + +bool +optstr_get_number(const char *optstr, const char *key, unsigned long *result) +{ + const char *data; + const bool found = optstr_get_pointer(optstr, key, &data); + + /* If the key was found; copy its value to the target buffer. */ + if (found) { + char *ep; + const unsigned long ulval = strtoul(data, &ep, 10); + if (ep == data) + return false; + *result = ulval; + return true; + } + return false; +} + +bool +optstr_get_number_hex(const char *optstr, const char *key, + unsigned long *result) +{ + const char *data; + const bool found = optstr_get_pointer(optstr, key, &data); + + /* If the key was found; copy its value to the target buffer. */ + if (found) { + char *ep; + const unsigned long ulval = strtoul(data, &ep, 16); + if (ep == data) + return false; + *result = ulval; + return true; + } + return false; +} + +bool +optstr_get_number_binary(const char *optstr, const char *key, + unsigned long *result) +{ + const char *data; + const bool found = optstr_get_pointer(optstr, key, &data); + + /* If the key was found; copy its value to the target buffer. */ + if (found) { + char *ep; + const unsigned long ulval = strtoul(data, &ep, 2); + if (ep == data) + return false; + *result = ulval; + return true; + } + return false; +} + +#if NETHER > 0 +bool +optstr_get_macaddr(const char *optstr, const char *key, + uint8_t result[ETHER_ADDR_LEN]) +{ + const char *data; + const bool found = optstr_get_pointer(optstr, key, &data); + + /* If the key was found; copy its value to the target buffer. */ + if (found) { + uint8_t temp[ETHER_ADDR_LEN]; + int error = ether_aton_r(temp, sizeof(temp), data); + if (error) + return false; + memcpy(result, temp, sizeof(temp)); + } return found; } +#endif Index: src/sys/sys/optstr.h diff -u src/sys/sys/optstr.h:1.3 src/sys/sys/optstr.h:1.4 --- src/sys/sys/optstr.h:1.3 Mon Apr 28 20:24:11 2008 +++ src/sys/sys/optstr.h Thu Apr 20 09:04:45 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: optstr.h,v 1.3 2008/04/28 20:24:11 martin Exp $ */ +/* $NetBSD: optstr.h,v 1.4 2023/04/20 09:04:45 skrll Exp $ */ /*- * Copyright (c) 2006 The NetBSD Foundation, Inc. @@ -29,12 +29,29 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#if !defined(_SYS_OPTSTR_H_) +#ifndef _SYS_OPTSTR_H_ #define _SYS_OPTSTR_H_ +#include "ether.h" + +#include <sys/types.h> + +#if NETHER > 0 +#include <net/if_ether.h> +#endif + /* * Prototypes for functions defined in sys/kern/subr_optstr.c. */ bool optstr_get(const char *, const char *, char *, size_t); -#endif /* !defined(_SYS_OPTSTR_H_) */ +bool optstr_get_string(const char *, const char *, const char **); +bool optstr_get_number(const char *, const char *, unsigned long *); +bool optstr_get_number_hex(const char *, const char *, unsigned long *); +bool optstr_get_number_binary(const char *, const char *, unsigned long *); + +#if NETHER > 0 +bool optstr_get_macaddr(const char *, const char *, uint8_t [ETHER_ADDR_LEN]); +#endif + +#endif /* _SYS_OPTSTR_H_ */