updated the 3.0 branch from the head branch - ready for alpha18
[sfrench/samba-autobuild/.git] / source3 / nmbd / nmbd_responserecordsdb.c
index 6dae0d43e9270e41883aa8309bd8e23ddf5f94e9..7e8c8025aeb4e865fc37f2fb34aee1155044dc1d 100644 (file)
@@ -1,6 +1,5 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 1.9.
+   Unix SMB/CIFS implementation.
    NBT netbios library routines
    Copyright (C) Andrew Tridgell 1994-1998
    Copyright (C) Luke Kenneth Casson Leighton 1994-1998
 
 extern int ClientNMB;
 
-extern int DEBUGLEVEL;
-
-extern pstring scope;
-extern struct in_addr ipzero;
-
 int num_response_packets = 0;
 
 /***************************************************************************
   Add an expected response record into the list
   **************************************************************************/
 
-void add_response_record(struct subnet_record *subrec,
+static void add_response_record(struct subnet_record *subrec,
                                struct response_record *rrec)
 {
   struct response_record *rrec2;
@@ -80,17 +74,20 @@ void remove_response_record(struct subnet_record *subrec,
 
   if(rrec->userdata)
   {
-    if(rrec->userdata->free_fn)
-      (*rrec->userdata->free_fn)(rrec->userdata);
-    else
-      free((char *)rrec->userdata);
+         if(rrec->userdata->free_fn) {
+                 (*rrec->userdata->free_fn)(rrec->userdata);
+         } else {
+                 ZERO_STRUCTP(rrec->userdata);
+                 SAFE_FREE(rrec->userdata);
+         }
   }
 
   /* Ensure we can delete. */
   rrec->packet->locked = False;
   free_packet(rrec->packet);
 
-  free((char *)rrec);
+  ZERO_STRUCTP(rrec);
+  SAFE_FREE(rrec);
 
   num_response_packets--; /* count of total number of packets still around */
 }
@@ -100,12 +97,12 @@ void remove_response_record(struct subnet_record *subrec,
   **************************************************************************/
 
 struct response_record *make_response_record( struct subnet_record *subrec,
-                    struct packet_struct *p,
-                    response_function resp_fn,
-                    timeout_response_function timeout_fn,
-                    success_function success_fn,
-                    fail_function fail_fn,
-                    struct userdata_struct *userdata)
+                                             struct packet_struct *p,
+                                             response_function resp_fn,
+                                             timeout_response_function timeout_fn,
+                                             success_function success_fn,
+                                             fail_function fail_fn,
+                                             struct userdata_struct *userdata)
 {
   struct response_record *rrec;
   struct nmb_packet *nmb = &p->packet.nmb;
@@ -116,7 +113,7 @@ struct response_record *make_response_record( struct subnet_record *subrec,
     return NULL;
   }
 
-  bzero((char *)rrec, sizeof(*rrec));
+  memset((char *)rrec, '\0', sizeof(*rrec));
 
   rrec->response_id = nmb->header.name_trn_id;
 
@@ -135,7 +132,8 @@ struct response_record *make_response_record( struct subnet_record *subrec,
       if((rrec->userdata = (*userdata->copy_fn)(userdata)) == NULL)
       {
         DEBUG(0,("make_response_queue_record: copy fail for userdata.\n"));
-        free(rrec);
+       ZERO_STRUCTP(rrec);
+        SAFE_FREE(rrec);
         return NULL;
       }
     }
@@ -146,7 +144,8 @@ struct response_record *make_response_record( struct subnet_record *subrec,
            malloc(sizeof(struct userdata_struct)+userdata->userdata_len)) == NULL)
       {
         DEBUG(0,("make_response_queue_record: malloc fail for userdata.\n"));
-        free(rrec);
+       ZERO_STRUCTP(rrec);
+        SAFE_FREE(rrec);
         return NULL;
       }
       rrec->userdata->copy_fn = userdata->copy_fn;
@@ -167,6 +166,9 @@ struct response_record *make_response_record( struct subnet_record *subrec,
   rrec->repeat_count = 3; /* 3 retries */
   rrec->repeat_time = time(NULL) + rrec->repeat_interval; /* initial retry time */
 
+  /* This packet is not being processed. */
+  rrec->in_expiration_processing = False;
+
   /* Lock the packet so we won't lose it while it's on the list. */
   p->locked = True;