/* * TargetParamTable MIB * * This file was generated by mib2c and is intended for use as a mib module * for the ucd-snmp snmpd agent. Edited by Michael Baer * * Portions of this file are copyrighted by: * Copyright (c) 2016 VMware, Inc. All rights reserved. * Use is subject to license terms specified in the COPYING file * distributed with the Net-SNMP package. */ #include #if HAVE_STRING_H #include #else #include #endif #include #include #include #include #include "snmpTargetParamsEntry.h" #include "snmpTargetParamsEntry_data.h" #define snmpTargetParamsOIDLen 11 /*This is base+column, * i.e. everything but index */ oid snmpTargetParamsOID[snmpTargetParamsOIDLen] = { 1, 3, 6, 1, 6, 3, 12, 1, 3, 1, 0 }; /* * Utility routines */ /* * snmpTargetParams_rowStatusCheck is boolean funciton that checks * the status of a row's values in order to determine whether * the row should be notReady or notInService */ int snmpTargetParams_rowStatusCheck(struct targetParamTable_struct *entry) { if ((entry->mpModel < 0) || (entry->secModel < 0) || (entry->secLevel < 0) || (entry->secNameData == NULL)) return 0; else return 1; } /* snmtpTargetParamTable_rowStatusCheck */ /* * initialization routines */ /* * this variable defines function callbacks and type return information * for the snmpTargetAddrEntry mib */ struct variable2 snmpTargetParamsEntry_variables[] = { {SNMPTARGETPARAMSMPMODEL, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, var_snmpTargetParamsEntry, 1, {SNMPTARGETPARAMSMPMODELCOLUMN}}, {SNMPTARGETPARAMSSECURITYMODEL, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, var_snmpTargetParamsEntry, 1, {SNMPTARGETPARAMSSECURITYMODELCOLUMN}}, {SNMPTARGETPARAMSSECURITYNAME, ASN_OCTET_STR, NETSNMP_OLDAPI_RWRITE, var_snmpTargetParamsEntry, 1, {SNMPTARGETPARAMSSECURITYNAMECOLUMN}}, {SNMPTARGETPARAMSSECURITYLEVEL, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, var_snmpTargetParamsEntry, 1, {SNMPTARGETPARAMSSECURITYLEVELCOLUMN}}, {SNMPTARGETPARAMSSTORAGETYPE, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, var_snmpTargetParamsEntry, 1, {SNMPTARGETPARAMSSTORAGETYPECOLUMN}}, {SNMPTARGETPARAMSROWSTATUS, ASN_INTEGER, NETSNMP_OLDAPI_RWRITE, var_snmpTargetParamsEntry, 1, {SNMPTARGETPARAMSROWSTATUSCOLUMN}} }; /* * now load this mib into the agents mib table */ oid snmpTargetParamsEntry_variables_oid[] = { 1, 3, 6, 1, 6, 3, 12, 1, 3, 1 }; void init_snmpTargetParamsEntry(void) { init_snmpTargetParamsEntry_data(); REGISTER_MIB("target/snmpTargetParamsEntry", snmpTargetParamsEntry_variables, variable2, snmpTargetParamsEntry_variables_oid); snmpd_register_config_handler("targetParams", snmpd_parse_config_targetParams, (void (*)(void))0, NULL); } /* init_snmpTargetParmsEntry */ void shutdown_snmpTargetParamsEntry(void) { shutdown_snmpTargetParamsEntry_data(); } int snmpTargetParams_addParamName(struct targetParamTable_struct *entry, char *cptr) { size_t len; if (cptr == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: no param name in config string\n")); return (0); } else { len = strlen(cptr); /* * spec check for string 1-32 */ if (len < 1 || len > 32) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: param name out of range in config string\n")); return (0); } entry->paramNameData = strdup(cptr); entry->paramNameLen = strlen(cptr); } return (1); } int snmpTargetParams_addMPModel(struct targetParamTable_struct *entry, char *cptr) { if (cptr == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: no mp model in config string\n")); return (0); } else if (!(isdigit((unsigned char)(*cptr)))) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargeParamsEntry: mp model is not digit in config string\n")); return (0); } /* * spec check MP Model >= 0 */ else if ((entry->mpModel = (int) strtol(cptr, (char **) NULL, 0)) < 0) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargeParamsEntry: mp model out of range in config string\n")); return (0); } return (1); } /* snmpTargetParams_addMPModel */ int snmpTargetParams_addSecModel(struct targetParamTable_struct *entry, char *cptr) { if (cptr == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: no sec model in config string\n")); return (0); } else if (!(isdigit((unsigned char)(*cptr)))) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargeParamsEntry: security model is not digit in config string\n")); return (0); } /* * spec check Sec. Model > 0 */ else if ((entry->secModel = (int) strtol(cptr, (char **) NULL, 0)) <= 0) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: security model out of range in config string\n")); return (0); } return (1); } /* snmpTargetParams_addSecModel */ int snmpTargetParams_addSecName(struct targetParamTable_struct *entry, char *cptr) { if (cptr == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: no security name in config string\n")); return (0); } else { entry->secNameData = strdup(cptr); entry->secNameLen = strlen(cptr); } return (1); } /* snmpTargetParams_addSecName */ int snmpTargetParams_addSecLevel(struct targetParamTable_struct *entry, char *cptr) { if (cptr == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: no security level in config string\n")); return (0); } else if (!(isdigit((unsigned char)(*cptr)))) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargeParamsEntry: security level is not digit in config string\n")); return (0); } /* * no spec range check, but noAuthNoPriv is 1 so... */ else if ((entry->secLevel = (int) strtol(cptr, (char **) NULL, 0)) <= 0) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargeParamsEntry: security level is not greater than 0 in config string\n")); return (0); } return (1); } /* snmpTargetParams_addSecLevel */ int snmpTargetParams_addStorageType(struct targetParamTable_struct *entry, char *cptr) { if (cptr == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: no storage type in config string\n")); return (0); } else if (!(isdigit((unsigned char)(*cptr)))) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargeParamsEntry: storage type is not digit in config string\n")); return (0); } /* * check that storage type is a possible value */ else if (((entry->storageType = (int) strtol(cptr, (char **) NULL, 0)) != SNMP_STORAGE_OTHER) && (entry->storageType != SNMP_STORAGE_VOLATILE) && (entry->storageType != SNMP_STORAGE_NONVOLATILE) && (entry->storageType != SNMP_STORAGE_PERMANENT) && (entry->storageType != SNMP_STORAGE_READONLY)) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargeParamsEntry: storage type is not a valid value of")); DEBUGMSG(("snmpTargetParamsEntry", " other(%d), volatile(%d), nonvolatile(%d), permanent(%d), or ", SNMP_STORAGE_OTHER, SNMP_STORAGE_VOLATILE, SNMP_STORAGE_NONVOLATILE, SNMP_STORAGE_PERMANENT)); DEBUGMSGTL(("snmpTargetParamsEntry", "readonly(%d) in config string.\n", SNMP_STORAGE_READONLY)); return (0); } return (1); } /* snmpTargetParams_addStorageType */ int snmpTargetParams_addRowStatus(struct targetParamTable_struct *entry, char *cptr) { if (cptr == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: no row status in config string\n")); return (0); } else if (!(isdigit((unsigned char)(*cptr)))) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargeParamsEntry: row status is not digit in config string\n")); return (0); } /* * check that row status is a valid value */ else if (((entry->rowStatus = (int) strtol(cptr, (char **) NULL, 0)) != SNMP_ROW_ACTIVE) && (entry->rowStatus != SNMP_ROW_NOTINSERVICE) && (entry->rowStatus != SNMP_ROW_NOTREADY)) { DEBUGMSGTL(("snmpTargetParamsEntry", "ERROR snmpTargetParamsEntry: Row Status is not a valid value of ")); DEBUGMSG(("snmpTargetParamsEntry", "active(%d), notinservice(%d), or notready(%d) in config string.\n", SNMP_ROW_ACTIVE, SNMP_ROW_NOTINSERVICE, SNMP_ROW_NOTREADY)); return (0); } return (1); } /* snmpTargetParams_addRowStatus */ /* * timestamp the current entry's modification time */ void update_timestamp(struct targetParamTable_struct *temp_struct) { temp_struct->updateTime = time(NULL); } void snmpd_parse_config_targetParams(const char *token, char *char_ptr) { char *cptr = char_ptr, buff[1024]; struct targetParamTable_struct *newEntry; newEntry = snmpTargetParamTable_create(); cptr = copy_nword(cptr, buff, sizeof(buff)); if (snmpTargetParams_addParamName(newEntry, buff) == 0) { snmpTargetParamTable_dispose(newEntry); return; } cptr = copy_nword(cptr, buff, sizeof(buff)); if (snmpTargetParams_addMPModel(newEntry, buff) == 0) { snmpTargetParamTable_dispose(newEntry); return; } cptr = copy_nword(cptr, buff, sizeof(buff)); if (snmpTargetParams_addSecModel(newEntry, buff) == 0) { snmpTargetParamTable_dispose(newEntry); return; } cptr = copy_nword(cptr, buff, sizeof(buff)); if (snmpTargetParams_addSecName(newEntry, buff) == 0) { snmpTargetParamTable_dispose(newEntry); return; } cptr = copy_nword(cptr, buff, sizeof(buff)); if (snmpTargetParams_addSecLevel(newEntry, buff) == 0) { snmpTargetParamTable_dispose(newEntry); return; } cptr = copy_nword(cptr, buff, sizeof(buff)); if (snmpTargetParams_addStorageType(newEntry, buff) == 0) { snmpTargetParamTable_dispose(newEntry); return; } cptr = copy_nword(cptr, buff, sizeof(buff)); if (snmpTargetParams_addRowStatus(newEntry, buff) == 0) { snmpTargetParamTable_dispose(newEntry); return; } DEBUGMSGTL(("snmpTargetParamsEntry", "snmp_parse_config_targetParams, read: %s %d %d %s %d %d %d\n", newEntry->paramNameData, newEntry->mpModel, newEntry->secModel, newEntry->secNameData, newEntry->secLevel, newEntry->storageType, newEntry->rowStatus)); update_timestamp(newEntry); snmpTargetParamTable_add(newEntry); } /* snmpd_parse_config_target */ /* * shutdown routines */ /* * MIB table access routines */ u_char * var_snmpTargetParamsEntry(struct variable * vp, oid * name, size_t * length, int exact, size_t * var_len, WriteMethod ** write_method) { /* * variables we may use later */ static long long_ret; static unsigned char string[1500]; struct targetParamTable_struct *temp_struct; switch (vp->magic) { #ifndef NETSNMP_NO_WRITE_SUPPORT case SNMPTARGETPARAMSMPMODEL: *write_method = write_snmpTargetParamsMPModel; break; case SNMPTARGETPARAMSSECURITYMODEL: *write_method = write_snmpTargetParamsSecModel; break; case SNMPTARGETPARAMSSECURITYNAME: *write_method = write_snmpTargetParamsSecName; break; case SNMPTARGETPARAMSSECURITYLEVEL: *write_method = write_snmpTargetParamsSecLevel; break; case SNMPTARGETPARAMSSTORAGETYPE: *write_method = write_snmpTargetParamsStorageType; break; case SNMPTARGETPARAMSROWSTATUS: *write_method = write_snmpTargetParamsRowStatus; break; #endif /* !NETSNMP_NO_WRITE_SUPPORT */ default: *write_method = NULL; } /* assume an integer and change later if not */ *var_len = sizeof(long_ret); /* * look for OID in current table */ if ((temp_struct = search_snmpTargetParamsTable(vp->name, vp->namelen, name, length, exact)) == NULL) { return NULL; } /* * We found what we were looking for, either the next OID or the exact OID */ /* * this is where we do the value assignments for the mib results. */ switch (vp->magic) { case SNMPTARGETPARAMSMPMODEL: /* * if unset value, (i.e. new row) */ if (temp_struct->mpModel == -1) return NULL; long_ret = temp_struct->mpModel; return (unsigned char *) &long_ret; case SNMPTARGETPARAMSSECURITYMODEL: /* * if unset value, (i.e. new row) */ if (temp_struct->secModel == -1) return NULL; long_ret = temp_struct->secModel; return (unsigned char *) &long_ret; case SNMPTARGETPARAMSSECURITYNAME: /* * if unset value, (i.e. new row) */ if (temp_struct->secNameData == NULL) return NULL; /* * including null character. */ strlcpy((char *)string, temp_struct->secNameData, sizeof(string)); *var_len = strlen(temp_struct->secNameData); return (unsigned char *) string; case SNMPTARGETPARAMSSECURITYLEVEL: /* * if unset value, (i.e. new row) */ if (temp_struct->secLevel == -1) return NULL; long_ret = temp_struct->secLevel; return (unsigned char *) &long_ret; case SNMPTARGETPARAMSSTORAGETYPE: long_ret = temp_struct->storageType; return (unsigned char *) &long_ret; case SNMPTARGETPARAMSROWSTATUS: long_ret = temp_struct->rowStatus; return (unsigned char *) &long_ret; default: DEBUGMSGTL(("snmpd", "unknown sub-id %d in var_snmpTargetParamsEntry\n", vp->magic)); } return NULL; } /* var_snmpTargetParamsEntry */ #ifndef NETSNMP_NO_WRITE_SUPPORT /* * Assign a value to the mpModel variable. */ int write_snmpTargetParamsMPModel(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len) { long long_ret = *((long *) var_val); static long old_mp; struct targetParamTable_struct *params = NULL; if (action == RESERVE1) { if (var_val_type != ASN_INTEGER) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsMPModel: not ASN_INTEGER\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len != sizeof(long)) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsMPModel: bad length\n")); return SNMP_ERR_WRONGLENGTH; } if (long_ret < 0) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsMPModel: MP Model out of range\n")); return SNMP_ERR_INCONSISTENTVALUE; } } else if (action == RESERVE2) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSMPMODELCOLUMN; params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1); if (params == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsMPModel: BAD OID\n")); return SNMP_ERR_INCONSISTENTNAME; } else { /* * Row exists, check if it is changeable. */ if (params->storageType == SNMP_STORAGE_READONLY) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamMPModel: row is read only\n")); return SNMP_ERR_NOTWRITABLE; } /* * Check if row is active. */ if (params->rowStatus == SNMP_ROW_ACTIVE) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsMPModel: this change not allowed in active row.\n")); return SNMP_ERR_INCONSISTENTVALUE; } old_mp = params->mpModel; params->mpModel = long_ret; if (params->rowStatus == SNMP_ROW_NOTREADY && snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_NOTINSERVICE; } } } else if (action == COMMIT) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSMPMODELCOLUMN; if ((params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1)) != NULL) { update_timestamp(params); } } else if (action == FREE || action == UNDO) { /* * Try to undo the SET here (abnormal usage of FREE clause) */ snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSMPMODELCOLUMN; if ((params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1)) != NULL) { if (params->storageType != SNMP_STORAGE_READONLY && params->rowStatus != SNMP_ROW_ACTIVE) { params->mpModel = old_mp; if (params->rowStatus == SNMP_ROW_NOTINSERVICE && !snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_NOTREADY; } } } } return SNMP_ERR_NOERROR; } /* write_snmpTargetParamsMPModel */ /* * Assign a value to the secModel variable. */ int write_snmpTargetParamsSecModel(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len) { long long_ret = *((long *) var_val); static long old_sec; struct targetParamTable_struct *params = NULL; if (action == RESERVE1) { if (var_val_type != ASN_INTEGER) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecModel: not ASN_INTEGER\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len != sizeof(long)) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecModel: bad length\n")); return SNMP_ERR_WRONGLENGTH; } if (long_ret <= 0) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecModel: secModel out of range\n")); return SNMP_ERR_WRONGVALUE; } if (find_sec_mod(long_ret) == NULL && long_ret >= 3) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecModel: secModel %ld unsupported\n", long_ret)); return SNMP_ERR_INCONSISTENTVALUE; } } else if (action == RESERVE2) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSECURITYMODELCOLUMN; params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1); if (params == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecModel: BAD OID\n")); return SNMP_ERR_INCONSISTENTNAME; } else { /* * Row exists, check if it is changeable. */ if (params->storageType == SNMP_STORAGE_READONLY) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamSecModel: row is read only\n")); return SNMP_ERR_NOTWRITABLE; } /* * Check if row is active. */ if (params->rowStatus == SNMP_ROW_ACTIVE) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecModel: this change not allowed in active row.\n")); return SNMP_ERR_INCONSISTENTVALUE; } old_sec = params->secModel; params->secModel = long_ret; if (params->rowStatus == SNMP_ROW_NOTREADY && snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_NOTINSERVICE; } } } else if (action == COMMIT) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSECURITYMODELCOLUMN; if ((params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1)) != NULL) { update_timestamp(params); } } else if (action == FREE || action == UNDO) { /* * Try to undo the SET here (abnormal usage of FREE clause) */ snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSECURITYMODELCOLUMN; if ((params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1)) != NULL) { if (params->storageType != SNMP_STORAGE_READONLY && params->rowStatus != SNMP_ROW_ACTIVE) { params->secModel = old_sec; if (params->rowStatus == SNMP_ROW_NOTINSERVICE && !snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_NOTREADY; } } } } return SNMP_ERR_NOERROR; } /* write_snmpTargetParamsSecModel */ /* * Assign a value to the SecLevel variable. */ int write_snmpTargetParamsSecLevel(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len) { long long_ret = *((long *) var_val); static long old_level; struct targetParamTable_struct *params = NULL; if (action == RESERVE1) { if (var_val_type != ASN_INTEGER) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecLevel: not ASN_INTEGER\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len != sizeof(long)) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecLevel: bad length\n")); return SNMP_ERR_WRONGLENGTH; } if (long_ret <= 0 || long_ret > 3) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecLevel: security level is not noAuthNoPriv(1), authNopriv(2) or authPriv(3)\n")); return SNMP_ERR_WRONGVALUE; } } else if (action == RESERVE2) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSECURITYLEVELCOLUMN; params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1); if (params == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecLevel: BAD OID\n")); return SNMP_ERR_INCONSISTENTNAME; } else { /* * Row exists, check if it is changeable. */ if (params->storageType == SNMP_STORAGE_READONLY) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamSecLevel: row is read only\n")); return SNMP_ERR_NOTWRITABLE; } /* * Check if row is active. */ if (params->rowStatus == SNMP_ROW_ACTIVE) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecLevel: this change not allowed in active row.\n")); return SNMP_ERR_INCONSISTENTVALUE; } old_level = params->secLevel; params->secLevel = long_ret; if (params->rowStatus == SNMP_ROW_NOTREADY && snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_NOTINSERVICE; } } } else if (action == COMMIT) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSECURITYLEVELCOLUMN; if ((params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1)) != NULL) { update_timestamp(params); } } else if (action == FREE || action == UNDO) { /* * Try to undo the SET here (abnormal usage of FREE clause) */ snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSECURITYLEVELCOLUMN; if ((params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1)) != NULL) { if (params->storageType != SNMP_STORAGE_READONLY && params->rowStatus != SNMP_ROW_ACTIVE) { params->secLevel = old_level; if (params->rowStatus == SNMP_ROW_NOTINSERVICE && !snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_NOTREADY; } } } } return SNMP_ERR_NOERROR; } /* write_snmpTargetParamsSecLevel */ /* * Assign a value to the storageType variable. */ int write_snmpTargetParamsStorageType(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len) { long long_ret = *((long *) var_val); static long old_st; struct targetParamTable_struct *params = NULL; if (action == RESERVE1) { if (var_val_type != ASN_INTEGER) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsStorageType: not ASN_INTEGER\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len != sizeof(long)) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsStorageType: bad length\n")); return SNMP_ERR_WRONGLENGTH; } if (long_ret != SNMP_STORAGE_OTHER && long_ret != SNMP_STORAGE_VOLATILE && long_ret != SNMP_STORAGE_NONVOLATILE) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsStorageType: attempted storage type not a valid")); DEBUGMSG(("snmpTargetParamsEntry", " value of other(%d), volatile(%d), or nonvolatile(%d)\n", SNMP_STORAGE_OTHER, SNMP_STORAGE_VOLATILE, SNMP_STORAGE_NONVOLATILE)); return SNMP_ERR_WRONGVALUE; } } else if (action == RESERVE2) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSTORAGETYPECOLUMN; params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1); if (params == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsStorageType: BAD OID\n")); return SNMP_ERR_INCONSISTENTNAME; } else { /* * Row exists, check if it is changeable. */ if (params->storageType == SNMP_STORAGE_READONLY || params->storageType == SNMP_STORAGE_PERMANENT) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsStorageType: row has unchangeable storage status: %d\n", params->storageType)); return SNMP_ERR_INCONSISTENTVALUE; } old_st = params->storageType; params->storageType = long_ret; } } else if (action == FREE || action == UNDO) { /* * Try to undo the SET here (abnormal usage of FREE clause) */ snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSTORAGETYPECOLUMN; if ((params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1)) != NULL) { if (params->storageType != SNMP_STORAGE_READONLY && params->storageType != SNMP_STORAGE_PERMANENT) { params->storageType = old_st; } } } return SNMP_ERR_NOERROR; } /* write_snmpTargetParamsStorageType */ /* * Assign a value to the secName variable. */ int write_snmpTargetParamsSecName(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len) { static char *old_name = NULL; static size_t old_name_len; struct targetParamTable_struct *params = NULL; if (action == RESERVE1) { if (var_val_type != ASN_OCTET_STR) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecName: not ASN_OCTET_STR\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len > 255) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecName: bad length\n")); return SNMP_ERR_WRONGLENGTH; } } else if (action == RESERVE2) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSECURITYNAMECOLUMN; params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1); if (params == NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecName: BAD OID\n")); return SNMP_ERR_INCONSISTENTNAME; } else { /* * Row exists, check if it is changeable. */ if (params->storageType == SNMP_STORAGE_READONLY) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamSecName: row is read only\n")); return SNMP_ERR_NOTWRITABLE; } /* * Check if row is active. */ if (params->rowStatus == SNMP_ROW_ACTIVE) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsSecName: this change not allowed in active row.\n")); return SNMP_ERR_INCONSISTENTVALUE; } if (old_name != NULL) { DEBUGMSGTL(("snmpTargetParamsEntry", "multiple rows/sets no supported.\n")); return SNMP_ERR_GENERR; } old_name = params->secNameData; old_name_len = params->secNameLen; params->secNameData = netsnmp_memdup_nt(var_val, var_val_len, ¶ms->secNameLen); if (params->secNameData == NULL) { return SNMP_ERR_RESOURCEUNAVAILABLE; } if (params->rowStatus == SNMP_ROW_NOTREADY && snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_NOTINSERVICE; } } } else if (action == COMMIT) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSECURITYNAMECOLUMN; if ((params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1)) != NULL) { update_timestamp(params); SNMP_FREE(old_name); old_name = NULL; } } else if (action == FREE || action == UNDO) { /* * Try to undo the SET here (abnormal usage of FREE clause) */ snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSSECURITYNAMECOLUMN; if ((params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1)) != NULL) { if (params->storageType != SNMP_STORAGE_READONLY && params->rowStatus != SNMP_ROW_ACTIVE) { SNMP_FREE(params->secNameData); params->secNameData = old_name; params->secNameLen = old_name_len; if (params->rowStatus == SNMP_ROW_NOTINSERVICE && !snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_NOTREADY; } } } old_name = NULL; } return SNMP_ERR_NOERROR; } /* write_snmpTargetParamsSecName */ /* * snmpTargeParams_createNewRow is called from write_snmpTargetParamsRowStatus * when a new row is required. It creates a new row with * the index of the passed in 'name' (i.e. full index OID) and * adds it to the linked list. 'name' should be the full OID of the new index. * It passes back 0 if unsuccessfull. */ int snmpTargetParams_createNewRow(oid * name, size_t name_len) { int pNameLen, i; struct targetParamTable_struct *temp_struct; /* * setup a new snmpTargetParamTable structure and add it to the list */ pNameLen = name_len - snmpTargetParamsOIDLen; if (pNameLen > 0) { temp_struct = snmpTargetParamTable_create(); if (NULL == temp_struct) return 0; temp_struct->paramNameData = (char *) malloc(pNameLen + 1); for (i = 0; i < pNameLen; i++) { temp_struct->paramNameData[i] = (char) name[i + snmpTargetParamsOIDLen]; } temp_struct->paramNameData[pNameLen] = '\0'; temp_struct->paramNameLen = pNameLen; temp_struct->rowStatus = SNMP_ROW_NOTREADY; update_timestamp(temp_struct); snmpTargetParamTable_add(temp_struct); return 1; } return 0; } /* snmpTargetParams_createNewRow */ /* * Assign a value to the Row Status variable */ int write_snmpTargetParamsRowStatus(int action, u_char * var_val, u_char var_val_type, size_t var_val_len, u_char * statP, oid * name, size_t name_len) { static long value; struct targetParamTable_struct *params = NULL; if (action == RESERVE1) { if (var_val_type != ASN_INTEGER) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsRowStatus not ASN_INTEGER\n")); return SNMP_ERR_WRONGTYPE; } if (var_val_len != sizeof(long)) { DEBUGMSGTL(("snmpTargetParamsEntry", "write to snmpTargetParamsRowStatus: bad length\n")); return SNMP_ERR_WRONGLENGTH; } value = *((long *) var_val); if (value == SNMP_ROW_NOTREADY || value < 1 || value > 6) { return SNMP_ERR_WRONGVALUE; } /* * Check index value is reasonable. */ if (name_len < snmpTargetParamsOIDLen + 1 || name_len > snmpTargetParamsOIDLen + 32) { DEBUGMSGTL(("snmpTargetParamsEntry", "bad index length %d\n", (int)(name_len - snmpTargetParamsOIDLen))); return SNMP_ERR_NOCREATION; } snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSROWSTATUSCOLUMN; params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1); if (params != NULL) { if (value == SNMP_ROW_CREATEANDGO || value == SNMP_ROW_CREATEANDWAIT) { value = SNMP_ROW_NOTREADY; return SNMP_ERR_INCONSISTENTVALUE; } if (params->storageType == SNMP_STORAGE_READONLY) { DEBUGMSGTL(("snmpTargetParamsEntry", "row is read only\n")); return SNMP_ERR_NOTWRITABLE; } if (params->storageType == SNMP_STORAGE_PERMANENT) { if (value == SNMP_ROW_DESTROY) { DEBUGMSGTL(("snmpTargetParamsEntry", "unable to destroy permanent row\n")); return SNMP_ERR_INCONSISTENTVALUE; } } } else { if (value == SNMP_ROW_ACTIVE || value == SNMP_ROW_NOTINSERVICE) { return SNMP_ERR_INCONSISTENTVALUE; } if (value == SNMP_ROW_CREATEANDGO || value == SNMP_ROW_CREATEANDWAIT) { if (snmpTargetParams_createNewRow(name, name_len) == 0) { DEBUGMSGTL(("snmpTargetParamsEntry", "couldn't malloc() new row\n")); return SNMP_ERR_RESOURCEUNAVAILABLE; } } } } else if (action == ACTION) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSROWSTATUSCOLUMN; params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1); if (params != NULL) { if (value == SNMP_ROW_CREATEANDGO) { /* * Check whether all the required objects have been set. */ if (snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_ACTIVE; } else { params->rowStatus = SNMP_ROW_NOTREADY; } } else if (value == SNMP_ROW_CREATEANDWAIT) { /* * Check whether all the required objects have been set. */ if (snmpTargetParams_rowStatusCheck(params)) { params->rowStatus = SNMP_ROW_NOTINSERVICE; } else { params->rowStatus = SNMP_ROW_NOTREADY; } } else if (value == SNMP_ROW_ACTIVE) { if (params->rowStatus == SNMP_ROW_NOTINSERVICE) { params->rowStatus = SNMP_ROW_ACTIVE; } else if (params->rowStatus == SNMP_ROW_NOTREADY) { return SNMP_ERR_INCONSISTENTVALUE; } } else if (value == SNMP_ROW_NOTINSERVICE) { if (params->rowStatus == SNMP_ROW_ACTIVE) { params->rowStatus = SNMP_ROW_NOTINSERVICE; } else if (params->rowStatus == SNMP_ROW_NOTREADY) { return SNMP_ERR_INCONSISTENTVALUE; } } } } else if (action == COMMIT) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSROWSTATUSCOLUMN; params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1); if (params != NULL) { if (value == SNMP_ROW_DESTROY) { snmpTargetParamTable_remove(params); } if (value == SNMP_ROW_ACTIVE || value == SNMP_ROW_NOTINSERVICE) { update_timestamp(params); } } } else if (action == UNDO || action == FREE) { snmpTargetParamsOID[snmpTargetParamsOIDLen - 1] = SNMPTARGETPARAMSROWSTATUSCOLUMN; params = search_snmpTargetParamsTable(snmpTargetParamsOID, snmpTargetParamsOIDLen, name, &name_len, 1); if (value == SNMP_ROW_CREATEANDGO || value == SNMP_ROW_CREATEANDWAIT) { if (params != NULL) { snmpTargetParamTable_remove(params); } } } return SNMP_ERR_NOERROR; } #endif /* !NETSNMP_NO_WRITE_SUPPORT */