]> arthur.barton.de Git - netatalk.git/blob - libatalk/dsi/dsi_write.c
Add recvfile support with splice() on Linux
[netatalk.git] / libatalk / dsi / dsi_write.c
1 /*
2  *
3  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
4  * All rights reserved. See COPYRIGHT.
5  *
6  * 7 Oct 1997 added checks for 0 data.
7  */
8
9 #ifdef HAVE_CONFIG_H
10 #include "config.h"
11 #endif /* HAVE_CONFIG_H */
12
13 /* this streams writes */
14 #include <stdio.h>
15 #include <unistd.h>
16 #include <sys/types.h>
17 #include <sys/stat.h>
18 #include <sys/time.h>
19 #include <fcntl.h>
20 #include <string.h>
21
22 #include <atalk/dsi.h>
23 #include <atalk/util.h>
24 #include <atalk/logger.h>
25
26 size_t dsi_writeinit(DSI *dsi, void *buf, const size_t buflen _U_)
27 {
28     size_t bytes = 0;
29     dsi->datasize = ntohl(dsi->header.dsi_len) - dsi->header.dsi_data.dsi_doff;
30
31     if (dsi->eof > dsi->start) {
32         /* We have data in the buffer */
33         bytes = MIN(dsi->eof - dsi->start, dsi->datasize);
34         memmove(buf, dsi->start, bytes);
35         dsi->start += bytes;
36         dsi->datasize -= bytes;
37         if (dsi->start >= dsi->eof)
38             dsi->start = dsi->eof = dsi->buffer;
39     }
40
41     LOG(log_maxdebug, logtype_dsi, "dsi_writeinit: remaining DSI datasize: %jd", (intmax_t)dsi->datasize);
42
43     return bytes;
44 }
45
46
47 /* fill up buf and then return. this should be called repeatedly
48  * until all the data has been read. i block alarm processing 
49  * during the transfer to avoid sending unnecessary tickles. */
50 size_t dsi_write(DSI *dsi, void *buf, const size_t buflen)
51 {
52   size_t length;
53
54   LOG(log_maxdebug, logtype_dsi, "dsi_write: remaining DSI datasize: %jd", (intmax_t)dsi->datasize);
55
56   if ((length = MIN(buflen, dsi->datasize)) > 0) {
57       if ((length = dsi_stream_read(dsi, buf, length)) > 0) {
58           LOG(log_maxdebug, logtype_dsi, "dsi_write: received: %ju", (intmax_t)length);
59           dsi->datasize -= length;
60           return length;
61       }
62   }
63   return 0;
64 }
65
66 /* flush any unread buffers. */
67 void dsi_writeflush(DSI *dsi)
68 {
69   size_t length;
70
71   while (dsi->datasize > 0) { 
72     length = dsi_stream_read(dsi, dsi->data,
73                              MIN(sizeof(dsi->data), dsi->datasize));
74     if (length > 0)
75       dsi->datasize -= length;
76     else
77       break;
78   }
79 }