Exemple #1
0
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;
        }
    }
}