]> arthur.barton.de Git - netatalk.git/blob - libatalk/dsi/dsi_read.c
Performance tuning in afp_read: factor out an unneccessary filesytem read when sendfi...
[netatalk.git] / libatalk / dsi / dsi_read.c
1 /*
2  * $Id: dsi_read.c,v 1.7 2009-10-25 06:13:11 didg Exp $
3  *
4  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
5  * All rights reserved. See COPYRIGHT.
6  */
7
8 #ifdef HAVE_CONFIG_H
9 #include "config.h"
10 #endif /* HAVE_CONFIG_H */
11
12 #include <stdio.h>
13 #include <string.h>
14 #ifdef HAVE_UNISTD_H
15 #include <unistd.h>
16 #endif /* HAVE_UNISTD_H */
17 #include <signal.h>
18 #include <sys/types.h>
19 #include <sys/time.h>
20 #ifdef HAVE_SYS_FILIO_H
21 #include <sys/filio.h>
22 #endif
23
24 #include <atalk/dsi.h>
25 #include <atalk/util.h>
26
27 /* streaming i/o for afp_read. this is all from the perspective of the
28  * client. it basically does the reverse of dsi_write. on first entry,
29  * it will send off the header plus whatever is in its command
30  * buffer. it returns the amount of stuff still to be read
31  * (constrained by the buffer size). */
32 ssize_t dsi_readinit(DSI *dsi, void *buf, const size_t buflen,
33                     const size_t size, const int err)
34 {
35
36   dsi->flags |= DSI_NOREPLY; /* we will handle our own replies */
37   dsi->header.dsi_flags = DSIFL_REPLY;
38   /*dsi->header.dsi_command = DSIFUNC_CMD;*/
39   dsi->header.dsi_len = htonl(size);
40   dsi->header.dsi_code = htonl(err);
41
42   dsi->in_write++;
43   if (dsi_stream_send(dsi, buf, buflen)) {
44     dsi->datasize = size - buflen;
45     return MIN(dsi->datasize, buflen);
46   }
47
48   return -1; /* error */
49 }
50
51 void dsi_readdone(DSI *dsi)
52 {
53   dsi->in_write--;
54 }
55
56 /* send off the data */
57 ssize_t dsi_read(DSI *dsi, void *buf, const size_t buflen)
58 {
59   size_t len;
60   
61   len  = dsi_stream_write(dsi, buf, buflen, 0);
62
63   if (len == buflen) {
64     dsi->datasize -= len;
65     return MIN(dsi->datasize, buflen);
66   }
67
68   return -1;
69 }