Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys Extend optstr(9) to provide some functions to convert th...



details:   https://anonhg.NetBSD.org/src/rev/1ec73cd3181c
branches:  trunk
changeset: 374345:1ec73cd3181c
user:      skrll <skrll%NetBSD.org@localhost>
date:      Thu Apr 20 09:04:45 2023 +0000

description:
Extend optstr(9) to provide some functions to convert the value.

Proposed on tech-kern some time ago.

diffstat:

 sys/kern/subr_optstr.c |  131 +++++++++++++++++++++++++++++++++++++++++++-----
 sys/sys/optstr.h       |   23 +++++++-
 2 files changed, 137 insertions(+), 17 deletions(-)

diffs (206 lines):

diff -r b7bc06606d11 -r 1ec73cd3181c sys/kern/subr_optstr.c
--- a/sys/kern/subr_optstr.c    Thu Apr 20 08:28:02 2023 +0000
+++ b/sys/kern/subr_optstr.c    Thu Apr 20 09:04:45 2023 +0000
@@ -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 @@
  * 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;
-
-               lastbuf = buf + (bufsize - 1);
-
                optstr++; /* Skip '='. */
-               while (buf != lastbuf && *optstr != ' ' && *optstr != '\0')
-                       *buf++ = *optstr++;
-               *buf = '\0';
+               *result = optstr;
        }
 
        return found;
 }
+
+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
diff -r b7bc06606d11 -r 1ec73cd3181c sys/sys/optstr.h
--- a/sys/sys/optstr.h  Thu Apr 20 08:28:02 2023 +0000
+++ b/sys/sys/optstr.h  Thu Apr 20 09:04:45 2023 +0000
@@ -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_ */



Home | Main Index | Thread Index | Old Index