size_t dc_fwrite(const void *ptr, size_t size, size_t items, FILE *fp) { int rc ; struct vsp_node *node; node = get_vsp_node(FILE_NO(fp)); if( node == NULL ) { return system_fwrite( ptr, size, items, fp); } rc= dc_real_write(node,ptr,size*items) ; switch(rc) { case -1: #if defined(__linux__) || defined(__GNU__) || defined(__FreeBSD_kernel__) || defined(__CYGWIN__) ((FILE *)fp)->_flags |= _IO_ERR_SEEN ; #else ((FILE *)fp)->_flag |= _IOERR ; #endif rc= 0 ; break ; case 0: #if defined(__linux__) || defined(__GNU__) || defined(__FreeBSD_kernel__) || defined(__CYGWIN__) ((FILE *)fp)->_flags |= _IO_EOF_SEEN ; #else ((FILE *)fp)->_flag |= _IOEOF ; #endif break ; default: rc= (rc+size-1)/size ; break ; } m_unlock(&node->mux); return rc ; }
NSAPI_PUBLIC int netbuf_buf2file(netbuf *buf, SYS_FILE sd, int len) { register int n = len, t, ns; ns = 0; /* First, flush the current buffer */ t = buf->cursize - buf->pos; if((n != -1) && (t > n)) t = n; if((t) && (sd != SYS_NET_ERRORFD)) { #if defined(OSF1) || defined(HPUX) || defined(SNI) OSF_label4: #endif if(system_fwrite(sd, (char *)&buf->inbuf[buf->pos], t) == IO_ERROR) { #if defined(OSF1) || defined(HPUX) || defined(SNI) if(errno == EINTR) goto OSF_label4; #endif buf->errmsg = system_errmsg(); return IO_ERROR; } ns += t; } buf->pos += t; if(n != -1) { n -= t; if(!n) return ns; } else t = buf->maxsize; /* Now, keep blasting until done */ while(1) { if(n != -1) t = (n < buf->maxsize ? n : buf->maxsize); #if defined(OSF1) || defined(HPUX) || defined(SNI) OSF_label5: #endif switch(netbuf_grab(buf, t)) { case IO_ERROR: #if defined(OSF1) || defined(HPUX) || defined(SNI) if(errno == EINTR) goto OSF_label5; #endif return IO_ERROR; case IO_EOF: if(n == -1) return ns; else { buf->errmsg = "premature EOF"; return IO_ERROR; } default: if(sd != SYS_NET_ERRORFD) { #if defined(OSF1) || defined(HPUX) OSF_label6: #endif if(system_fwrite(sd, (char *)(buf->inbuf), buf->cursize) == IO_ERROR) { #if defined(OSF1) || defined(HPUX) if(errno == EINTR) goto OSF_label6; #endif buf->errmsg = system_errmsg(); return IO_ERROR; } ns += buf->cursize; } if(n != -1) { n -= buf->cursize; if(!n) return ns; } break; } } }