2 * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
3 * All rights reserved. See COPYRIGHT.
14 #include <sys/types.h>
17 #include <atalk/dsi.h>
20 #define min(a,b) ((a) < (b) ? (a) : (b))
23 /* streaming i/o for afp_read. this is all from the perspective of the
24 * client. it basically does the reverse of dsi_write. on first entry,
25 * it will send off the header plus whatever is in its command
26 * buffer. it returns the amount of stuff still to be read
27 * (constrained by the buffer size). */
28 ssize_t dsi_readinit(DSI *dsi, void *buf, const size_t buflen,
29 const size_t size, const int err)
31 const struct itimerval none = {{0, 0}, {0, 0}};
33 dsi->noreply = 1; /* we will handle our own replies */
34 dsi->header.dsi_flags = DSIFL_REPLY;
35 /*dsi->header.dsi_command = DSIFUNC_CMD;*/
36 dsi->header.dsi_len = htonl(size);
37 dsi->header.dsi_code = htonl(err);
39 sigprocmask(SIG_BLOCK, &dsi->sigblockset, NULL);
40 setitimer(ITIMER_REAL, &none, &dsi->savetimer);
41 if (dsi_stream_send(dsi, buf, buflen)) {
42 dsi->datasize = size - buflen;
43 return min(dsi->datasize, buflen);
46 return -1; /* error */
49 void dsi_readdone(DSI *dsi)
51 setitimer(ITIMER_REAL, &dsi->savetimer, NULL);
52 sigprocmask(SIG_UNBLOCK, &dsi->sigblockset, NULL);
55 /* send off the data */
56 ssize_t dsi_read(DSI *dsi, void *buf, const size_t buflen)
58 size_t len = dsi_stream_write(dsi, buf, buflen);
62 return min(dsi->datasize, buflen);