]> arthur.barton.de Git - netatalk.git/commitdiff
Merge from branch-2-1
authorFrank Lahm <franklahm@googlemail.com>
Tue, 16 Nov 2010 14:25:00 +0000 (15:25 +0100)
committerFrank Lahm <franklahm@googlemail.com>
Tue, 16 Nov 2010 14:25:00 +0000 (15:25 +0100)
1  2 
libatalk/cnid/dbd/cnid_dbd.c
libatalk/util/socket.c

index 01c984062543317ea6bfb65f1f3c2206af05fe47,dadc4e127a57bf30d5351d28c865135cc7bda21c..60f16f9185efcaf4a1a7d4452b63691c9ac6885c
@@@ -1,5 -1,6 +1,6 @@@
  /*
   * Copyright (C) Joerg Lenneis 2003
+  * Copyright (C) Frank Lahm 2010
   * All Rights Reserved.  See COPYING.
   */
  
@@@ -47,7 -48,8 +48,8 @@@
  #endif /* ! SOL_TCP */
  
  /* Wait MAX_DELAY seconds before a request to the CNID server times out */
- #define MAX_DELAY 10
+ #define MAX_DELAY 20
+ #define ONE_DELAY 5
  
  static void RQST_RESET(struct cnid_dbd_rqst  *r)
  {
@@@ -154,7 -156,7 +156,7 @@@ static int tsock_getfd(const char *host
                              strerror(errno));
                      }
                      close(sock);
 -                    sock=-1;
 +                    sock = -1;
                      continue;
                  }
              } else {
@@@ -205,7 -207,7 +207,7 @@@ static int write_vec(int fd, struct iov
              continue;
  
          if ((! slept) && len == -1 && errno == EAGAIN) {
-             sleepsecs = 5;
+             sleepsecs = 2;
              while ((sleepsecs = sleep(sleepsecs)));
              slept = 1;
              continue;
              break;
  
          if (len == -1)
-             LOG(log_error, logtype_cnid, "write_vec: short write: %s", strerror(errno));
+             LOG(log_error, logtype_cnid, "write_vec: %s", strerror(errno));
          else
              LOG(log_error, logtype_cnid, "write_vec: short write: %d", len);
          return len;
@@@ -310,60 -312,6 +312,6 @@@ static int dbd_reply_stamp(struct cnid_
      return 0;
  }
  
- /*!
-  * Non-blocking read "length" bytes within 1 second using select
-  *
-  * @param socket   (r)  must be nonblocking !
-  * @param data     (rw) buffer for the read data
-  * @param lenght   (r)  how many bytes to read
-  *
-  * @returns number of bytes actually read or -1 on fatal error
-  */
- static ssize_t read_packet(int socket, void *data, const size_t length)
- {
-     size_t stored;
-     ssize_t len;
-     struct timeval tv;
-     fd_set rfds;
-     int ret;
-     stored = 0;
-     while (stored < length) {
-         len = readt(socket, (u_int8_t *) data + stored, length - stored, 0, 5);
-         if (len == -1) {
-             switch (errno) {
-             case EINTR:
-                 continue;
-             case EAGAIN:
-                 tv.tv_usec = 0;
-                 tv.tv_sec  = 1;
-                 FD_ZERO(&rfds);
-                 FD_SET(socket, &rfds);
-                 while ((ret = select(socket + 1, &rfds, NULL, NULL, &tv)) < 1) {
-                     switch (ret) {
-                     case 0:
-                         LOG(log_warning, logtype_cnid, "select timeout 1s");
-                         return stored;
-                     default: /* -1 */
-                         LOG(log_error, logtype_cnid, "select: %s", strerror(errno));
-                         return -1;
-                     }
-                 }
-                 continue;
-             }
-             LOG(log_error, logtype_cnid, "read: %s", strerror(errno));
-             return -1;
-         }
-         else if (len > 0)
-             stored += len;
-         else
-             break;
-     }
-     return stored;
- }
  /* ---------------------
   * send a request and get reply
   * assume send is non blocking
@@@ -381,11 -329,11 +329,11 @@@ static int dbd_rpc(CNID_private *db, st
      len = rply->namelen;
      nametmp = rply->name;
  
-     ret = read_packet(db->fd, rply, sizeof(struct cnid_dbd_rply));
+     ret = readt(db->fd, rply, sizeof(struct cnid_dbd_rply), 0, ONE_DELAY);
  
      if (ret != sizeof(struct cnid_dbd_rply)) {
          LOG(log_error, logtype_cnid, "dbd_rpc: Error reading header from fd (db_dir %s): %s",
-             db->db_dir, ret == -1?strerror(errno):"closed");
+             db->db_dir, ret == -1 ? strerror(errno) : "closed");
          rply->name = nametmp;
          return -1;
      }
              db->db_dir, rply->name, rply->namelen, len);
          return -1;
      }
-     if (rply->namelen && (ret = read_packet(db->fd, rply->name, rply->namelen)) != (ssize_t)rply->namelen) {
+     if (rply->namelen && (ret = readt(db->fd, rply->name, rply->namelen, 0, ONE_DELAY)) != (ssize_t)rply->namelen) {
          LOG(log_error, logtype_cnid, "dbd_rpc: Error reading name from fd (db_dir %s): %s",
              db->db_dir, ret == -1?strerror(errno):"closed");
          return -1;
diff --combined libatalk/util/socket.c
index 06ee10e580d909de12a87854e5f0f12dd7a92219,96472baec78302486f0c72b0d14e807e2a4b418d..9afaa3ebe40352163f4c051f71fa8af64e82c972
@@@ -1,4 -1,5 +1,4 @@@
  /*
 -   $Id: socket.c,v 1.6 2010-01-05 19:05:52 franklahm Exp $
     Copyright (c) 2009 Frank Lahm <franklahm@gmail.com>
  
     This program is free software; you can redistribute it and/or modify
@@@ -157,6 -158,9 +157,9 @@@ exit
              return -1;
      }
  
+     if (len == -1 && stored == 0)
+         /* last read or select got an error and we haven't got yet anything => return -1*/
+         return -1;
      return stored;
  }