示例#1
0
int UdmStartHTTPD(UDM_AGENT *Agent, int (*routine)(int sock, UDM_AGENT *A))
{
  int nport= UDM_SEARCHD_PORT;

  struct sockaddr_in server_addr;
  int ctl_sock, on=1;
  int verb= UDM_LOG_ERROR;
  const char *lstn;

  UdmLog(Agent,verb,"Starting HTTP daemon");
    
  if ((ctl_sock= socket(AF_INET, SOCK_STREAM, 0)) < 0)
  {
    UdmLog(Agent, verb, "socket() error %d", errno);
    return UDM_ERROR;
  }

  if (setsockopt(ctl_sock, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)) != 0)
  {
    UdmLog(Agent,verb,"setsockopt() error %d",errno);
    return UDM_ERROR;
  }

  bzero((void*)&server_addr, sizeof(server_addr));
  server_addr.sin_family = AF_INET;
  if((lstn= UdmVarListFindStr(&Agent->Conf->Vars, "Listen", NULL)))
  {
    char *cport;
    if((cport= strchr(lstn,':')))
    {
      UdmLog(Agent,verb,"Listening '%s'", lstn);
      *cport= '\0';
      server_addr.sin_addr.s_addr= inet_addr(lstn);
      nport= atoi(cport + 1);
    }
    else
    {
      nport= atoi(lstn);
      server_addr.sin_addr.s_addr= htonl(INADDR_ANY);
      UdmLog(Agent, verb,"Listening port %d", nport);
    }
  }
  else
  {
    UdmLog(Agent,verb,"Listening port %d", nport);
    server_addr.sin_addr.s_addr= htonl(INADDR_ANY);
  }
  server_addr.sin_port= htons((u_short)nport);

  if (bind(ctl_sock, (struct sockaddr *)&server_addr, sizeof(server_addr)) == -1)
  {
    UdmLog(Agent,verb,"Can't bind: error %d %s",errno,strerror(errno));
    return UDM_ERROR;
  }

  if (listen(ctl_sock, 32) == -1)
  {
      UdmLog(Agent,verb,"listen() error %d %s",errno,strerror(errno));
      return UDM_ERROR;
  }
    
  UdmLog(Agent,verb,"HTTPD Ready");
  
  httpd_main(Agent, ctl_sock, routine);
  closesocket(ctl_sock);

  UdmLog(Agent,verb,"HTTPD Shutdown");
  return 0;
}
示例#2
0
externC void
cyg_start(void)
{
    httpd_main();
}