diff --git a/src/sbbs3/js_socket.c b/src/sbbs3/js_socket.c index 0310ce212ebc85a3cea042429df05c8d601c4551..f2b0569abb5b5c3885d0c15aa910e89fd97af7e3 100644 --- a/src/sbbs3/js_socket.c +++ b/src/sbbs3/js_socket.c @@ -68,7 +68,7 @@ static bool js_socket_peek_byte(JSContext *cx, js_socket_private_t *p); static JSBool js_socket_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp); static ptrdiff_t js_socket_recv(JSContext *cx, js_socket_private_t *p, void *buf, size_t len, int flags, int timeout); static JSBool js_socket_resolve(JSContext *cx, JSObject *obj, jsid id); -static off_t js_socket_sendfilesocket(js_socket_private_t *p, int file, off_t *offset, off_t count); +static off_t js_socket_sendfilesocket(js_socket_private_t *p, int file); static ptrdiff_t js_socket_sendsocket(js_socket_private_t *p, const void *msg, size_t len, int flush); static JSBool js_socket_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict, jsval *vp); static JSBool js_install_event(JSContext *cx, uintN argc, jsval *arglist, bool once); @@ -393,66 +393,47 @@ static ptrdiff_t js_socket_sendsocket(js_socket_private_t *p, const void *msg, s return total; } -static off_t js_socket_sendfilesocket(js_socket_private_t *p, int file, off_t *offset, off_t count) +static off_t js_socket_sendfilesocket(js_socket_private_t *p, int file) { - char buf[1024*16]; - off_t len; - int rd; - int wr=0; - off_t total=0; - int i; - - if(p->session==-1) - return (int)sendfilesocket(p->sock, file, offset, count); + char buf[1024*16]; + off_t total = 0; - len=filelength(file); - - if(offset!=NULL) - if(lseek(file,*offset,SEEK_SET)<0) - return(-1); - - if(count<1 || count>len) { - count=len; - count-=tell(file); /* don't try to read beyond EOF */ - } - - if(count<0) { - errno=EINVAL; - return(-1); - } - - while(total<count) { - rd=read(file,buf,sizeof(buf)); - if(rd==-1) { - do_CryptFlush(p); - return(-1); + for (;;) { + ssize_t rd = read(file, buf, sizeof(buf)); + if (rd < 0) { + if (p->session != -1) + do_CryptFlush(p); + return (-1); } - if(rd==0) + if (rd == 0) break; - for(i=wr=0;i<rd;i+=wr) { - wr=js_socket_sendsocket(p,buf+i,rd-i,false); - if(wr>0) - continue; - if(wr==SOCKET_ERROR && SOCKET_ERRNO==EWOULDBLOCK) { + size_t sent = 0; + while (sent < rd) { + ptrdiff_t wr = js_socket_sendsocket(p, buf + sent, rd - sent, false); + if (wr > 0) { + sent += wr; + } + else if (wr == SOCKET_ERROR && SOCKET_ERRNO == EWOULDBLOCK) { wr=0; SLEEP(1); - continue; } - do_CryptFlush(p); - return(wr); + else { + if (p->session != -1) + do_CryptFlush(p); + return (wr); + } } - if(i!=rd) { - do_CryptFlush(p); - return(-1); + if (sent != rd) { + if (p->session != -1) + do_CryptFlush(p); + return (-1); } - total+=rd; + total += rd; } - if(offset!=NULL) - (*offset)+=total; - - do_CryptFlush(p); - return(total); + if (p->session != -1) + do_CryptFlush(p); + return (total); } static void dbprintf(bool error, js_socket_private_t* p, char* fmt, ...) @@ -1328,7 +1309,7 @@ js_sendfile(JSContext *cx, uintN argc, jsval *arglist) return(JS_TRUE); } - len = js_socket_sendfilesocket(p, file, NULL, 0); + len = js_socket_sendfilesocket(p, file); close(file); if(len > 0) { dbprintf(false, p, "sent %"PRIdOFF" bytes",len); diff --git a/src/xpdev/sockwrap.c b/src/xpdev/sockwrap.c index f013652f78f5adf2e3d4866848cf9f67c6d7e3e5..43716a5192b9a44d526353c7a3e9386199b2ef00 100644 --- a/src/xpdev/sockwrap.c +++ b/src/xpdev/sockwrap.c @@ -153,115 +153,6 @@ socket_option_t* getSocketOptionList(void) return(socket_options); } -// TODO: Only called with *offset == NULL and count == 0... -off_t sendfilesocket(int sock, int file, off_t *offset, off_t count) -{ - char buf[1024*16]; - off_t len; - off_t total=0; - - // TODO: Race condition here... length may change. - // But note that js_socket_sendfilesocket() reimplements all of this - // for encrypted sockets. - len = filelength(file); - - if(offset!=NULL) - if(lseek(file,*offset,SEEK_SET)<0) - return(-1); - - if (count < 1 || count > len) { - count = len; - count -= tell(file); /* don't try to read beyond EOF (why not? --- Deuce) */ - } - - if (count < 0) { - errno = EINVAL; - return(-1); - } - - while (total < count) { - ssize_t rd = read(file, buf, sizeof(buf)); - ssize_t sent = 0; - if (rd < 0) // Error - return(-1); - if (rd == 0) // EOF - break; - while (sent < rd) { - ssize_t wr = sendsocket(sock, buf + sent, rd - sent); - if (wr > 0 && wr <= (rd - sent)) { - sent += wr; - } - else if (wr == SOCKET_ERROR && SOCKET_ERRNO == EWOULDBLOCK) { - SLEEP(1); - } - else { - // TODO: This is sketchy to return 0 on write failure - return(wr); - } - } - total += rd; - } - - if (offset != NULL) - (*offset) += total; - - return(total); -} - -off_t recvfilesocket(int sock, int file, off_t *offset, off_t count) -{ - /* Writes a file from a socket - - * - * sock - Socket to read from - * file - File descriptior to write to - * MUST be open and writeable - * offset - pointer to file offset to start writing at - * is set to offset writing STOPPED - * on return - * count - number of bytes to read/write - * - * returns -1 if an error occurse, otherwise - * returns number ob bytes written and sets offset - * to the new offset - */ - - char* buf; - ssize_t rd; - ssize_t wr; - - if(count<1) { - errno=ERANGE; - return(-1); - } - - if((buf=(char*)malloc((size_t)count))==NULL) { - errno=ENOMEM; - return(-1); - } - - if(offset!=NULL) { - if(lseek(file,*offset,SEEK_SET)<0) { - free(buf); - return(-1); - } - } - - rd=read(sock,buf,(size_t)count); - if(rd!=count) { - free(buf); - return(-1); - } - - wr=write(file,buf,rd); - - if(offset!=NULL) - (*offset)+=wr; - - free(buf); - return(wr); -} - - /* Return true if connected, optionally sets *rd_p to true if read data available */ /* * The exact conditions where rd_p is set to true and the return value diff --git a/src/xpdev/sockwrap.h b/src/xpdev/sockwrap.h index 963f5bdfca17016ba77b57d9c284476e45b8d285..a82d27eb85c43046a4d02d83a4802210d480afed 100644 --- a/src/xpdev/sockwrap.h +++ b/src/xpdev/sockwrap.h @@ -239,9 +239,6 @@ extern "C" { DLLEXPORT socket_option_t* getSocketOptionList(void); DLLEXPORT int getSocketOptionByName(const char* name, int* level); - -DLLEXPORT off_t sendfilesocket(int sock, int file, off_t* offset, off_t count); -DLLEXPORT off_t recvfilesocket(int sock, int file, off_t* offset, off_t count); DLLEXPORT bool socket_check(SOCKET sock, bool* rd_p, bool* wr_p, DWORD timeout); DLLEXPORT int retry_bind(SOCKET s, const struct sockaddr *addr, socklen_t addrlen ,uint retries, uint wait_secs, const char* prot diff --git a/src/xpdev/xpbeep.c b/src/xpdev/xpbeep.c index eb4c864952a8ac1485df2c99257249e9f7a9f18a..27fe510878b9a978bbc0c140016b395d2b178edc 100644 --- a/src/xpdev/xpbeep.c +++ b/src/xpdev/xpbeep.c @@ -976,7 +976,7 @@ do_xp_play_sample(unsigned char *sampo, size_t sz, int *freed) size_t wr = 0; while (wr < sz) { ssize_t i = write(dsp, samp + wr, sz - wr); - if (i >= 0 && i <= (sz - wr)) + if (i >= 0) wr += i; else return false;