aboutsummaryrefslogtreecommitdiffstats
path: root/connection.c
diff options
context:
space:
mode:
authorWayne Davison <wayned@samba.org>2007-09-18 14:09:38 +0000
committerWayne Davison <wayned@samba.org>2007-09-18 14:09:38 +0000
commit21cafc50cc4d10b42f6e81963171ab0cdacec2f6 (patch)
tree5842f18aaed24f9afae67d1fce48bb4f776283e8 /connection.c
parentde80679b6751427a875bc42af6d05f03c007d56a (diff)
downloadandroid_external_rsync-21cafc50cc4d10b42f6e81963171ab0cdacec2f6.tar.gz
android_external_rsync-21cafc50cc4d10b42f6e81963171ab0cdacec2f6.tar.bz2
android_external_rsync-21cafc50cc4d10b42f6e81963171ab0cdacec2f6.zip
Some minor improvements in claim_connection().
Diffstat (limited to 'connection.c')
-rw-r--r--connection.c31
1 files changed, 14 insertions, 17 deletions
diff --git a/connection.c b/connection.c
index 2bb0ae2e..beb1dec6 100644
--- a/connection.c
+++ b/connection.c
@@ -19,30 +19,27 @@
#include "rsync.h"
-/****************************************************************************
-simple routine to do connection counting
-****************************************************************************/
-int claim_connection(char *fname,int max_connections)
+/* A simple routine to do connection counting. This returns 1 on success
+ * and 0 on failure, with errno also being set if the open() failed (errno
+ * will be 0 if the lock request failed). */
+int claim_connection(char *fname, int max_connections)
{
int fd, i;
- if (max_connections <= 0)
- return 1;
+ if (max_connections > 0) {
+ if ((fd = open(fname, O_RDWR|O_CREAT, 0600)) < 0)
+ return 0;
- fd = open(fname,O_RDWR|O_CREAT, 0600);
+ /* Find a free spot. */
+ for (i = 0; i < max_connections; i++) {
+ if (lock_range(fd, i*4, 4))
+ return 1;
+ }
- if (fd == -1) {
- return 0;
+ close(fd);
}
- /* find a free spot */
- for (i=0;i<max_connections;i++) {
- if (lock_range(fd, i*4, 4)) return 1;
- }
-
- /* only interested in open failures */
+ /* A lock failure needs to return an errno of 0. */
errno = 0;
-
- close(fd);
return 0;
}