00001 #include <net-snmp/net-snmp-config.h>
00002
00003 #include <net-snmp/net-snmp-includes.h>
00004
00005 #include <net-snmp/library/check_varbind.h>
00006
00007 NETSNMP_INLINE int
00008 netsnmp_check_vb_type(const netsnmp_variable_list *var, int type )
00009 {
00010 register int rc = SNMP_ERR_NOERROR;
00011
00012 if (NULL == var)
00013 return SNMP_ERR_GENERR;
00014
00015 if (var->type != type) {
00016 rc = SNMP_ERR_WRONGTYPE;
00017 }
00018
00019 return rc;
00020 }
00021
00022 NETSNMP_INLINE int
00023 netsnmp_check_vb_size(const netsnmp_variable_list *var, size_t size )
00024 {
00025 register int rc = SNMP_ERR_NOERROR;
00026
00027 if (NULL == var)
00028 return SNMP_ERR_GENERR;
00029
00030 else if (var->val_len != size) {
00031 rc = SNMP_ERR_WRONGLENGTH;
00032 }
00033
00034 return rc;
00035 }
00036
00037 NETSNMP_INLINE int
00038 netsnmp_check_vb_max_size(const netsnmp_variable_list *var, size_t size )
00039 {
00040 register int rc = SNMP_ERR_NOERROR;
00041
00042 if (NULL == var)
00043 return SNMP_ERR_GENERR;
00044
00045 else if (var->val_len > size) {
00046 rc = SNMP_ERR_WRONGLENGTH;
00047 }
00048
00049 return rc;
00050 }
00051
00052 NETSNMP_INLINE int
00053 netsnmp_check_vb_range(const netsnmp_variable_list *var,
00054 size_t low, size_t high )
00055 {
00056 register int rc = SNMP_ERR_NOERROR;
00057
00058 if (NULL == var)
00059 return SNMP_ERR_GENERR;
00060
00061 if ((*var->val.integer < low) || (*var->val.integer > high)) {
00062 rc = SNMP_ERR_WRONGVALUE;
00063 }
00064
00065 return rc;
00066 }
00067
00068 NETSNMP_INLINE int
00069 netsnmp_check_vb_size_range(const netsnmp_variable_list *var,
00070 size_t low, size_t high )
00071 {
00072 register int rc = SNMP_ERR_NOERROR;
00073
00074 if (NULL == var)
00075 return SNMP_ERR_GENERR;
00076
00077 if ((var->val_len < low) || (var->val_len > high)) {
00078 rc = SNMP_ERR_WRONGLENGTH;
00079 }
00080
00081 return rc;
00082 }
00083
00084 NETSNMP_INLINE int
00085 netsnmp_check_vb_type_and_size(const netsnmp_variable_list *var,
00086 int type, size_t size)
00087 {
00088 register int rc = SNMP_ERR_NOERROR;
00089
00090 if (NULL == var)
00091 return SNMP_ERR_GENERR;
00092
00093 if ((rc = netsnmp_check_vb_type(var,type)))
00094 ;
00095 else
00096 rc = netsnmp_check_vb_size(var, size);
00097
00098 return rc;
00099 }
00100
00101 NETSNMP_INLINE int
00102 netsnmp_check_vb_type_and_max_size(const netsnmp_variable_list *var,
00103 int type, size_t size)
00104 {
00105 register int rc = SNMP_ERR_NOERROR;
00106
00107 if (NULL == var)
00108 return SNMP_ERR_GENERR;
00109
00110 if ((rc = netsnmp_check_vb_type(var,type)))
00111 ;
00112 else
00113 rc = netsnmp_check_vb_max_size(var, size);
00114
00115 return rc;
00116 }
00117
00118 NETSNMP_INLINE int
00119 netsnmp_check_vb_oid(const netsnmp_variable_list *var)
00120 {
00121 register int rc = SNMP_ERR_NOERROR;
00122
00123 if (NULL == var)
00124 return SNMP_ERR_GENERR;
00125
00126 if ((rc = netsnmp_check_vb_type(var,ASN_OBJECT_ID)))
00127 ;
00128 else
00129 rc = netsnmp_check_vb_max_size(var, MAX_OID_LEN*sizeof(oid));
00130
00131 return rc;
00132 }
00133
00134 NETSNMP_INLINE int
00135 netsnmp_check_vb_int(const netsnmp_variable_list *var)
00136 {
00137 if (NULL == var)
00138 return SNMP_ERR_GENERR;
00139
00140 return netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long));
00141 }
00142
00143 NETSNMP_INLINE int
00144 netsnmp_check_vb_uint(const netsnmp_variable_list *var)
00145 {
00146 if (NULL == var)
00147 return SNMP_ERR_GENERR;
00148
00149 return netsnmp_check_vb_type_and_size(var, ASN_UNSIGNED, sizeof(long));
00150 }
00151
00152 NETSNMP_INLINE int
00153 netsnmp_check_vb_int_range(const netsnmp_variable_list *var, int low, int high)
00154 {
00155 register int rc = SNMP_ERR_NOERROR;
00156
00157 if (NULL == var)
00158 return SNMP_ERR_GENERR;
00159
00160 if ((rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long))))
00161 return rc;
00162
00163 if ((*var->val.integer < low) || (*var->val.integer > high)) {
00164 rc = SNMP_ERR_WRONGVALUE;
00165 }
00166
00167 return rc;
00168 }
00169
00170 int
00171 netsnmp_check_vb_truthvalue(const netsnmp_variable_list *var)
00172 {
00173 register int rc = SNMP_ERR_NOERROR;
00174
00175 if (NULL == var)
00176 return SNMP_ERR_GENERR;
00177
00178 if ((rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long))))
00179 return rc;
00180
00181 return netsnmp_check_vb_int_range(var, 1, 2);
00182 }
00183
00184 NETSNMP_INLINE int
00185 netsnmp_check_vb_rowstatus_value(const netsnmp_variable_list *var)
00186 {
00187 register int rc = SNMP_ERR_NOERROR;
00188
00189 if (NULL == var)
00190 return SNMP_ERR_GENERR;
00191
00192 if ((rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long))))
00193 return rc;
00194
00195 if (*var->val.integer == RS_NOTREADY)
00196 return SNMP_ERR_WRONGVALUE;
00197
00198 return netsnmp_check_vb_int_range(var, SNMP_ROW_NONEXISTENT,
00199 SNMP_ROW_DESTROY);
00200 }
00201
00202 int
00203 netsnmp_check_vb_rowstatus(const netsnmp_variable_list *var, int old_value)
00204 {
00205 register int rc = SNMP_ERR_NOERROR;
00206
00207 if (NULL == var)
00208 return SNMP_ERR_GENERR;
00209
00210 if ((rc = netsnmp_check_vb_rowstatus_value(var)))
00211 return rc;
00212
00213 return check_rowstatus_transition(old_value, *var->val.integer);
00214 }
00215
00216 int
00217 netsnmp_check_vb_storagetype(const netsnmp_variable_list *var, int old_value)
00218 {
00219 int rc = SNMP_ERR_NOERROR;
00220
00221 if (NULL == var)
00222 return SNMP_ERR_GENERR;
00223
00224 if ((rc = netsnmp_check_vb_type_and_size(var, ASN_INTEGER, sizeof(long))))
00225 return rc;
00226
00227 if ((rc = netsnmp_check_vb_int_range(var, SNMP_STORAGE_NONE,
00228 SNMP_STORAGE_READONLY)))
00229 return rc;
00230
00231 return check_storage_transition(old_value, *var->val.integer);
00232 }