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 }
Last modified: Wednesday, 01-Aug-2018 04:41:28 UTC
For questions regarding web content and site functionality, please write to the net-snmp-users mail list.