Live and learn. While working on a regress test I found that I
misunderstood some types when I wrote this code. According to RFC2578:
- timeticks is a 32 bit unsigned int
- counter32 is a 32 bit unsigned int
- unsigned is "indistinguishable from Gauge32"
- integer is a 32 bit integer

OK?

martijn@

Index: snmp.1
===================================================================
RCS file: /cvs/src/usr.bin/snmp/snmp.1,v
retrieving revision 1.15
diff -u -p -r1.15 snmp.1
--- snmp.1      14 Sep 2020 15:12:27 -0000      1.15
+++ snmp.1      2 Mar 2021 21:48:35 -0000
@@ -524,7 +524,6 @@ A regular string.
 Timeticks in centiseconds.
 .It Cm u
 Unsigned integer.
-Actually a normal integer for compatibility with netsnmp.
 .It Cm x
 A hex string.
 Similar to a decimal string, but in hexadecimal format.
Index: snmpc.c
===================================================================
RCS file: /cvs/src/usr.bin/snmp/snmpc.c,v
retrieving revision 1.31
diff -u -p -r1.31 snmpc.c
--- snmpc.c     2 Dec 2020 15:45:51 -0000       1.31
+++ snmpc.c     2 Mar 2021 21:48:35 -0000
@@ -801,7 +801,7 @@ snmpc_trap(int argc, char *argv[])
                if (clock_gettime(CLOCK_UPTIME, &ts) == -1)
                        err(1, "clock_gettime");
        } else {
-               lval = strtonum(argv[1], 0, LLONG_MAX, &errstr);
+               lval = strtonum(argv[1], 0, UINT32_MAX, &errstr);
                if (errstr != NULL)
                        errx(1, "Bad value notation (%s)", argv[1]);
                ts.tv_sec = lval / 100;
@@ -1439,7 +1439,7 @@ snmpc_varbindparse(int argc, char *argv[
                         */
                        goto pastestring;
                case 'c':
-                       lval = strtonum(argv[i + 2], INT32_MIN, INT32_MAX,
+                       lval = strtonum(argv[i + 2], 0, UINT32_MAX,
                            &errstr);
                        if (errstr != NULL)
                                errx(1, "%s: Bad value notation (%s)", argv[i],
@@ -1472,9 +1472,8 @@ snmpc_varbindparse(int argc, char *argv[
                                tmpstr = endstr + 1;
                        } while (endstr[0] != '\0');
                        goto pastestring;
-               case 'u':
                case 'i':
-                       lval = strtonum(argv[i + 2], LLONG_MIN, LLONG_MAX,
+                       lval = strtonum(argv[i + 2], INT32_MIN, INT32_MAX,
                            &errstr);
                        if (errstr != NULL)
                                errx(1, "%s: Bad value notation (%s)", argv[i],
@@ -1508,7 +1507,7 @@ pastestring:
                        free(str);
                        break;
                case 't':
-                       lval = strtonum(argv[i + 2], LLONG_MIN, LLONG_MAX,
+                       lval = strtonum(argv[i + 2], 0, UINT32_MAX,
                            &errstr);
                        if (errstr != NULL)
                                errx(1, "%s: Bad value notation (%s)", argv[i],
@@ -1516,6 +1515,17 @@ pastestring:
                        if ((varbind = ober_printf_elements(varbind, "{Oit}",
                            &oid, lval, BER_CLASS_APPLICATION,
                            SNMP_T_TIMETICKS)) == NULL)
+                               err(1, "ober_printf_elements");
+                       break;
+               case 'u':
+                       lval = strtonum(argv[i + 2], 0, UINT32_MAX,
+                           &errstr);
+                       if (errstr != NULL)
+                               errx(1, "%s: Bad value notation (%s)", argv[i],
+                                   argv[i + 2]);
+                       if ((varbind = ober_printf_elements(varbind, "{Oit}",
+                           &oid, lval, BER_CLASS_APPLICATION,
+                           SNMP_T_GAUGE32)) == NULL)
                                err(1, "ober_printf_elements");
                        break;
                case 'x':


Reply via email to