X-Git-Url: https://arthur.barton.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=libatalk%2Fdsi%2Fdsi_read.c;h=31ee3bdff4a9191327b808061c6979c8ae4a0dcf;hb=e450b7b95579a4a4358e499fdbf93620aa09bae2;hp=cd004dbca8e3056f26cd1764b94cbe80888fbdfb;hpb=12857f8fdde6f59eb8759b35d75e89c0dad8cfbe;p=netatalk.git diff --git a/libatalk/dsi/dsi_read.c b/libatalk/dsi/dsi_read.c index cd004dbc..31ee3bdf 100644 --- a/libatalk/dsi/dsi_read.c +++ b/libatalk/dsi/dsi_read.c @@ -1,6 +1,4 @@ /* - * $Id: dsi_read.c,v 1.6 2009-10-22 04:59:50 didg Exp $ - * * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu) * All rights reserved. See COPYRIGHT. */ @@ -11,86 +9,56 @@ #include #include -#ifdef HAVE_UNISTD_H #include -#endif /* HAVE_UNISTD_H */ #include #include #include -#ifdef HAVE_SYS_FILIO_H -#include -#endif #include -#include - -#ifndef min -#define min(a,b) ((a) < (b) ? (a) : (b)) -#endif /* ! min */ +#include +#include /* streaming i/o for afp_read. this is all from the perspective of the * client. it basically does the reverse of dsi_write. on first entry, * it will send off the header plus whatever is in its command * buffer. it returns the amount of stuff still to be read * (constrained by the buffer size). */ -ssize_t dsi_readinit(DSI *dsi, void *buf, const size_t buflen, - const size_t size, const int err) +ssize_t dsi_readinit(DSI *dsi, void *buf, const size_t buflen, const size_t size, const int err) { + LOG(log_maxdebug, logtype_dsi, "dsi_readinit: sending %zd bytes from buffer, total size: %zd", + buflen, size); - dsi->noreply = 1; /* we will handle our own replies */ - dsi->header.dsi_flags = DSIFL_REPLY; - /*dsi->header.dsi_command = DSIFUNC_CMD;*/ - dsi->header.dsi_len = htonl(size); - dsi->header.dsi_code = htonl(err); + dsi->flags |= DSI_NOREPLY; /* we will handle our own replies */ + dsi->header.dsi_flags = DSIFL_REPLY; + dsi->header.dsi_len = htonl(size); + dsi->header.dsi_data.dsi_code = htonl(err); - sigprocmask(SIG_BLOCK, &dsi->sigblockset, &dsi->oldset); - dsi->sigblocked = 1; - dsi->in_write++; - if (dsi_stream_send(dsi, buf, buflen)) { - dsi->datasize = size - buflen; - return min(dsi->datasize, buflen); - } + dsi->in_write++; + if (dsi_stream_send(dsi, buf, buflen)) { + dsi->datasize = size - buflen; + LOG(log_maxdebug, logtype_dsi, "dsi_readinit: remaining data for sendfile: %zd", dsi->datasize); + return MIN(dsi->datasize, buflen); + } - return -1; /* error */ + return -1; /* error */ } void dsi_readdone(DSI *dsi) { - sigprocmask(SIG_SETMASK, &dsi->oldset, NULL); - dsi->sigblocked = 0; - dsi->in_write--; -} - -/* */ -int dsi_block(DSI *dsi, const int mode) -{ -#if 0 - dsi->noblocking = mode; - return 0; -#else - int adr = mode; - int ret; - - ret = ioctl(dsi->socket, FIONBIO, &adr); - if (!ret) { - dsi->noblocking = mode; - } - return ret; -#endif + dsi->in_write--; } /* send off the data */ ssize_t dsi_read(DSI *dsi, void *buf, const size_t buflen) { - size_t len; - int delay = (dsi->datasize != buflen)?1:0; - - len = dsi_stream_write(dsi, buf, buflen, delay); + size_t len; - if (len == buflen) { - dsi->datasize -= len; - return min(dsi->datasize, buflen); - } + len = dsi_stream_write(dsi, buf, buflen, 0); + + if (len == buflen) { + dsi->datasize -= len; + return MIN(dsi->datasize, buflen); + } - return -1; + return -1; }