Changeset 2008

Show
Ignore:
Timestamp:
10/27/2007 06:18:49 PM (9 months ago)
Author:
jan
Message:

fixed writev() interface for solaris (EINVAL all the time)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/network_solaris_sendfilev.c

    r1646 r2008  
    4040 
    4141NETWORK_BACKEND_WRITE(solarissendfilev) { 
    42         chunk *c
     42        chunk *c, *tc
    4343        size_t chunks_written = 0; 
    4444 
     
    4949                switch(c->type) { 
    5050                case MEM_CHUNK: 
    51                         ret = network_write_chunkqueue_writev_mem(srv, con, sock, cq, &c); 
     51                        ret = network_write_chunkqueue_writev_mem(srv, con, sock, cq, c); 
     52 
     53                        /* check which chunks are finished now */ 
     54                        for (tc = c; tc; tc = tc->next) { 
     55                                /* finished the chunk */ 
     56                                if (tc->offset == tc->mem->used - 1) { 
     57                                        /* skip the first c->next as that will be done by the c = c->next in the other for()-loop */ 
     58                                        if (chunk_finished) { 
     59                                                c = c->next; 
     60                                        } else { 
     61                                                chunk_finished = 1; 
     62                                        } 
     63                                } else { 
     64                                        break; 
     65                                } 
     66                        } 
    5267 
    5368                        if (ret != NETWORK_STATUS_SUCCESS) { 
    5469                                return ret; 
    5570                        } 
    56  
    57                         chunk_finished = 1; 
    5871 
    5972                        break; 
     
    94107                        /* Solaris sendfilev() */ 
    95108                        if (-1 == (r = sendfilev(sock->fd, &fvec, 1, &written))) { 
    96                                 if (errno != EAGAIN) { 
    97                                         log_error_write(srv, __FILE__, __LINE__, "ssd", "sendfile: ", strerror(errno), errno); 
     109                                switch (errno) { 
     110                                case EAGAIN: 
     111                                        break; 
     112                                default: 
     113                                        ERROR("sendfilev() failed: %s (errno=%d)", strerror(errno), errno); 
    98114 
    99115                                        close(ifd); 
     
    115131                } 
    116132                default: 
    117                         log_error_write(srv, __FILE__, __LINE__, "ds", c, "type not known"); 
     133                        ERROR("chunk-type '%s' is not known", c->type); 
    118134 
    119135                        return NETWORK_STATUS_FATAL_ERROR; 
     
    123139                        /* not finished yet */ 
    124140 
    125                         break
     141                        return NETWORK_STATUS_WAIT_FOR_EVENT
    126142                } 
    127143        }