]> arthur.barton.de Git - netatalk.git/blobdiff - libatalk/dsi/dsi_read.c
1) try a better workaround for deadlocks when both the server and the client are...
[netatalk.git] / libatalk / dsi / dsi_read.c
index cc5a27b0251609ede38b4d5cb17302e5efb05e6c..55345ba868738d20ee798ab5ce58e33f1bd69934 100644 (file)
@@ -1,24 +1,31 @@
 /*
+ * $Id: dsi_read.c,v 1.7 2009-10-25 06:13:11 didg Exp $
+ *
  * Copyright (c) 1997 Adrian Sun (asun@zoology.washington.edu)
  * All rights reserved. See COPYRIGHT.
  */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
+#endif /* HAVE_CONFIG_H */
 
 #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>
 
 #ifndef min
 #define min(a,b)   ((a) < (b) ? (a) : (b))
-#endif
+#endif /* ! min */
 
 /* 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,
@@ -28,7 +35,6 @@
 ssize_t dsi_readinit(DSI *dsi, void *buf, const size_t buflen,
                    const size_t size, const int err)
 {
-  const struct itimerval none = {{0, 0}, {0, 0}};
 
   dsi->noreply = 1; /* we will handle our own replies */
   dsi->header.dsi_flags = DSIFL_REPLY;
@@ -36,8 +42,7 @@ ssize_t dsi_readinit(DSI *dsi, void *buf, const size_t buflen,
   dsi->header.dsi_len = htonl(size);
   dsi->header.dsi_code = htonl(err);
 
-  sigprocmask(SIG_BLOCK, &dsi->sigblockset, NULL);
-  setitimer(ITIMER_REAL, &none, &dsi->savetimer);
+  dsi->in_write++;
   if (dsi_stream_send(dsi, buf, buflen)) {
     dsi->datasize = size - buflen;
     return min(dsi->datasize, buflen);
@@ -48,14 +53,15 @@ ssize_t dsi_readinit(DSI *dsi, void *buf, const size_t buflen,
 
 void dsi_readdone(DSI *dsi)
 {
-  setitimer(ITIMER_REAL, &dsi->savetimer, NULL);
-  sigprocmask(SIG_UNBLOCK, &dsi->sigblockset, NULL);
+  dsi->in_write--;
 }
 
 /* send off the data */
 ssize_t dsi_read(DSI *dsi, void *buf, const size_t buflen)
 {
-  size_t len = dsi_stream_write(dsi, buf, buflen);
+  size_t len;
+  
+  len  = dsi_stream_write(dsi, buf, buflen, 0);
 
   if (len == buflen) {
     dsi->datasize -= len;