From 366ae9913c6a84620e62e73de9e0f7abd789eee9 Mon Sep 17 00:00:00 2001 From: Ron Pedde Date: Mon, 6 Aug 2007 05:18:01 +0000 Subject: [PATCH] Fix problems with ascii log files, also problems with WSAEWOULDBLOCK on send buffer/receive window full. --- src/err.c | 2 +- src/io-errors.h | 2 +- src/io.c | 56 +++++++++++++++++++++++++++---------------- src/os-win32.c | 8 ++++++- src/webserver.c | 3 ++- win32/mt-daapd.vcproj | 8 +++++-- 6 files changed, 52 insertions(+), 27 deletions(-) diff --git a/src/err.c b/src/err.c index 57409043..d6c75b3a 100644 --- a/src/err.c +++ b/src/err.c @@ -360,7 +360,7 @@ int err_setlogfile(char *file) { strncpy(err_filename,file,sizeof(err_filename)-1); - if(!io_open(err_file,"file://%U?mode=%s",err_filename,mode)) { + if(!io_open(err_file,"file://%U?mode=%s&ascii=1",err_filename,mode)) { fprintf(stderr,"Error opening logfile: %s",io_errstr(err_file)); err_logdest &= ~LOGDEST_LOGFILE; diff --git a/src/io-errors.h b/src/io-errors.h index 02c764cd..f1bd9d36 100644 --- a/src/io-errors.h +++ b/src/io-errors.h @@ -23,7 +23,7 @@ #define _IO_ERRORS_H_ -#define IO_E_OTHER 0x00000001 /**< Native error */ +#define IO_E_OTHER 0x00000000 /**< Native error */ #define IO_E_BADPROTO 0x01000001 /**< Bad protocol type, unhandled URI */ #define IO_E_NOTINIT 0x01000002 /**< io object not initialized with new */ #define IO_E_BADFN 0x01000003 /**< uniplemented io function */ diff --git a/src/io.c b/src/io.c index 7a05619f..850e96bf 100644 --- a/src/io.c +++ b/src/io.c @@ -1010,9 +1010,9 @@ int io_write(IO_PRIVHANDLE *phandle, unsigned char *buf, uint32_t *len) { must_free = TRUE; dst = real_buffer; for(index = 0; index < *len; index++) { - *dst++ = buf[index]; if(buf[index] == '\n') *dst++ = '\r'; + *dst++ = buf[index]; } real_len = ascii_len; } else { @@ -1294,6 +1294,10 @@ void io_err(IO_PRIVHANDLE *phandle, uint32_t errorcode) { /* underlying provider must provide a free-able error message */ phandle->err_str = phandle->fnptr->fn_geterrmsg(phandle, &phandle->err, &phandle->is_local); } + + while((phandle->err_str[strlen(phandle->err_str) - 1] == '\n') || + (phandle->err_str[strlen(phandle->err_str) -1] == '\r')) + phandle->err_str[strlen(phandle->err_str) -1] = '\0'; } /** @@ -1389,7 +1393,7 @@ int io_file_open(IO_PRIVHANDLE *phandle, char *uri) { else native_mode |= OPEN_EXISTING; - priv->fd = CreateFile(uri,native_permissions,0,NULL, + priv->fd = CreateFile(uri,native_permissions,FILE_SHARE_READ,NULL, native_mode,FILE_ATTRIBUTE_NORMAL,NULL); if(priv->fd == INVALID_HANDLE_VALUE) { io_file_seterr(phandle,IO_E_FILE_OTHER); @@ -1787,7 +1791,7 @@ char *io_file_geterrmsg(IO_PRIVHANDLE *phandle, ERR_T *code, int *is_local) { *is_local=FALSE; #ifdef WIN32 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL,GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), + NULL,priv->err,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (LPTSTR)lpErrorBuf,sizeof(lpErrorBuf),NULL); return strdup(lpErrorBuf); #else @@ -2286,11 +2290,18 @@ int io_socket_write(IO_PRIVHANDLE *phandle, unsigned char *buf,uint32_t *len) { bufp += byteswritten, bytestowrite -= byteswritten) { if(priv->is_udp) { /* must be sending to */ slen = sizeof(struct sockaddr_in); - byteswritten = sendto(priv->fd, buf, *len, 0, + byteswritten = sendto(priv->fd, bufp, bytestowrite, 0, (struct sockaddr *)&priv->si_remote, slen); } else { - byteswritten = send(priv->fd, buf, *len, 0); + byteswritten = send(priv->fd, bufp, bytestowrite, 0); } + +#ifdef WIN32 + if(WSAGetLastError() == WSAEWOULDBLOCK) { + byteswritten = 0; + Sleep(50); + } +#endif if((byteswritten == -1 ) && (errno != EINTR)) { io_socket_seterr(phandle,IO_E_SOCKET_OTHER); return FALSE; @@ -2362,17 +2373,20 @@ void io_socket_seterr(IO_PRIVHANDLE *phandle, ERR_T errcode) { } else { priv->local_err = FALSE; #ifdef WIN32 - /* FIXME: should this be WSAGetLastError? */ - priv->err = GetLastError(); - /* FIXME: remap win32 error codes to unix error codes */ + priv->err = WSAGetLastError(); + /* map error codes to exported errors */ + if(priv->err == WSAEADDRINUSE) { + priv->err = IO_E_SOCKET_INUSE; + priv->local_err = TRUE; + } #else priv->err = errno; -#endif /* map error codes to exported errors */ if(priv->err == EADDRINUSE) { priv->err = IO_E_SOCKET_INUSE; priv->local_err = TRUE; } +#endif } } @@ -2404,7 +2418,7 @@ char *io_socket_geterrmsg(IO_PRIVHANDLE *phandle, ERR_T *code, int *is_local) { *is_local = FALSE; #ifdef WIN32 FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, - NULL,priv->local_err,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), + NULL,priv->err,MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT), (LPTSTR)lpErrorBuf,sizeof(lpErrorBuf),NULL); return strdup(lpErrorBuf); @@ -2456,7 +2470,7 @@ int io_socket_getwaitable(IO_PRIVHANDLE *phandle, int mode, WAITABLE_T *retval) } #ifdef WIN32 - io_err_printf(IO_LOG_DEBUG,"Building synthesized event for socket\n"); + io_err_printf(IO_LOG_SPAM,"Building synthesized event for socket\n"); if(priv->hEvent) { if(mode == priv->wait_mode) { *retval = priv->hEvent; @@ -2813,7 +2827,7 @@ int io_wait_add(IO_WAITHANDLE *pwait, IO_PRIVHANDLE *phandle, int type) { return FALSE; } - io_err_printf(IO_LOG_DEBUG,"Getting io waitable of type %d\n",type); + io_err_printf(IO_LOG_SPAM,"Getting io waitable of type %d\n",type); if(!phandle->fnptr->fn_getwaitable(phandle, type, &waitable)) { io_err_printf(IO_LOG_WARN,"io_wait_add: error getting waitable\n"); return FALSE; @@ -2839,7 +2853,7 @@ int io_wait_add(IO_WAITHANDLE *pwait, IO_PRIVHANDLE *phandle, int type) { pwait->hWaitItems[pwait->dwItemCount] = waitable; pwait->ppHandle[pwait->dwItemCount] = phandle; - io_err_printf(IO_LOG_DEBUG,"Added event %08X with pHandle %08X as %d\n", + io_err_printf(IO_LOG_SPAM,"Added event %08X with pHandle %08X as %d\n", waitable,phandle,pwait->dwItemCount); pwait->dwItemCount++; @@ -2847,7 +2861,7 @@ int io_wait_add(IO_WAITHANDLE *pwait, IO_PRIVHANDLE *phandle, int type) { if(waitable > pwait->max_fd) pwait->max_fd = waitable; - io_err_printf(IO_LOG_INFO,"Adding %d to waitlist\n",waitable); + io_err_printf(IO_LOG_SPAM,"Adding %d to waitlist\n",waitable); if(type & IO_WAIT_READ) FD_SET(waitable,&pwait->read_fds); @@ -2893,7 +2907,7 @@ int io_wait(IO_WAITHANDLE *pwait, uint32_t *ms) { #ifdef WIN32 ASSERT(pwait->dwItemCount); - io_err_printf(IO_LOG_INFO,"Waiting on %d items for %d sec\n", + io_err_printf(IO_LOG_SPAM,"Waiting on %d items for %d sec\n", pwait->dwItemCount,timeout.tv_sec); while(1) { @@ -2911,7 +2925,7 @@ int io_wait(IO_WAITHANDLE *pwait, uint32_t *ms) { } /* Was definitely a WAIT_OBJECT_x. Make sure it's not spurious */ - io_err_printf(IO_LOG_DEBUG,"Got wait on index %d\n",pwait->dwWhichEvent); + io_err_printf(IO_LOG_SPAM,"Got wait on index %d\n",pwait->dwWhichEvent); if(!pwait->ppHandle[pwait->dwWhichEvent]->fnptr->fn_getsocket) { /* not a socket, must be a file */ /* dummy up a result */ pwait->wsaNetworkEvents.lNetworkEvents = FD_READ; @@ -2919,18 +2933,18 @@ int io_wait(IO_WAITHANDLE *pwait, uint32_t *ms) { } if(!pwait->ppHandle[pwait->dwWhichEvent]->fnptr->fn_getsocket(pwait->ppHandle[pwait->dwWhichEvent],&sock)) { - io_err_printf(IO_LOG_WARN,"Could not get socket handle\n"); + io_err_printf(IO_LOG_SPAM,"Could not get socket handle\n"); return FALSE; } - io_err_printf(IO_LOG_DEBUG,"Getting event details for wait object\n"); + io_err_printf(IO_LOG_SPAM,"Getting event details for wait object\n"); WSAEnumNetworkEvents(sock,pwait->hWaitItems[pwait->dwWhichEvent],&pwait->wsaNetworkEvents); if(pwait->wsaNetworkEvents.lNetworkEvents != 0) { - io_err_printf(IO_LOG_DEBUG,"Got %ld\n",pwait->wsaNetworkEvents.lNetworkEvents); + io_err_printf(IO_LOG_SPAM,"Got %ld\n",pwait->wsaNetworkEvents.lNetworkEvents); break; } - io_err_printf(IO_LOG_DEBUG,"Skipping spurious wakeup\n"); + io_err_printf(IO_LOG_SPAM,"Skipping spurious wakeup\n"); } if(pwait->dwLastResult == WAIT_FAILED) @@ -2953,7 +2967,7 @@ int io_wait(IO_WAITHANDLE *pwait, uint32_t *ms) { return FALSE; } - io_err_printf(IO_LOG_INFO,"selecting on %d nfds, for %d.%d sec\n", + io_err_printf(IO_LOG_SPAM,"selecting on %d nfds, for %d.%d sec\n", pwait->max_fd+1,timeout.tv_sec,timeout.tv_usec); while(((retval = select(pwait->max_fd+1,&pwait->result_read, diff --git a/src/os-win32.c b/src/os-win32.c index 31e54c04..75958e88 100644 --- a/src/os-win32.c +++ b/src/os-win32.c @@ -407,10 +407,16 @@ void *os_loadlib(char **pe, char *path) { void *os_libfunc(char **pe, void *handle, char *function) { void *retval; + char *e; retval = GetProcAddress((HMODULE)handle, function); if(!retval) { - if(pe) *pe = strdup(os_strerror(0)); + if(pe) { + *pe = strdup(os_strerror(0)); + e = *pe; + while((e[strlen(e) - 1] == '\n') || (e[strlen(e)-1] == '\r')) + e[strlen(e)-1] = '\0'; + } } return retval; } diff --git a/src/webserver.c b/src/webserver.c index 4f7bf39e..6e25607d 100644 --- a/src/webserver.c +++ b/src/webserver.c @@ -2015,7 +2015,8 @@ int ws_copyfile(WS_CONNINFO *pwsc, IOHANDLE hfile, uint64_t *bytes_copied) { bytes_written = bytes_read; if(!io_write(pwsc->hclient,buf,&bytes_written)) { ws_dprintf(L_WS_LOG,"Write error: %s\n",io_errstr(pwsc->hclient)); - break; + *bytes_copied = total_bytes; + return FALSE; } if(bytes_written != bytes_read) { diff --git a/win32/mt-daapd.vcproj b/win32/mt-daapd.vcproj index f8ef8044..9a95ab61 100644 --- a/win32/mt-daapd.vcproj +++ b/win32/mt-daapd.vcproj @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories="$(InputDir),..\src,.,.." - PreprocessorDefinitions="HAVE_CONFIG_H;ZLIB_DLL;_WINDOWS;FLAC;OGGVORBIS" + PreprocessorDefinitions="HAVE_CONFIG_H;ZLIB_DLL;_WINDOWS;WIN32;FLAC;OGGVORBIS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" @@ -124,7 +124,7 @@ + +