@@ -54,6 +54,16 @@ const char* WuClientStateString(WuClientState state) {
5454 }
5555}
5656
57+ void WuHandleError (WuHost* wu, const char * description) {
58+ wu->errorHandler (description, wu->errorHandlerData );
59+ }
60+
61+ void WuHandleErrno (WuHost* wu, const char * description) {
62+ snprintf (wu->errBuf , sizeof (wu->errBuf ), " %s: %s" , description,
63+ strerror (errno));
64+ WuHandleError (wu, wu->errBuf );
65+ }
66+
5767struct WuConnectionBuffer {
5868 size_t size = 0 ;
5969 int fd = -1 ;
@@ -204,7 +214,7 @@ void WuHandleHttpRequest(WuHost* wu, WuConnectionBuffer* conn) {
204214 kMaxHttpRequestLength - conn->size );
205215 if (count == -1 ) {
206216 if (errno != EAGAIN) {
207- perror ( " read" );
217+ WuHandleErrno (wu, " failed to read from TCP socket " );
208218 close (conn->fd );
209219 wu->bufferPool ->Reclaim (conn);
210220 }
@@ -660,13 +670,19 @@ int32_t WuCryptoInit(WuHost* wu, const WuConf* conf) {
660670}
661671
662672int32_t WuInit (WuHost* wu, const WuConf* conf) {
673+ memset (wu, 0 , sizeof (WuHost));
663674 wu->arena = (WuArena*)calloc (1 , sizeof (WuArena));
664675 WuArenaInit (wu->arena , 1 << 20 );
665676 wu->time = MsNow () * 0.001 ;
666677 wu->dt = 0.0 ;
667678
679+ wu->errorHandler =
680+ conf->errorHandler ? conf->errorHandler : [](const char *, void *) {};
681+ wu->errorHandlerData = conf->errorHandlerData ;
682+
668683 wu->port = atoi (conf->port );
669684 if (!WuCryptoInit (wu, conf)) {
685+ WuHandleError (wu, " failed to init crypto" );
670686 return 0 ;
671687 }
672688
@@ -683,7 +699,7 @@ int32_t WuInit(WuHost* wu, const WuConf* conf) {
683699
684700 s = listen (wu->tcpfd , SOMAXCONN);
685701 if (s == -1 ) {
686- perror ( " listen" );
702+ WuHandleErrno (wu, " tcp listen failed " );
687703 return 0 ;
688704 }
689705
@@ -700,7 +716,7 @@ int32_t WuInit(WuHost* wu, const WuConf* conf) {
700716
701717 wu->epfd = epoll_create1 (0 );
702718 if (wu->epfd == -1 ) {
703- perror ( " epoll_create" );
719+ WuHandleErrno (wu, " epoll_create" );
704720 return 0 ;
705721 }
706722
@@ -721,14 +737,14 @@ int32_t WuInit(WuHost* wu, const WuConf* conf) {
721737
722738 s = epoll_ctl (wu->epfd , EPOLL_CTL_ADD, wu->tcpfd , &event);
723739 if (s == -1 ) {
724- perror ( " epoll_ctl " );
740+ WuHandleErrno (wu, " EPOLL_CTL_ADD tcpfd " );
725741 return 0 ;
726742 }
727743
728744 event.data .ptr = udpBuf;
729745 s = epoll_ctl (wu->epfd , EPOLL_CTL_ADD, wu->udpfd , &event);
730746 if (s == -1 ) {
731- perror ( " epoll_ctl " );
747+ WuHandleErrno (wu, " EPOLL_CTL_ADD udpfd " );
732748 return 0 ;
733749 }
734750
@@ -807,7 +823,7 @@ int32_t WuServe(WuHost* wu, WuEvent* evt) {
807823 if ((errno == EAGAIN) || (errno == EWOULDBLOCK)) {
808824 break ;
809825 } else {
810- perror ( " accept" );
826+ WuHandleErrno (wu, " tcp accept" );
811827 break ;
812828 }
813829 }
@@ -826,7 +842,7 @@ int32_t WuServe(WuHost* wu, WuEvent* evt) {
826842 event.data .ptr = conn;
827843 if (epoll_ctl (wu->epfd , EPOLL_CTL_ADD, infd, &event) == -1 ) {
828844 close (infd);
829- perror ( " epoll_ctl " );
845+ WuHandleErrno (wu, " EPOLL_CTL_ADD infd " );
830846 }
831847 } else {
832848 close (infd);
0 commit comments