]> arthur.barton.de Git - netatalk.git/blob - libatalk/dsi/dsi_read.c
Cleanup header checks in configure.in
[netatalk.git] / libatalk / dsi / dsi_read.c
1 /*
2  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
3  * All rights reserved. See COPYRIGHT.
4  */
5
6 #ifdef HAVE_CONFIG_H
7 #include "config.h"
8 #endif /* HAVE_CONFIG_H */
9
10 #include <stdio.h>
11 #include <string.h>
12 #include <unistd.h>
13 #include <signal.h>
14 #include <sys/types.h>
15 #include <sys/time.h>
16
17 #include <atalk/dsi.h>
18
19 #ifndef min
20 #define min(a,b)   ((a) < (b) ? (a) : (b))
21 #endif /* ! min */
22
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)
30 {
31
32   dsi->noreply = 1; /* we will handle our own replies */
33   dsi->header.dsi_flags = DSIFL_REPLY;
34   /*dsi->header.dsi_command = DSIFUNC_CMD;*/
35   dsi->header.dsi_len = htonl(size);
36   dsi->header.dsi_code = htonl(err);
37
38   dsi->in_write++;
39   if (dsi_stream_send(dsi, buf, buflen)) {
40     dsi->datasize = size - buflen;
41     return min(dsi->datasize, buflen);
42   }
43
44   return -1; /* error */
45 }
46
47 void dsi_readdone(DSI *dsi)
48 {
49   dsi->in_write--;
50 }
51
52 /* send off the data */
53 ssize_t dsi_read(DSI *dsi, void *buf, const size_t buflen)
54 {
55   size_t len;
56   
57   len  = dsi_stream_write(dsi, buf, buflen, 0);
58
59   if (len == buflen) {
60     dsi->datasize -= len;
61     return min(dsi->datasize, buflen);
62   }
63
64   return -1;
65 }