usmDHUserKeyTable_data_set.c0000644
上传用户:wxp200602
上传日期:2007-10-30
资源大小:4028k
文件大小:43k
源码类别:

SNMP编程

开发平台:

Unix_Linux

  1. /*
  2.  * Note: this file originally auto-generated by mib2c using
  3.  *       version : 1.18 $ of : mfd-data-set.m2c,v $
  4.  *
  5.  * $Id: usmDHUserKeyTable_data_set.c,v 1.7 2004/10/16 00:35:35 rstory Exp $
  6.  *
  7.  */
  8. /*
  9.  * standard Net-SNMP includes 
  10.  */
  11. #include <net-snmp/net-snmp-config.h>
  12. #include <net-snmp/net-snmp-includes.h>
  13. #include <net-snmp/agent/net-snmp-agent-includes.h>
  14. #include <openssl/dh.h>
  15. /*
  16.  * include our parent header 
  17.  */
  18. #define NEED_USMDH_FUNCTIONS
  19. #include "usmDHUserKeyTable.h"
  20. int
  21. usmDHUserCheckValue(struct usmUser *user, int for_auth_key,
  22.                     char *val, size_t val_len)
  23. {
  24.     /*
  25.      * The set value must be composed of 2 parts, the first being the
  26.      * current value 
  27.      */
  28.     char           *current_value;
  29.     size_t          current_value_len;
  30.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserCheckValue",
  31.                 "calledn"));
  32.     usmDHGetUserKeyChange(user, for_auth_key,
  33.                           &current_value, &current_value_len);
  34.     if (!current_value)
  35.         return MFD_ERROR;
  36.     if (val_len != current_value_len * 2)
  37.         return MFD_NOT_VALID_NOW;
  38.     if (memcmp(current_value, val, current_value_len) != 0)
  39.         return SNMP_ERR_WRONGVALUE;     /* mandated error string */
  40.     return MFD_SUCCESS;
  41. }
  42. int
  43. usmDHSetKey(struct usmUser *user, int for_auth_key,
  44.             char *val, size_t val_len)
  45. {
  46.     DH             *dh;
  47.     BIGNUM         *other_pub;
  48.     char           *key;
  49.     size_t          key_len;
  50.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHSetKey", "calledn"));
  51.     /*
  52.      * XXX: mem leaks on errors abound 
  53.      */
  54.     dh = usmDHGetUserDHptr(user, for_auth_key);
  55.     if (!dh)
  56.         return MFD_ERROR;
  57.     other_pub = BN_bin2bn(val + val_len / 2, val_len / 2, NULL);
  58.     if (!other_pub)
  59.         return MFD_ERROR;
  60.     /*
  61.      * Set the new key for a user 
  62.      */
  63.     key_len = DH_size(dh);
  64.     key = malloc(DH_size(dh));
  65.     if (!key)
  66.         return MFD_ERROR;
  67.     if (DH_compute_key(key, other_pub, dh)) {
  68.         u_char        **replkey;
  69.         size_t          replkey_size;
  70.         if (for_auth_key) {
  71.             replkey_size = user->authKeyLen;
  72.             replkey = &user->authKey;
  73.         } else {
  74.             replkey_size = user->privKeyLen;
  75.             replkey = &user->privKey;
  76.         }
  77.         /*
  78.          * is it large enough? 
  79.          */
  80.         if (key_len < replkey_size)
  81.             return MFD_ERROR;
  82.         /*
  83.          * copy right most bits, per the object requirements 
  84.          */
  85.         SNMP_FREE(*replkey);
  86.         memdup(replkey, key + key_len - replkey_size, replkey_size);
  87.         return MFD_SUCCESS;
  88.     }
  89.     return MFD_ERROR;
  90. }
  91. /** @defgroup data_set data_set: Routines to set data
  92.  *
  93.  * These routines are used to set the value for individual objects. The
  94.  * row context is passed, along with the new value.
  95.  * 
  96.  * @{
  97.  */
  98. /**********************************************************************
  99.  **********************************************************************
  100.  ***
  101.  *** Table usmDHUserKeyTable
  102.  ***
  103.  **********************************************************************
  104.  **********************************************************************/
  105. /*
  106.  * usmDHUserKeyTable is subid 2 of usmDHPublicObjects.
  107.  * Its status is Current.
  108.  * OID: .1.3.6.1.3.101.1.1.2, length: 9
  109.  */
  110.     /*
  111.      * NOTE: if you update this chart, please update the versions in
  112.      *       local/mib2c-conf.d/parent-set.m2i
  113.      *       agent/mibgroup/helpers/baby_steps.c
  114.      * while you're at it.
  115.      */
  116.     /*
  117.      ***********************************************************************
  118.      * Baby Steps Flow Chart (2004.06.05)                                  *
  119.      *                                                                     *
  120.      * +--------------+    +================+    U = unconditional path    *
  121.      * |optional state|    ||required state||    S = path for success      *
  122.      * +--------------+    +================+    E = path for error        *
  123.      ***********************************************************************
  124.      *
  125.      *                        +--------------+
  126.      *                        |     pre      |
  127.      *                        |   request    |
  128.      *                        +--------------+
  129.      *                               | U
  130.      *                        +==============+
  131.      *       +----------------||  object    ||
  132.      *       |              E ||  lookup    ||
  133.      *       |                +==============+
  134.      *       |                       | S
  135.      *       |                +==============+
  136.      *       |              E ||   check    ||
  137.      *       |<---------------||   values   ||
  138.      *       |                +==============+
  139.      *       |                       | S
  140.      *       |                +==============+
  141.      *       |       +<-------||   undo     ||
  142.      *       |       |      E ||   setup    ||
  143.      *       |       |        +==============+
  144.      *       |       |               | S
  145.      *       |       |        +==============+
  146.      *       |       |        ||    set     ||-------------------------->+
  147.      *       |       |        ||   value    || E                         |
  148.      *       |       |        +==============+                           |
  149.      *       |       |               | S                                 |
  150.      *       |       |        +--------------+                           |
  151.      *       |       |        |    check     |-------------------------->|
  152.      *       |       |        |  consistency | E                         |
  153.      *       |       |        +--------------+                           |
  154.      *       |       |               | S                                 |
  155.      *       |       |        +==============+         +==============+  |
  156.      *       |       |        ||   commit   ||-------->||     undo   ||  |
  157.      *       |       |        ||            || E       ||    commit  ||  |
  158.      *       |       |        +==============+         +==============+  |
  159.      *       |       |               | S                     U |<--------+
  160.      *       |       |        +--------------+         +==============+
  161.      *       |       |        | irreversible |         ||    undo    ||
  162.      *       |       |        |    commit    |         ||     set    ||
  163.      *       |       |        +--------------+         +==============+
  164.      *       |       |               | U                     U |
  165.      *       |       +-------------->|<------------------------+
  166.      *       |                +==============+
  167.      *       |                ||   undo     ||
  168.      *       |                ||  cleanup   ||
  169.      *       |                +==============+
  170.      *       +---------------------->| U
  171.      *                        +--------------+
  172.      *                        |    post      |
  173.      *                        |   request    |
  174.      *                        +--------------+
  175.      *
  176.      */
  177. /**
  178.  * Setup up context with information needed to undo a set request.
  179.  *
  180.  * This function will be called before the individual node undo setup
  181.  * functions are called. If you need to do any undo setup that is not
  182.  * related to a specific column, you can do it here.
  183.  *
  184.  * Note that an individual node's undo_setup function will only be called
  185.  * if that node is being set to a new value.
  186.  *
  187.  * If there is any setup specific to a particular column (e.g. allocating
  188.  * memory for a string), you should do that setup in the node's undo_setup
  189.  * function, so it won't be done unless it is necessary.
  190.  *
  191.  * @param rowreq_ctx
  192.  *        Pointer to the table context (usmDHUserKeyTable_rowreq_ctx)
  193.  *
  194.  * @retval MFD_SUCCESS : success
  195.  * @retval MFD_ERROR   : error. set will fail.
  196.  */
  197. int
  198. usmDHUserKeyTable_undo_setup(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx)
  199. {
  200.     int             rc = MFD_SUCCESS;
  201.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_undo_setup",
  202.                 "calledn"));
  203.     /** we should have a non-NULL pointer */
  204.     netsnmp_assert(NULL != rowreq_ctx);
  205.     /*
  206.      * TODO:451:M: |-> Setup usmDHUserKeyTable undo.
  207.      * set up usmDHUserKeyTable undo information, in preparation for a set.
  208.      */
  209.     return rc;
  210. }                               /* usmDHUserKeyTable_undo_setup */
  211. /**
  212.  * Cleanup up context undo information.
  213.  *
  214.  * This function will be called after set/commit processing. If you
  215.  * allocated any resources in undo_setup, this is the place to release
  216.  * those resources.
  217.  *
  218.  * This function is called regardless of the success or failure of the set
  219.  * request. If you need to perform different steps for cleanup depending
  220.  * on success or failure, you can add a flag to the rowreq_ctx.
  221.  *
  222.  * @param rowreq_ctx
  223.  *        Pointer to the table context (usmDHUserKeyTable_rowreq_ctx)
  224.  *
  225.  * @retval MFD_SUCCESS : success
  226.  * @retval MFD_ERROR   : error
  227.  */
  228. int
  229. usmDHUserKeyTable_undo_cleanup(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx)
  230. {
  231.     int             rc = MFD_SUCCESS;
  232.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_undo_cleanup",
  233.                 "calledn"));
  234.     /** we should have a non-NULL pointer */
  235.     netsnmp_assert(NULL != rowreq_ctx);
  236.     /*
  237.      * TODO:452:M: |-> Cleanup usmDHUserKeyTable undo.
  238.      */
  239.     return rc;
  240. }                               /* usmDHUserKeyTable_undo_cleanup */
  241. /**
  242.  * commit new values.
  243.  *
  244.  * At this point, you should have done everything you can to ensure that
  245.  * this commit will not fail.
  246.  *
  247.  * Should you need different behavior depending on which columns were
  248.  * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
  249.  * set. The definitions for the FLAG_* bits can be found in
  250.  * usmDHUserKeyTable_oids.h.
  251.  * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
  252.  *
  253.  * @param usmDHUserKeyTable_rowreq_ctx
  254.  *        Pointer to the users context.
  255.  *
  256.  * @retval MFD_SUCCESS : success
  257.  * @retval MFD_ERROR   : error
  258.  */
  259. int
  260. usmDHUserKeyTable_commit(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx)
  261. {
  262.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_commit",
  263.                 "calledn"));
  264.     /*
  265.      * nothing to do; we wait for the irreversible commit
  266.      */
  267.     return MFD_SUCCESS;
  268. }                               /* usmDHUserKeyTable_commit */
  269. /**
  270.  * undo commit new values.
  271.  *
  272.  * Should you need different behavior depending on which columns were
  273.  * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
  274.  * set. The definitions for the FLAG_* bits can be found in
  275.  * usmDHUserKeyTable_oids.h.
  276.  * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
  277.  *
  278.  * @param usmDHUserKeyTable_rowreq_ctx
  279.  *        Pointer to the users context.
  280.  *
  281.  * @retval MFD_SUCCESS : success
  282.  * @retval MFD_ERROR   : error
  283.  */
  284. int
  285. usmDHUserKeyTable_undo_commit(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx)
  286. {
  287.     int             rc = MFD_SUCCESS;
  288.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_undo_commit",
  289.                 "calledn"));
  290.     /** we should have a non-NULL pointer */
  291.     netsnmp_assert(NULL != rowreq_ctx);
  292.     /*
  293.      * TODO:485:M: |-> Undo usmDHUserKeyTable commit.
  294.      * check the column's flag in rowreq_ctx->column_set_flags to see
  295.      * if it was set during commit, then undo it.
  296.      *
  297.      * eg: if (rowreq_ctx->column_set_flags & FLAG_) {}
  298.      */
  299.     return rc;
  300. }                               /* usmDHUserKeyTable_undo_commit */
  301. /**
  302.  * perform commit actions that are not reversible
  303.  *
  304.  * THERE IS NO ATTEMPT AT RECOVERY FOR ERRORS FROM THIS STATE!
  305.  *
  306.  * @param usmDHUserKeyTable_rowreq_ctx
  307.  *        Pointer to the users context.
  308.  *
  309.  * @retval MFD_SUCCESS : success
  310.  * @retval MFD_ERROR   : other error
  311.  */
  312. int
  313. usmDHUserKeyTable_irreversible_commit(usmDHUserKeyTable_rowreq_ctx *
  314.                                       rowreq_ctx)
  315. {
  316.     struct usmUser *user;
  317.     int             flags;
  318.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserKeyTable_irreversible_commit", "calledn"));
  319.     /** we should have a non-NULL pointer */
  320.     netsnmp_assert(NULL != rowreq_ctx);
  321.     /*
  322.      * TODO:495:o: Irreversible usmDHUserKeyTable commit.
  323.      */
  324.     user = rowreq_ctx->data;
  325.     flags = rowreq_ctx->column_set_flags;
  326.     if (flags & FLAG_USMDHUSERAUTHKEYCHANGE ||
  327.         flags & FLAG_USMDHUSEROWNAUTHKEYCHANGE) {
  328.         /*
  329.          * free the keychange objects so they reset to new values 
  330.          */
  331.         DH_free(user->usmDHUserAuthKeyChange);
  332.         user->usmDHUserAuthKeyChange = NULL;
  333.     }
  334.     if (flags & FLAG_USMDHUSERPRIVKEYCHANGE ||
  335.         flags & FLAG_USMDHUSEROWNPRIVKEYCHANGE) {
  336.         /*
  337.          * free the keychange objects so they reset to new values 
  338.          */
  339.         DH_free(user->usmDHUserPrivKeyChange);
  340.         user->usmDHUserPrivKeyChange = NULL;
  341.     }
  342.     return MFD_SUCCESS;
  343. }                               /* usmDHUserKeyTable_irreversible_commit */
  344. /*
  345.  * TODO:420:r: Implement usmDHUserKeyTable index validation.
  346.  */
  347. /*---------------------------------------------------------------------
  348.  * SNMP-USER-BASED-SM-MIB::usmUserEntry.usmUserEngineID
  349.  * usmUserEngineID is subid 1 of usmUserEntry.
  350.  * Its status is Current, and its access level is NoAccess.
  351.  * OID: .1.3.6.1.6.3.15.1.2.2.1.1
  352.  * Description:
  353. An SNMP engine's administratively-unique identifier.
  354.                  In a simple agent, this value is always that agent's
  355.                  own snmpEngineID value.
  356.                  The value can also take the value of the snmpEngineID
  357.                  of a remote SNMP engine with which this user can
  358.                  communicate.
  359.                 
  360.  *
  361.  * Attributes:
  362.  *   accessible 0     isscalar 0     enums  0      hasdefval 0
  363.  *   readable   0     iscolumn 1     ranges 1      hashint   0
  364.  *   settable   0
  365.  *
  366.  * Ranges:  5 - 32;
  367.  *
  368.  * Its syntax is SnmpEngineID (based on perltype OCTETSTR)
  369.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  370.  * This data type requires a length.  (Max 32)
  371.  *
  372.  *
  373.  *
  374.  * NOTE: NODE usmUserEngineID IS NOT ACCESSIBLE
  375.  *
  376.  *
  377.  */
  378. /*---------------------------------------------------------------------
  379.  * SNMP-USER-BASED-SM-MIB::usmUserEntry.usmUserName
  380.  * usmUserName is subid 2 of usmUserEntry.
  381.  * Its status is Current, and its access level is NoAccess.
  382.  * OID: .1.3.6.1.6.3.15.1.2.2.1.2
  383.  * Description:
  384. A human readable string representing the name of
  385.                  the user.
  386.                  This is the (User-based Security) Model dependent
  387.                  security ID.
  388.                 
  389.  *
  390.  * Attributes:
  391.  *   accessible 0     isscalar 0     enums  0      hasdefval 0
  392.  *   readable   0     iscolumn 1     ranges 1      hashint   1
  393.  *   settable   0
  394.  *   hint: 255t
  395.  *
  396.  * Ranges:  1 - 32;
  397.  *
  398.  * Its syntax is SnmpAdminString (based on perltype OCTETSTR)
  399.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  400.  * This data type requires a length.  (Max 32)
  401.  *
  402.  *
  403.  *
  404.  * NOTE: NODE usmUserName IS NOT ACCESSIBLE
  405.  *
  406.  *
  407.  */
  408. /*
  409.  * TODO:440:M: Implement usmDHUserKeyTable node value checks.
  410.  * TODO:450:M: Implement usmDHUserKeyTable undo functions.
  411.  * TODO:460:M: Implement usmDHUserKeyTable set functions.
  412.  * TODO:480:M: Implement usmDHUserKeyTable commit functions.
  413.  */
  414. /*---------------------------------------------------------------------
  415.  * SNMP-USM-DH-OBJECTS-MIB::usmDHUserKeyEntry.usmDHUserAuthKeyChange
  416.  * usmDHUserAuthKeyChange is subid 1 of usmDHUserKeyEntry.
  417.  * Its status is Current, and its access level is Create.
  418.  * OID: .1.3.6.1.3.101.1.1.2.1.1
  419.  * Description:
  420. The object used to change any given user's Authentication Key
  421.     using a Diffie-Hellman key exchange.
  422.     The right-most n bits of the shared secret 'sk', where 'n' is the
  423.     number of bits required for the protocol defined by
  424.     usmUserAuthProtocol, are installed as the operational
  425.     authentication key for this row after a successful SET.
  426.  *
  427.  * Attributes:
  428.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  429.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  430.  *   settable   1
  431.  *
  432.  *
  433.  * Its syntax is DHKeyChange (based on perltype OCTETSTR)
  434.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  435.  * This data type requires a length.  (Max 32)
  436.  */
  437. /**
  438.  * Check that the proposed new value is potentially valid.
  439.  *
  440.  * @param rowreq_ctx
  441.  *        Pointer to the row request context.
  442.  * @param usmDHUserAuthKeyChange_val_ptr
  443.  *        A char containing the new value.
  444.  * @param usmDHUserAuthKeyChange_val_ptr_len
  445.  *        The size (in bytes) of the data pointed to by usmDHUserAuthKeyChange_val_ptr
  446.  *
  447.  * @retval MFD_SUCCESS        : incoming value is legal
  448.  * @retval MFD_NOT_VALID_NOW  : incoming value is not valid now
  449.  * @retval MFD_NOT_VALID_EVER : incoming value is never valid
  450.  *
  451.  * This is the place to check for requirements that are not
  452.  * expressed in the mib syntax (for example, a requirement that
  453.  * is detailed in the description for an object).
  454.  *
  455.  * You should check that the requested change between the undo value and the
  456.  * new value is legal (ie, the transistion from one value to another
  457.  * is legal).
  458.  *      
  459.  *@note
  460.  * This check is only to determine if the new value
  461.  * is b potentially valid. This is the first check of many, and
  462.  * is one of the simplest ones.
  463.  * 
  464.  *@note
  465.  * this is not the place to do any checks for values
  466.  * which depend on some other value in the mib. Those
  467.  * types of checks should be done in the
  468.  * usmDHUserKeyTable_check_dependencies() function.
  469.  *
  470.  * The following checks have already been done for you:
  471.  *    The syntax is ASN_OCTET_STR
  472.  *
  473.  * If there a no other checks you need to do, simply return MFD_SUCCESS.
  474.  *
  475.  */
  476. int
  477. usmDHUserAuthKeyChange_check_value(usmDHUserKeyTable_rowreq_ctx *
  478.                                    rowreq_ctx,
  479.                                    char *usmDHUserAuthKeyChange_val_ptr,
  480.                                    size_t
  481.                                    usmDHUserAuthKeyChange_val_ptr_len)
  482. {
  483.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserAuthKeyChange_check_value", "calledn"));
  484.     /** should never get a NULL pointer */
  485.     netsnmp_assert(NULL != rowreq_ctx);
  486.     netsnmp_assert(NULL != usmDHUserAuthKeyChange_val_ptr);
  487.     /*
  488.      * TODO:441:o: |-> Check for valid usmDHUserAuthKeyChange value.
  489.      */
  490.     return usmDHUserCheckValue(rowreq_ctx->data, 1,
  491.                                usmDHUserAuthKeyChange_val_ptr,
  492.                                usmDHUserAuthKeyChange_val_ptr_len);
  493. }                               /* usmDHUserAuthKeyChange_check_value */
  494. /**
  495.  * Save old value information
  496.  *
  497.  * @param rowreq_ctx
  498.  *        Pointer to the table context (usmDHUserKeyTable_rowreq_ctx)
  499.  *
  500.  * @retval MFD_SUCCESS : success
  501.  * @retval MFD_ERROR   : error. set will fail.
  502.  *
  503.  * This function will be called after the table level undo setup function
  504.  * usmDHUserKeyTable_undo_setup has been called.
  505.  *
  506.  *@note
  507.  * this function will only be called if a new value is set for this column.
  508.  *
  509.  * If there is any setup specific to a particular column (e.g. allocating
  510.  * memory for a string), you should do that setup in this function, so it
  511.  * won't be done unless it is necessary.
  512.  */
  513. int
  514. usmDHUserAuthKeyChange_undo_setup(usmDHUserKeyTable_rowreq_ctx *
  515.                                   rowreq_ctx)
  516. {
  517.     struct usmUser *undouser;
  518.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserAuthKeyChange_undo_setup", "calledn"));
  519.     /** should never get a NULL pointer */
  520.     netsnmp_assert(NULL != rowreq_ctx);
  521.     /*
  522.      * TODO:455:o: |-> Setup usmDHUserAuthKeyChange undo.
  523.      */
  524.     /*
  525.      * copy usmDHUserAuthKeyChange and usmDHUserAuthKeyChange_len data
  526.      * set rowreq_ctx->undo->usmDHUserAuthKeyChange from rowreq_ctx->data->usmDHUserAuthKeyChange
  527.      */
  528.     undouser = rowreq_ctx->undo;
  529.     undouser->authKeyLen = rowreq_ctx->data->authKeyLen;
  530.     memdup(&undouser->authKey, rowreq_ctx->data->authKey,
  531.            rowreq_ctx->data->authKeyLen);
  532.     return MFD_SUCCESS;
  533. }                               /* usmDHUserAuthKeyChange_undo_setup */
  534. /**
  535.  * Set the new value.
  536.  *
  537.  * @param rowreq_ctx
  538.  *        Pointer to the users context. You should know how to
  539.  *        manipulate the value from this object.
  540.  * @param usmDHUserAuthKeyChange_val_ptr
  541.  *        A char containing the new value.
  542.  * @param usmDHUserAuthKeyChange_val_ptr_len
  543.  *        The size (in bytes) of the data pointed to by usmDHUserAuthKeyChange_val_ptr
  544.  */
  545. int
  546. usmDHUserAuthKeyChange_set(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx,
  547.                            char *usmDHUserAuthKeyChange_val_ptr,
  548.                            size_t usmDHUserAuthKeyChange_val_ptr_len)
  549. {
  550.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserAuthKeyChange_set",
  551.                 "calledn"));
  552.     /** should never get a NULL pointer */
  553.     netsnmp_assert(NULL != rowreq_ctx);
  554.     netsnmp_assert(NULL != usmDHUserAuthKeyChange_val_ptr);
  555.     /*
  556.      * TODO:461:M: |-> Set usmDHUserAuthKeyChange value.
  557.      * set usmDHUserAuthKeyChange value in rowreq_ctx->data
  558.      */
  559.     usmDHSetKey(rowreq_ctx->data, 1,
  560.                 usmDHUserAuthKeyChange_val_ptr,
  561.                 usmDHUserAuthKeyChange_val_ptr_len);
  562.     return MFD_SUCCESS;
  563. }                               /* usmDHUserAuthKeyChange_set */
  564. /**
  565.  * undo the previous set.
  566.  *
  567.  * @param rowreq_ctx
  568.  *        Pointer to the users context.
  569.  */
  570. int
  571. usmDHUserAuthKeyChange_undo(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx)
  572. {
  573.     struct usmUser *undouser;
  574.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserAuthKeyChange_undo",
  575.                 "calledn"));
  576.     netsnmp_assert(NULL != rowreq_ctx);
  577.     /*
  578.      * TODO:456:o: |-> Clean up usmDHUserAuthKeyChange undo.
  579.      */
  580.     /*
  581.      * copy usmDHUserAuthKeyChange and usmDHUserAuthKeyChange_len data
  582.      * set rowreq_ctx->data->usmDHUserAuthKeyChange from rowreq_ctx->undo->usmDHUserAuthKeyChange
  583.      */
  584.     undouser = rowreq_ctx->undo;
  585.     undouser->authKeyLen = rowreq_ctx->data->authKeyLen;
  586.     SNMP_FREE(rowreq_ctx->data->authKey);
  587.     rowreq_ctx->data->authKey = undouser->authKey;
  588.     undouser->authKey = NULL;
  589.     return MFD_SUCCESS;
  590. }                               /* usmDHUserAuthKeyChange_undo */
  591. /*---------------------------------------------------------------------
  592.  * SNMP-USM-DH-OBJECTS-MIB::usmDHUserKeyEntry.usmDHUserOwnAuthKeyChange
  593.  * usmDHUserOwnAuthKeyChange is subid 2 of usmDHUserKeyEntry.
  594.  * Its status is Current, and its access level is Create.
  595.  * OID: .1.3.6.1.3.101.1.1.2.1.2
  596.  * Description:
  597. The object used to change the agents own Authentication Key
  598.     using a Diffie-Hellman key exchange.
  599.     The right-most n bits of the shared secret 'sk', where 'n' is the
  600.     number of bits required for the protocol defined by
  601.     usmUserAuthProtocol, are installed as the operational
  602.     authentication key for this row after a successful SET.
  603.  *
  604.  * Attributes:
  605.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  606.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  607.  *   settable   1
  608.  *
  609.  *
  610.  * Its syntax is DHKeyChange (based on perltype OCTETSTR)
  611.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  612.  * This data type requires a length.  (Max 32)
  613.  */
  614. /**
  615.  * Check that the proposed new value is potentially valid.
  616.  *
  617.  * @param rowreq_ctx
  618.  *        Pointer to the row request context.
  619.  * @param usmDHUserOwnAuthKeyChange_val_ptr
  620.  *        A char containing the new value.
  621.  * @param usmDHUserOwnAuthKeyChange_val_ptr_len
  622.  *        The size (in bytes) of the data pointed to by usmDHUserOwnAuthKeyChange_val_ptr
  623.  *
  624.  * @retval MFD_SUCCESS        : incoming value is legal
  625.  * @retval MFD_NOT_VALID_NOW  : incoming value is not valid now
  626.  * @retval MFD_NOT_VALID_EVER : incoming value is never valid
  627.  *
  628.  * This is the place to check for requirements that are not
  629.  * expressed in the mib syntax (for example, a requirement that
  630.  * is detailed in the description for an object).
  631.  *
  632.  * You should check that the requested change between the undo value and the
  633.  * new value is legal (ie, the transistion from one value to another
  634.  * is legal).
  635.  *      
  636.  *@note
  637.  * This check is only to determine if the new value
  638.  * is b potentially valid. This is the first check of many, and
  639.  * is one of the simplest ones.
  640.  * 
  641.  *@note
  642.  * this is not the place to do any checks for values
  643.  * which depend on some other value in the mib. Those
  644.  * types of checks should be done in the
  645.  * usmDHUserKeyTable_check_dependencies() function.
  646.  *
  647.  * The following checks have already been done for you:
  648.  *    The syntax is ASN_OCTET_STR
  649.  *
  650.  * If there a no other checks you need to do, simply return MFD_SUCCESS.
  651.  *
  652.  */
  653. int
  654. usmDHUserOwnAuthKeyChange_check_value(usmDHUserKeyTable_rowreq_ctx *
  655.                                       rowreq_ctx, char
  656.                                       *usmDHUserOwnAuthKeyChange_val_ptr, size_t
  657.                                       usmDHUserOwnAuthKeyChange_val_ptr_len)
  658. {
  659.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserOwnAuthKeyChange_check_value", "calledn"));
  660.     /** should never get a NULL pointer */
  661.     netsnmp_assert(NULL != rowreq_ctx);
  662.     netsnmp_assert(NULL != usmDHUserOwnAuthKeyChange_val_ptr);
  663.     /*
  664.      * TODO:441:o: |-> Check for valid usmDHUserOwnAuthKeyChange value.
  665.      */
  666.     return
  667.         usmDHUserAuthKeyChange_check_value(rowreq_ctx,
  668.                                            usmDHUserOwnAuthKeyChange_val_ptr,
  669.                                            usmDHUserOwnAuthKeyChange_val_ptr_len);
  670. }                               /* usmDHUserOwnAuthKeyChange_check_value */
  671. /**
  672.  * Save old value information
  673.  *
  674.  * @param rowreq_ctx
  675.  *        Pointer to the table context (usmDHUserKeyTable_rowreq_ctx)
  676.  *
  677.  * @retval MFD_SUCCESS : success
  678.  * @retval MFD_ERROR   : error. set will fail.
  679.  *
  680.  * This function will be called after the table level undo setup function
  681.  * usmDHUserKeyTable_undo_setup has been called.
  682.  *
  683.  *@note
  684.  * this function will only be called if a new value is set for this column.
  685.  *
  686.  * If there is any setup specific to a particular column (e.g. allocating
  687.  * memory for a string), you should do that setup in this function, so it
  688.  * won't be done unless it is necessary.
  689.  */
  690. int
  691. usmDHUserOwnAuthKeyChange_undo_setup(usmDHUserKeyTable_rowreq_ctx *
  692.                                      rowreq_ctx)
  693. {
  694.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserOwnAuthKeyChange_undo_setup", "calledn"));
  695.     /** should never get a NULL pointer */
  696.     netsnmp_assert(NULL != rowreq_ctx);
  697.     /*
  698.      * TODO:455:o: |-> Setup usmDHUserOwnAuthKeyChange undo.
  699.      */
  700.     /*
  701.      * copy usmDHUserOwnAuthKeyChange and usmDHUserOwnAuthKeyChange_len data
  702.      * set rowreq_ctx->undo->usmDHUserOwnAuthKeyChange from rowreq_ctx->data->usmDHUserOwnAuthKeyChange
  703.      */
  704.     return usmDHUserAuthKeyChange_undo_setup(rowreq_ctx);
  705. }                               /* usmDHUserOwnAuthKeyChange_undo_setup */
  706. /**
  707.  * Set the new value.
  708.  *
  709.  * @param rowreq_ctx
  710.  *        Pointer to the users context. You should know how to
  711.  *        manipulate the value from this object.
  712.  * @param usmDHUserOwnAuthKeyChange_val_ptr
  713.  *        A char containing the new value.
  714.  * @param usmDHUserOwnAuthKeyChange_val_ptr_len
  715.  *        The size (in bytes) of the data pointed to by usmDHUserOwnAuthKeyChange_val_ptr
  716.  */
  717. int
  718. usmDHUserOwnAuthKeyChange_set(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx,
  719.                               char *usmDHUserOwnAuthKeyChange_val_ptr,
  720.                               size_t usmDHUserOwnAuthKeyChange_val_ptr_len)
  721. {
  722.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserOwnAuthKeyChange_set",
  723.                 "calledn"));
  724.     /** should never get a NULL pointer */
  725.     netsnmp_assert(NULL != rowreq_ctx);
  726.     netsnmp_assert(NULL != usmDHUserOwnAuthKeyChange_val_ptr);
  727.     /*
  728.      * TODO:461:M: |-> Set usmDHUserOwnAuthKeyChange value.
  729.      * set usmDHUserOwnAuthKeyChange value in rowreq_ctx->data
  730.      */
  731.     return usmDHUserAuthKeyChange_set(rowreq_ctx,
  732.                                       usmDHUserOwnAuthKeyChange_val_ptr,
  733.                                       usmDHUserOwnAuthKeyChange_val_ptr_len);
  734. }                               /* usmDHUserOwnAuthKeyChange_set */
  735. /**
  736.  * undo the previous set.
  737.  *
  738.  * @param rowreq_ctx
  739.  *        Pointer to the users context.
  740.  */
  741. int
  742. usmDHUserOwnAuthKeyChange_undo(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx)
  743. {
  744.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserOwnAuthKeyChange_undo",
  745.                 "calledn"));
  746.     netsnmp_assert(NULL != rowreq_ctx);
  747.     /*
  748.      * TODO:456:o: |-> Clean up usmDHUserOwnAuthKeyChange undo.
  749.      */
  750.     /*
  751.      * copy usmDHUserOwnAuthKeyChange and usmDHUserOwnAuthKeyChange_len data
  752.      * set rowreq_ctx->data->usmDHUserOwnAuthKeyChange from rowreq_ctx->undo->usmDHUserOwnAuthKeyChange
  753.      */
  754.     return usmDHUserAuthKeyChange_undo(rowreq_ctx);
  755. }                               /* usmDHUserOwnAuthKeyChange_undo */
  756. /*---------------------------------------------------------------------
  757.  * SNMP-USM-DH-OBJECTS-MIB::usmDHUserKeyEntry.usmDHUserPrivKeyChange
  758.  * usmDHUserPrivKeyChange is subid 3 of usmDHUserKeyEntry.
  759.  * Its status is Current, and its access level is Create.
  760.  * OID: .1.3.6.1.3.101.1.1.2.1.3
  761.  * Description:
  762. The object used to change any given user's Privacy Key using
  763.     a Diffie-Hellman key exchange.
  764.     The right-most n bits of the shared secret 'sk', where 'n' is the
  765.     number of bits required for the protocol defined by
  766.     usmUserPrivProtocol, are installed as the operational privacy key
  767.     for this row after a successful SET.
  768.  *
  769.  * Attributes:
  770.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  771.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  772.  *   settable   1
  773.  *
  774.  *
  775.  * Its syntax is DHKeyChange (based on perltype OCTETSTR)
  776.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  777.  * This data type requires a length.  (Max 32)
  778.  */
  779. /**
  780.  * Check that the proposed new value is potentially valid.
  781.  *
  782.  * @param rowreq_ctx
  783.  *        Pointer to the row request context.
  784.  * @param usmDHUserPrivKeyChange_val_ptr
  785.  *        A char containing the new value.
  786.  * @param usmDHUserPrivKeyChange_val_ptr_len
  787.  *        The size (in bytes) of the data pointed to by usmDHUserPrivKeyChange_val_ptr
  788.  *
  789.  * @retval MFD_SUCCESS        : incoming value is legal
  790.  * @retval MFD_NOT_VALID_NOW  : incoming value is not valid now
  791.  * @retval MFD_NOT_VALID_EVER : incoming value is never valid
  792.  *
  793.  * This is the place to check for requirements that are not
  794.  * expressed in the mib syntax (for example, a requirement that
  795.  * is detailed in the description for an object).
  796.  *
  797.  * You should check that the requested change between the undo value and the
  798.  * new value is legal (ie, the transistion from one value to another
  799.  * is legal).
  800.  *      
  801.  *@note
  802.  * This check is only to determine if the new value
  803.  * is b potentially valid. This is the first check of many, and
  804.  * is one of the simplest ones.
  805.  * 
  806.  *@note
  807.  * this is not the place to do any checks for values
  808.  * which depend on some other value in the mib. Those
  809.  * types of checks should be done in the
  810.  * usmDHUserKeyTable_check_dependencies() function.
  811.  *
  812.  * The following checks have already been done for you:
  813.  *    The syntax is ASN_OCTET_STR
  814.  *
  815.  * If there a no other checks you need to do, simply return MFD_SUCCESS.
  816.  *
  817.  */
  818. int
  819. usmDHUserPrivKeyChange_check_value(usmDHUserKeyTable_rowreq_ctx *
  820.                                    rowreq_ctx,
  821.                                    char *usmDHUserPrivKeyChange_val_ptr,
  822.                                    size_t
  823.                                    usmDHUserPrivKeyChange_val_ptr_len)
  824. {
  825.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserPrivKeyChange_check_value", "calledn"));
  826.     /** should never get a NULL pointer */
  827.     netsnmp_assert(NULL != rowreq_ctx);
  828.     netsnmp_assert(NULL != usmDHUserPrivKeyChange_val_ptr);
  829.     /*
  830.      * TODO:441:o: |-> Check for valid usmDHUserPrivKeyChange value.
  831.      */
  832.     return usmDHUserCheckValue(rowreq_ctx->data, 0,
  833.                                usmDHUserPrivKeyChange_val_ptr,
  834.                                usmDHUserPrivKeyChange_val_ptr_len);
  835. }                               /* usmDHUserPrivKeyChange_check_value */
  836. /**
  837.  * Save old value information
  838.  *
  839.  * @param rowreq_ctx
  840.  *        Pointer to the table context (usmDHUserKeyTable_rowreq_ctx)
  841.  *
  842.  * @retval MFD_SUCCESS : success
  843.  * @retval MFD_ERROR   : error. set will fail.
  844.  *
  845.  * This function will be called after the table level undo setup function
  846.  * usmDHUserKeyTable_undo_setup has been called.
  847.  *
  848.  *@note
  849.  * this function will only be called if a new value is set for this column.
  850.  *
  851.  * If there is any setup specific to a particular column (e.g. allocating
  852.  * memory for a string), you should do that setup in this function, so it
  853.  * won't be done unless it is necessary.
  854.  */
  855. int
  856. usmDHUserPrivKeyChange_undo_setup(usmDHUserKeyTable_rowreq_ctx *
  857.                                   rowreq_ctx)
  858. {
  859.     struct usmUser *undouser;
  860.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserPrivKeyChange_undo_setup", "calledn"));
  861.     /** should never get a NULL pointer */
  862.     netsnmp_assert(NULL != rowreq_ctx);
  863.     /*
  864.      * TODO:455:o: |-> Setup usmDHUserPrivKeyChange undo.
  865.      */
  866.     /*
  867.      * copy usmDHUserPrivKeyChange and usmDHUserPrivKeyChange_len data
  868.      * set rowreq_ctx->undo->usmDHUserPrivKeyChange from rowreq_ctx->data->usmDHUserPrivKeyChange
  869.      */
  870.     undouser = rowreq_ctx->undo;
  871.     undouser->privKeyLen = rowreq_ctx->data->privKeyLen;
  872.     memdup(&undouser->privKey, rowreq_ctx->data->privKey,
  873.            rowreq_ctx->data->privKeyLen);
  874.     return MFD_SUCCESS;
  875. }                               /* usmDHUserPrivKeyChange_undo_setup */
  876. /**
  877.  * Set the new value.
  878.  *
  879.  * @param rowreq_ctx
  880.  *        Pointer to the users context. You should know how to
  881.  *        manipulate the value from this object.
  882.  * @param usmDHUserPrivKeyChange_val_ptr
  883.  *        A char containing the new value.
  884.  * @param usmDHUserPrivKeyChange_val_ptr_len
  885.  *        The size (in bytes) of the data pointed to by usmDHUserPrivKeyChange_val_ptr
  886.  */
  887. int
  888. usmDHUserPrivKeyChange_set(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx,
  889.                            char *usmDHUserPrivKeyChange_val_ptr,
  890.                            size_t usmDHUserPrivKeyChange_val_ptr_len)
  891. {
  892.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserPrivKeyChange_set",
  893.                 "calledn"));
  894.     /** should never get a NULL pointer */
  895.     netsnmp_assert(NULL != rowreq_ctx);
  896.     netsnmp_assert(NULL != usmDHUserPrivKeyChange_val_ptr);
  897.     /*
  898.      * TODO:461:M: |-> Set usmDHUserPrivKeyChange value.
  899.      * set usmDHUserPrivKeyChange value in rowreq_ctx->data
  900.      */
  901.     usmDHSetKey(rowreq_ctx->data, 0,
  902.                 usmDHUserPrivKeyChange_val_ptr,
  903.                 usmDHUserPrivKeyChange_val_ptr_len);
  904.     return MFD_SUCCESS;
  905. }                               /* usmDHUserPrivKeyChange_set */
  906. /**
  907.  * undo the previous set.
  908.  *
  909.  * @param rowreq_ctx
  910.  *        Pointer to the users context.
  911.  */
  912. int
  913. usmDHUserPrivKeyChange_undo(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx)
  914. {
  915.     struct usmUser *undouser;
  916.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserPrivKeyChange_undo",
  917.                 "calledn"));
  918.     netsnmp_assert(NULL != rowreq_ctx);
  919.     /*
  920.      * TODO:456:o: |-> Clean up usmDHUserPrivKeyChange undo.
  921.      */
  922.     /*
  923.      * copy usmDHUserPrivKeyChange and usmDHUserPrivKeyChange_len data
  924.      * set rowreq_ctx->data->usmDHUserPrivKeyChange from rowreq_ctx->undo->usmDHUserPrivKeyChange
  925.      */
  926.     undouser = rowreq_ctx->undo;
  927.     /** uncopy priv key */
  928.     undouser->privKeyLen = rowreq_ctx->data->privKeyLen;
  929.     SNMP_FREE(rowreq_ctx->data->privKey);
  930.     rowreq_ctx->data->privKey = undouser->privKey;
  931.     undouser->privKey = NULL;
  932.     return MFD_SUCCESS;
  933. }                               /* usmDHUserPrivKeyChange_undo */
  934. /*---------------------------------------------------------------------
  935.  * SNMP-USM-DH-OBJECTS-MIB::usmDHUserKeyEntry.usmDHUserOwnPrivKeyChange
  936.  * usmDHUserOwnPrivKeyChange is subid 4 of usmDHUserKeyEntry.
  937.  * Its status is Current, and its access level is Create.
  938.  * OID: .1.3.6.1.3.101.1.1.2.1.4
  939.  * Description:
  940. The object used to change the agent's own Privacy Key using a
  941.     Diffie-Hellman key exchange.
  942.     The right-most n bits of the shared secret 'sk', where 'n' is the
  943.     number of bits required for the protocol defined by
  944.     usmUserPrivProtocol, are installed as the operational privacy key
  945.     for this row after a successful SET.
  946.  *
  947.  * Attributes:
  948.  *   accessible 1     isscalar 0     enums  0      hasdefval 0
  949.  *   readable   1     iscolumn 1     ranges 0      hashint   0
  950.  *   settable   1
  951.  *
  952.  *
  953.  * Its syntax is DHKeyChange (based on perltype OCTETSTR)
  954.  * The net-snmp type is ASN_OCTET_STR. The C type decl is char (char)
  955.  * This data type requires a length.  (Max 32)
  956.  */
  957. /**
  958.  * Check that the proposed new value is potentially valid.
  959.  *
  960.  * @param rowreq_ctx
  961.  *        Pointer to the row request context.
  962.  * @param usmDHUserOwnPrivKeyChange_val_ptr
  963.  *        A char containing the new value.
  964.  * @param usmDHUserOwnPrivKeyChange_val_ptr_len
  965.  *        The size (in bytes) of the data pointed to by usmDHUserOwnPrivKeyChange_val_ptr
  966.  *
  967.  * @retval MFD_SUCCESS        : incoming value is legal
  968.  * @retval MFD_NOT_VALID_NOW  : incoming value is not valid now
  969.  * @retval MFD_NOT_VALID_EVER : incoming value is never valid
  970.  *
  971.  * This is the place to check for requirements that are not
  972.  * expressed in the mib syntax (for example, a requirement that
  973.  * is detailed in the description for an object).
  974.  *
  975.  * You should check that the requested change between the undo value and the
  976.  * new value is legal (ie, the transistion from one value to another
  977.  * is legal).
  978.  *      
  979.  *@note
  980.  * This check is only to determine if the new value
  981.  * is b potentially valid. This is the first check of many, and
  982.  * is one of the simplest ones.
  983.  * 
  984.  *@note
  985.  * this is not the place to do any checks for values
  986.  * which depend on some other value in the mib. Those
  987.  * types of checks should be done in the
  988.  * usmDHUserKeyTable_check_dependencies() function.
  989.  *
  990.  * The following checks have already been done for you:
  991.  *    The syntax is ASN_OCTET_STR
  992.  *
  993.  * If there a no other checks you need to do, simply return MFD_SUCCESS.
  994.  *
  995.  */
  996. int
  997. usmDHUserOwnPrivKeyChange_check_value(usmDHUserKeyTable_rowreq_ctx *
  998.                                       rowreq_ctx, char
  999.                                       *usmDHUserOwnPrivKeyChange_val_ptr, size_t
  1000.                                       usmDHUserOwnPrivKeyChange_val_ptr_len)
  1001. {
  1002.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserOwnPrivKeyChange_check_value", "calledn"));
  1003.     /** should never get a NULL pointer */
  1004.     netsnmp_assert(NULL != rowreq_ctx);
  1005.     netsnmp_assert(NULL != usmDHUserOwnPrivKeyChange_val_ptr);
  1006.     /*
  1007.      * TODO:441:o: |-> Check for valid usmDHUserOwnPrivKeyChange value.
  1008.      */
  1009.     return
  1010.         usmDHUserPrivKeyChange_check_value(rowreq_ctx,
  1011.                                            usmDHUserOwnPrivKeyChange_val_ptr,
  1012.                                            usmDHUserOwnPrivKeyChange_val_ptr_len);
  1013. }                               /* usmDHUserOwnPrivKeyChange_check_value */
  1014. /**
  1015.  * Save old value information
  1016.  *
  1017.  * @param rowreq_ctx
  1018.  *        Pointer to the table context (usmDHUserKeyTable_rowreq_ctx)
  1019.  *
  1020.  * @retval MFD_SUCCESS : success
  1021.  * @retval MFD_ERROR   : error. set will fail.
  1022.  *
  1023.  * This function will be called after the table level undo setup function
  1024.  * usmDHUserKeyTable_undo_setup has been called.
  1025.  *
  1026.  *@note
  1027.  * this function will only be called if a new value is set for this column.
  1028.  *
  1029.  * If there is any setup specific to a particular column (e.g. allocating
  1030.  * memory for a string), you should do that setup in this function, so it
  1031.  * won't be done unless it is necessary.
  1032.  */
  1033. int
  1034. usmDHUserOwnPrivKeyChange_undo_setup(usmDHUserKeyTable_rowreq_ctx *
  1035.                                      rowreq_ctx)
  1036. {
  1037.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserOwnPrivKeyChange_undo_setup", "calledn"));
  1038.     /** should never get a NULL pointer */
  1039.     netsnmp_assert(NULL != rowreq_ctx);
  1040.     /*
  1041.      * TODO:455:o: |-> Setup usmDHUserOwnPrivKeyChange undo.
  1042.      */
  1043.     /*
  1044.      * copy usmDHUserOwnPrivKeyChange and usmDHUserOwnPrivKeyChange_len data
  1045.      * set rowreq_ctx->undo->usmDHUserOwnPrivKeyChange from rowreq_ctx->data->usmDHUserOwnPrivKeyChange
  1046.      */
  1047.     return usmDHUserPrivKeyChange_undo_setup(rowreq_ctx);
  1048. }                               /* usmDHUserOwnPrivKeyChange_undo_setup */
  1049. /**
  1050.  * Set the new value.
  1051.  *
  1052.  * @param rowreq_ctx
  1053.  *        Pointer to the users context. You should know how to
  1054.  *        manipulate the value from this object.
  1055.  * @param usmDHUserOwnPrivKeyChange_val_ptr
  1056.  *        A char containing the new value.
  1057.  * @param usmDHUserOwnPrivKeyChange_val_ptr_len
  1058.  *        The size (in bytes) of the data pointed to by usmDHUserOwnPrivKeyChange_val_ptr
  1059.  */
  1060. int
  1061. usmDHUserOwnPrivKeyChange_set(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx,
  1062.                               char *usmDHUserOwnPrivKeyChange_val_ptr,
  1063.                               size_t usmDHUserOwnPrivKeyChange_val_ptr_len)
  1064. {
  1065.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserOwnPrivKeyChange_set",
  1066.                 "calledn"));
  1067.     /** should never get a NULL pointer */
  1068.     netsnmp_assert(NULL != rowreq_ctx);
  1069.     netsnmp_assert(NULL != usmDHUserOwnPrivKeyChange_val_ptr);
  1070.     /*
  1071.      * TODO:461:M: |-> Set usmDHUserOwnPrivKeyChange value.
  1072.      * set usmDHUserOwnPrivKeyChange value in rowreq_ctx->data
  1073.      */
  1074.     return usmDHUserPrivKeyChange_set(rowreq_ctx,
  1075.                                       usmDHUserOwnPrivKeyChange_val_ptr,
  1076.                                       usmDHUserOwnPrivKeyChange_val_ptr_len);
  1077. }                               /* usmDHUserOwnPrivKeyChange_set */
  1078. /**
  1079.  * undo the previous set.
  1080.  *
  1081.  * @param rowreq_ctx
  1082.  *        Pointer to the users context.
  1083.  */
  1084. int
  1085. usmDHUserOwnPrivKeyChange_undo(usmDHUserKeyTable_rowreq_ctx * rowreq_ctx)
  1086. {
  1087.     DEBUGMSGTL(("verbose:usmDHUserKeyTable:usmDHUserOwnPrivKeyChange_undo",
  1088.                 "calledn"));
  1089.     netsnmp_assert(NULL != rowreq_ctx);
  1090.     /*
  1091.      * TODO:456:o: |-> Clean up usmDHUserOwnPrivKeyChange undo.
  1092.      */
  1093.     /*
  1094.      * copy usmDHUserOwnPrivKeyChange and usmDHUserOwnPrivKeyChange_len data
  1095.      * set rowreq_ctx->data->usmDHUserOwnPrivKeyChange from rowreq_ctx->undo->usmDHUserOwnPrivKeyChange
  1096.      */
  1097.     return usmDHUserPrivKeyChange_undo(rowreq_ctx);
  1098. }                               /* usmDHUserOwnPrivKeyChange_undo */
  1099. /**
  1100.  * check dependencies
  1101.  *
  1102.  * This is useful for for tables which have dependencies between columns
  1103.  * (or rows, or tables). For example, two columns allocating a percentage
  1104.  * of something add up 100%.
  1105.  *
  1106.  * Should you need different behavior depending on which columns were
  1107.  * set, rowreq_ctx->column_set_flags will indicate which writeable columns were
  1108.  * set. The definitions for the FLAG_* bits can be found in
  1109.  * usmDHUserKeyTable_oids.h.
  1110.  * A new row will have the MFD_ROW_CREATED bit set in rowreq_flags.
  1111.  *
  1112.  * @retval MFD_SUCCESS all the changes to the row are legal
  1113.  * @retval MFD_ERROR   one or more changes are not legal
  1114.  *
  1115.  * (see README-table-usmDHUserKeyTable if you don't have dependencies)
  1116.  */
  1117. int
  1118. usmDHUserKeyTable_check_dependencies(usmDHUserKeyTable_rowreq_ctx *
  1119.                                      rowreq_ctx)
  1120. {
  1121.     int             rc = MFD_SUCCESS;
  1122.     int             flags;
  1123.     DEBUGMSGTL(("internal:usmDHUserKeyTable:usmDHUserKeyTable_check_dependencies", "calledn"));
  1124.     netsnmp_assert(NULL != rowreq_ctx);
  1125.     /*
  1126.      * TODO:470:o: Check usmDHUserKeyTable row dependencies.
  1127.      * check that all new value are legal and consistent with each other
  1128.      */
  1129.     flags = rowreq_ctx->column_set_flags;
  1130.     if (flags & FLAG_USMDHUSERAUTHKEYCHANGE &&
  1131.         flags & FLAG_USMDHUSEROWNAUTHKEYCHANGE) {
  1132.         return MFD_ERROR;
  1133.     }
  1134.     if (flags & FLAG_USMDHUSERPRIVKEYCHANGE &&
  1135.         flags & FLAG_USMDHUSEROWNPRIVKEYCHANGE) {
  1136.         return MFD_ERROR;
  1137.     }
  1138.     return rc;
  1139. }                               /* usmDHUserKeyTable_check_dependencies */
  1140. /** @} */