connection.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. /*
  2. * Support the max connections option.
  3. *
  4. * Copyright (C) 1998 Andrew Tridgell
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program; if not, visit the http://fsf.org website.
  18. */
  19. #include "rsync.h"
  20. /* A simple routine to do connection counting. This returns 1 on success
  21. * and 0 on failure, with errno also being set if the open() failed (errno
  22. * will be 0 if the lock request failed). */
  23. int claim_connection(char *fname, int max_connections)
  24. {
  25. int fd, i;
  26. if (max_connections == 0)
  27. return 1;
  28. if ((fd = open(fname, O_RDWR|O_CREAT, 0600)) < 0)
  29. return 0;
  30. /* Find a free spot. */
  31. for (i = 0; i < max_connections; i++) {
  32. if (lock_range(fd, i*4, 4))
  33. return 1;
  34. }
  35. close(fd);
  36. /* A lock failure needs to return an errno of 0. */
  37. errno = 0;
  38. return 0;
  39. }