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=0f33c174b9f7dacd10cc9b90a00c4ed8ef89d414;hpb=a4772fa50378fb23354fc515ca237d9957f77ed7;p=netatalk.git diff --git a/libatalk/dsi/dsi_read.c b/libatalk/dsi/dsi_read.c index 0f33c174..31ee3bdf 100644 --- a/libatalk/dsi/dsi_read.c +++ b/libatalk/dsi/dsi_read.c @@ -1,6 +1,4 @@ /* - * $Id: dsi_read.c,v 1.3 2001-06-29 14:14:46 rufustfirefly Exp $ - * * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu) * All rights reserved. See COPYRIGHT. */ @@ -11,60 +9,56 @@ #include #include -#ifdef HAVE_UNISTD_H #include -#endif /* HAVE_UNISTD_H */ #include #include #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) { - const struct itimerval none = {{0, 0}, {0, 0}}; + 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, NULL); - setitimer(ITIMER_REAL, &none, &dsi->savetimer); - 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) { - setitimer(ITIMER_REAL, &dsi->savetimer, NULL); - sigprocmask(SIG_UNBLOCK, &dsi->sigblockset, NULL); + dsi->in_write--; } /* send off the data */ ssize_t dsi_read(DSI *dsi, void *buf, const size_t buflen) { - size_t len = dsi_stream_write(dsi, buf, buflen); + size_t len; + + len = dsi_stream_write(dsi, buf, buflen, 0); - if (len == buflen) { - dsi->datasize -= len; - return min(dsi->datasize, buflen); - } + if (len == buflen) { + dsi->datasize -= len; + return MIN(dsi->datasize, buflen); + } - return -1; + return -1; }