/*
 * http_ns.c: functions pass off requests to other servers. Normally, one
 *            would expect to use a name service for this function. But this
 *            is the best we can do with what we have.
 * 
 * 09-07-95  tom@mit.edu
 *      original code 
 */

#include "httpd.h"

process_ns(FILE *out, char *url)
{
  log_transaction();
  die(redirect(REDIRECT, round(url), out));
}


static char *
round(char *url, FILE *out)
{
  static char ret[BUFSIZ];
  
  sprintf(buf, "http://%s", robin(out));
  strcat(buf, url);
  return(buf);
}
      

static char *
robin(FILE *out)
{
  static char **servers = (char **) NULL;
  static char **sp = (char **) NULL;
  static int last_update = 0;
  
  if((time(0) - last_update) > serverpool_update) 
    {
      servers = update_server_pool(out);
      last_update = time(0);
    }
  
  if(!*sp)
    sp = servers;
  
  return(*sp++);
}


char **
update_server_pool(int n, FILE *out)
{
#ifdef HESIOD
  char **res;
  
  if(use_hesiod) 
    if(res = hes_resolve(service_name, "sloc")) 
      {
	clear_serverpool();
	while(*res) 
	  add_server_to_pool(*res, out);
      } 
#endif /* HESIOD */
  return(server_pool);
}



add_server_to_pool(char *server, FILE *out)
{
  char **sp;
  int n = 0;

  if(!server_pool)
    {
      n;
      if(!(server_pool = (char **) malloc((n + 1) * sizeof(char *))))
	die(NO_MEMORY, "add_serever_to_pool", out);
      *sp = *server_pool = (char *) NULL;
    }
  else
    {
      sp = server_pool;
      while(*sp) 
	{
	  ++sp;
	  ++n;
	}
      ++n;
      if(!(server_pool = (char **) realloc(server_pool, 
					   (n + 1) * sizeof(char *))))
	die(NO_MEMORY, "add_server_to_pool", out);
    }
  
  if(!(*sp = (char *) malloc(strlen(server) + 1)))
    die(NO_MEMORY, "add_server_to_pool", out);
  
  strcpy(*sp, server);
  *++sp = (char *) NULL;
}


clear_serverpool()
{
  char **sp;

  sp = server_pool;
  while (*sp)
    free(*sp++);
  free(server_pool);
  server_pool = (char **) NULL;
}
