]> git.pld-linux.org Git - packages/net-snmp.git/blob - net-snmp-loadave-writable.patch
- detect errors better, need to report error in RESERVE stages, COMMIT is too late
[packages/net-snmp.git] / net-snmp-loadave-writable.patch
1 --- net-snmp-5.4.2.1/agent/mibgroup/ucd-snmp/loadave.c~ 2009-12-21 21:00:10.094254079 +0200
2 +++ net-snmp-5.4.2.1/agent/mibgroup/ucd-snmp/loadave.c  2009-12-21 22:02:45.398903148 +0200
3 @@ -152,7 +152,7 @@
4           {ERRORNAME}},
5          {LOADAVE, ASN_OCTET_STR, RONLY, var_extensible_loadave, 1,
6           {LOADAVE}},
7 -        {LOADMAXVAL, ASN_OCTET_STR, RONLY, var_extensible_loadave, 1,
8 +        {LOADMAXVAL, ASN_OCTET_STR, RWRITE, var_extensible_loadave, 1,
9           {LOADMAXVAL}},
10          {LOADAVEINT, ASN_INTEGER, RONLY, var_extensible_loadave, 1,
11           {LOADAVEINT}},
12 @@ -309,6 +309,63 @@
13      return 0;
14  }
15  
16 +static int
17 +write_laConfig(int action,
18 +                          u_char * var_val,
19 +                          u_char var_val_type,
20 +                          size_t var_val_len,
21 +                          u_char * statP, oid * name, size_t name_len)
22 +{
23 +    static double laConfig = 0;
24 +
25 +    switch (action) {
26 +    case RESERVE1:
27 +        if (var_val_type != ASN_OCTET_STR) {
28 +            DEBUGMSGTL(("ucd-snmp/loadave",
29 +                        "write to laConfig not ASN_OCTET_STR\n"));
30 +            return SNMP_ERR_WRONGTYPE;
31 +        }
32 +        if (var_val_len > 8 || var_val_len <= 0) {
33 +            DEBUGMSGTL(("ucd-snmp/loadave",
34 +                        "write to laConfig: bad length\n"));
35 +            return SNMP_ERR_WRONGLENGTH;
36 +        }
37 +        break;
38 +
39 +    case RESERVE2:
40 +        {
41 +            u_char buf[8];
42 +            int old_errno = errno;
43 +            double val;
44 +            char *endp;
45 +
46 +            strncpy(buf, var_val, var_val_len);
47 +            buf[var_val_len] = '\0';
48 +            val = strtod(buf, &endp);
49 +
50 +            if (errno == ERANGE || *endp != '\0' || val < 0 || val > 65536.00) {
51 +                errno = old_errno;
52 +                DEBUGMSGTL(("ucd-snmp/loadave",
53 +                            "write to laConfig: invalid value\n"));
54 +                return SNMP_ERR_WRONGVALUE;
55 +            }
56 +
57 +            errno = old_errno;
58 +
59 +            laConfig = val;
60 +        }
61 +        break;
62 +
63 +    case COMMIT:
64 +        {
65 +            int idx = name[name_len - 1] - 1;
66 +            maxload[idx] = laConfig;
67 +        }
68 +    }
69 +
70 +    return SNMP_ERR_NOERROR;
71 +}
72 +
73  u_char         *
74  var_extensible_loadave(struct variable * vp,
75                         oid * name,
76 @@ -328,6 +385,10 @@
77      case MIBINDEX:
78          long_ret = name[*length - 1];
79          return ((u_char *) (&long_ret));
80 +    case LOADMAXVAL:
81 +        /* setup write method, but don't return yet */
82 +        *write_method = write_laConfig;
83 +        break;
84      case ERRORNAME:
85          sprintf(errmsg, "Load-%d", ((name[*length - 1] == 1) ? 1 :
86                                      ((name[*length - 1] == 2) ? 5 : 15)));
This page took 0.064822 seconds and 4 git commands to generate.