]> git.ipfire.org Git - thirdparty/dhcp.git/blobdiff - omapip/message.c
MASSIVE merge from V3-RELEASE-BRANCH into HEAD. HEAD and V3-RELEASE are
[thirdparty/dhcp.git] / omapip / message.c
index ffdae854fee39f2d4983194d4fb11f55c44d78d4..53fac626c684ec46ba46639d3da9ec3951c4e682 100644 (file)
@@ -3,39 +3,30 @@
    Subroutines for dealing with message objects. */
 
 /*
- * Copyright (c) 1999-2000 Internet Software Consortium.
- * All rights reserved.
+ * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 1999-2003 by Internet Software Consortium
  *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
  *
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- * 3. Neither the name of The Internet Software Consortium nor the names
- *    of its contributors may be used to endorse or promote products derived
- *    from this software without specific prior written permission.
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  *
- * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
- * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
- * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED.  IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
- * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
- * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
+ *   Internet Systems Consortium, Inc.
+ *   950 Charter Street
+ *   Redwood City, CA 94063
+ *   <info@isc.org>
+ *   http://www.isc.org/
  *
- * This software has been written for the Internet Software Consortium
+ * This software has been written for Internet Systems Consortium
  * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc.
- * To learn more about the Internet Software Consortium, see
+ * To learn more about Internet Systems Consortium, see
  * ``http://www.isc.org/''.  To learn more about Vixie Enterprises,
  * see ``http://www.vix.com''.   To learn more about Nominum, Inc., see
  * ``http://www.nominum.com''.
@@ -327,6 +318,7 @@ isc_result_t omapi_message_unregister (omapi_object_t *mo)
                omapi_object_reference ((omapi_object_t **)&n,
                                        (omapi_object_t *)m -> next, MDL);
                omapi_object_dereference ((omapi_object_t **)&m -> next, MDL);
+               omapi_object_dereference ((omapi_object_t **)&n -> prev, MDL);
        }
        if (m -> prev) {
                omapi_message_object_t *tmp = (omapi_message_object_t *)0;
@@ -660,7 +652,8 @@ omapi_message_process_internal (omapi_object_t *mo, omapi_object_t *po)
 
              case OMAPI_OP_UPDATE:
                if (m && m -> object) {
-                       omapi_object_reference (&object, m -> object, MDL);
+                       status = omapi_object_reference (&object, m -> object,
+                                                                       MDL);
                } else {
                        status = omapi_handle_lookup (&object, message -> h);
                        if (status != ISC_R_SUCCESS) {
@@ -707,10 +700,15 @@ omapi_message_process_internal (omapi_object_t *mo, omapi_object_t *po)
                        status = omapi_protocol_send_status
                                (po, message -> id_object, ISC_R_SUCCESS,
                                 message -> id, (char *)0);
-               if (m)
+               if (m) {
                        omapi_signal ((omapi_object_t *)m,
                                      "status", ISC_R_SUCCESS,
                                      (omapi_typed_data_t *)0);
+                       omapi_message_unregister ((omapi_object_t *)m);
+               }
+
+               omapi_object_dereference (&object, MDL);
+
                return status;
 
              case OMAPI_OP_NOTIFY:
@@ -740,6 +738,9 @@ omapi_message_process_internal (omapi_object_t *mo, omapi_object_t *po)
                omapi_signal ((omapi_object_t *)m, "status", waitstatus, tv);
                if (status == ISC_R_SUCCESS)
                        omapi_value_dereference (&tv, MDL);
+
+               omapi_message_unregister((omapi_object_t *)m);
+
                return ISC_R_SUCCESS;
 
              case OMAPI_OP_DELETE: