*** /root/ganglia-3.1.1/gmond/gmond.c	2009-02-23 05:19:05.000000000 +0000
--- gmond/gmond.c	2009-02-23 05:55:14.000000000 +0000
***************
*** 192,197 ****
--- 192,221 ----
  mmodule *metric_modules = NULL;
  extern int daemon_proc;		/* defined in error.c */
  
+ /* apr_socket_send can't assure all characters in buf been sent. */
+ apr_status_t
+ socket_send(apr_socket_t *sock, const char *buf,
+                                           apr_size_t *len)
+ {
+     apr_size_t total = *len;
+     apr_size_t thisTime = total;
+     const char* p = buf;
+     apr_status_t ret;
+     for(ret=apr_socket_send(sock, p, &thisTime); ret == APR_SUCCESS;
+             ret=apr_socket_send(sock, p, &thisTime)) {
+ 
+         if(thisTime < total) {
+             total -= thisTime;
+             p += thisTime;
+             thisTime = total;
+         }
+         else
+             break;
+     }
+     return ret;
+ }
+ 
+ 
  /* this is just a temporary function */
  void
  process_configuration_file(void)
***************
*** 1174,1186 ****
    static char *url = NULL;
    apr_time_t now = apr_time_now();
  
!   status = apr_socket_send( client, DTD, &len );
    if(status != APR_SUCCESS)
      return status;
  
    len = apr_snprintf( gangliaxml, 128, "<GANGLIA_XML VERSION=\"%s\" SOURCE=\"gmond\">\n",
                        VERSION);
!   status = apr_socket_send( client, gangliaxml, &len);
    if(status != APR_SUCCESS)
      return status;
  
--- 1198,1210 ----
    static char *url = NULL;
    apr_time_t now = apr_time_now();
  
!   status = socket_send( client, DTD, &len );
    if(status != APR_SUCCESS)
      return status;
  
    len = apr_snprintf( gangliaxml, 128, "<GANGLIA_XML VERSION=\"%s\" SOURCE=\"gmond\">\n",
                        VERSION);
!   status = socket_send( client, gangliaxml, &len);
    if(status != APR_SUCCESS)
      return status;
  
***************
*** 1212,1218 ****
                    latlong?latlong:"unspecified",
                    url?url:"unspecified");
  
!       return apr_socket_send( client, clusterxml, &len);
      }
  
    return APR_SUCCESS;
--- 1236,1242 ----
                    latlong?latlong:"unspecified",
                    url?url:"unspecified");
  
!       return socket_send( client, clusterxml, &len);
      }
  
    return APR_SUCCESS;
***************
*** 1226,1239 ****
    if(cluster_tag)
      {
        len = 11;
!       status = apr_socket_send(client, "</CLUSTER>\n", &len);
        if(status != APR_SUCCESS)
          {
            return status;
          }
      }
    len = 15;
!   return apr_socket_send( client, "</GANGLIA_XML>\n", &len);
  }
  
  static apr_status_t
--- 1250,1263 ----
    if(cluster_tag)
      {
        len = 11;
!       status = socket_send(client, "</CLUSTER>\n", &len);
        if(status != APR_SUCCESS)
          {
            return status;
          }
      }
    len = 15;
!   return socket_send( client, "</GANGLIA_XML>\n", &len);
  }
  
  static apr_status_t
***************
*** 1255,1261 ****
                       hostinfo->location? hostinfo->location: "unspecified", 
                       hostinfo->gmond_started);
  
!   return apr_socket_send(client, hostxml, &len);
  }
  
  /* NOT THREAD SAFE */
--- 1279,1285 ----
                       hostinfo->location? hostinfo->location: "unspecified", 
                       hostinfo->gmond_started);
  
!   return socket_send(client, hostxml, &len);
  }
  
  /* NOT THREAD SAFE */
***************
*** 1387,1419 ****
                data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.tmax,
                slope_to_cstr(data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.slope));
  
!   ret = apr_socket_send(client, metricxml, &len);
    if (ret == APR_SUCCESS) 
      {
        int extra_len = data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.metadata.metadata_len;
        len = apr_snprintf(metricxml, 1024, "<EXTRA_DATA>\n");
!       apr_socket_send(client, metricxml, &len);
        for (; extra_len > 0; extra_len--) 
          {
            len = apr_snprintf(metricxml, 1024, "<EXTRA_ELEMENT NAME=\"%s\" VAL=\"%s\"/>\n", 
                   data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.metadata.metadata_val[extra_len-1].name,
                   data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.metadata.metadata_val[extra_len-1].data);
!           apr_socket_send(client, metricxml, &len);
          }
          len = apr_snprintf(metricxml, 1024, "</EXTRA_DATA>\n");
!         apr_socket_send(client, metricxml, &len);
      }
    /* Send the closing tag */
    len = apr_snprintf(metricxml, 1024, "</METRIC>\n");
  
!   return apr_socket_send(client, metricxml, &len);
  }
  
  static apr_status_t
  print_host_end( apr_socket_t *client)
  {
    apr_size_t len = 8;
!   return apr_socket_send(client, "</HOST>\n", &len); 
  }
  
  static void
--- 1411,1443 ----
                data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.tmax,
                slope_to_cstr(data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.slope));
  
!   ret = socket_send(client, metricxml, &len);
    if (ret == APR_SUCCESS) 
      {
        int extra_len = data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.metadata.metadata_len;
        len = apr_snprintf(metricxml, 1024, "<EXTRA_DATA>\n");
!       socket_send(client, metricxml, &len);
        for (; extra_len > 0; extra_len--) 
          {
            len = apr_snprintf(metricxml, 1024, "<EXTRA_ELEMENT NAME=\"%s\" VAL=\"%s\"/>\n", 
                   data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.metadata.metadata_val[extra_len-1].name,
                   data->message_u.f_message.Ganglia_metadata_msg_u.gfull.metric.metadata.metadata_val[extra_len-1].data);
!           socket_send(client, metricxml, &len);
          }
          len = apr_snprintf(metricxml, 1024, "</EXTRA_DATA>\n");
!         socket_send(client, metricxml, &len);
      }
    /* Send the closing tag */
    len = apr_snprintf(metricxml, 1024, "</METRIC>\n");
  
!   return socket_send(client, metricxml, &len);
  }
  
  static apr_status_t
  print_host_end( apr_socket_t *client)
  {
    apr_size_t len = 8;
!   return socket_send(client, "</HOST>\n", &len); 
  }
  
  static void
