diff --git a/scan/scan_double.c b/scan/scan_double.c index e92f005..179ce60 100644 --- a/scan/scan_double.c +++ b/scan/scan_double.c @@ -41,11 +41,16 @@ unsigned int scan_double(const char *in, double *dest) { } while (isdigit(*++c)) exp=exp*10+(*c-'0'); - while (exp) { /* XXX: this introduces rounding errors */ - d*=10; --exp; - } + if (neg) + while (exp) { /* XXX: this introduces rounding errors */ + d/=10; --exp; + } + else + while (exp) { /* XXX: this introduces rounding errors */ + d*=10; --exp; + } } done: - *dest=d; + *dest=(neg?-d:d); return c-in; } diff --git a/socket/socket_sendfile.c b/socket/socket_sendfile.c index e94be79..de9f391 100644 --- a/socket/socket_sendfile.c +++ b/socket/socket_sendfile.c @@ -35,15 +35,25 @@ int socket_sendfile(int out,int in,uint32 offset,uint32 bytes) { int socket_sendfile(int out,int in,uint32 offset,uint32 bytes) { char buf[BUFSIZE]; - int n,m; - int sent=0; - if (lseek(in,offset,SEEK_SET) == -1) + uint32 n,m; + uint32 sent=0; + if (lseek(in,offset,SEEK_SET) != offset) return -1; - if ((n=read(in,buf,(bytes0) { + char* tmp=buf; + uint32 tobedone; + if ((n=read(in,tmp,(bytes0) { + if ((m=write(out,tmp,n))<0) + goto abort; + sent+=m; + n-=m; + tmp+=m; + } + } +abort: + return sent; } #endif