]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/dsi/dsi_read.c
Fix unnamed union inside struct
[netatalk.git] / libatalk / dsi / dsi_read.c
index 92dd7eef8dff11b7a4d29fbe46549ad433b31012..31ee3bdff4a9191327b808061c6979c8ae4a0dcf 100644 (file)
@@ -1,6 +1,4 @@
 /*
- * $Id: dsi_read.c,v 1.4 2005-04-28 20:50:02 bfernhomberg Exp $
- *
  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
  */
 
 #include <stdio.h>
 #include <string.h>
-#ifdef HAVE_UNISTD_H
 #include <unistd.h>
-#endif /* HAVE_UNISTD_H */
 #include <signal.h>
 #include <sys/types.h>
 #include <sys/time.h>
-#ifdef HAVE_SYS_FILIO_H
-#include <sys/filio.h>
-#endif
 
 #include <atalk/dsi.h>
-#include <sys/ioctl.h> 
-
-#ifndef min
-#define min(a,b)   ((a) < (b) ? (a) : (b))
-#endif /* ! min */
+#include <atalk/util.h>
+#include <atalk/logger.h>
 
 /* 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)
 {
-#ifdef TIMER_ON_WRITE
-  const struct itimerval none = {{0, 0}, {0, 0}};
-#endif
+    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, &dsi->oldset);
-  dsi->sigblocked = 1;
-#ifdef TIMER_ON_WRITE
-  setitimer(ITIMER_REAL, &none, &dsi->savetimer);
-#endif  
-  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)
 {
-#ifdef TIMER_ON_WRITE
-  setitimer(ITIMER_REAL, &dsi->savetimer, NULL);
-#endif
-  sigprocmask(SIG_SETMASK, &dsi->oldset, NULL);
-  dsi->sigblocked = 0;
-}
-
-/* */
-int dsi_block(DSI *dsi, const int mode)
-{
-#if 0
-    dsi->noblocking = mode;
-    return 0;
-#else
-    int adr = mode;
-    int ret;
-    
-    ret = ioctl(dsi->socket, FIONBIO, &adr);
-    if (!ret) {
-        dsi->noblocking = mode;
-    }
-    return ret;
-#endif    
+    dsi->in_write--;
 }
 
 /* send off the data */
 ssize_t dsi_read(DSI *dsi, void *buf, const size_t buflen)
 {
-  size_t len;
-  int delay = (dsi->datasize != buflen)?1:0;
-  
-  len  = dsi_stream_write(dsi, buf, buflen, delay);
+    size_t len;
 
-  if (len == buflen) {
-    dsi->datasize -= len;
-    return min(dsi->datasize, buflen);
-  }
+    len  = dsi_stream_write(dsi, buf, buflen, 0);
+
+    if (len == buflen) {
+        dsi->datasize -= len;
+        return MIN(dsi->datasize, buflen);
+    }
 
-  return -1;
+    return -1;
 }