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; }
externC void cyg_start(void) { httpd_main(); }