-int yield_connection(char *fname, int max_connections)
-{
- int fd, i;
- pid_t mypid=getpid(), pid=0;
-
- if (max_connections <= 0)
- return 1;
-
- fd = open(fname,O_RDWR);
- if (fd == -1) {
- rprintf(FERROR,"Couldn't open lock file %s (%s)\n",fname,strerror(errno));
- return 0;
- }
-
- if (!lock_file(fd)) {
- rprintf(FERROR,"failed to lock %s\n", fname);
- close(fd);
- return 0;
- }
-
- /* find the right spot */
- for (i=0;i<max_connections;i++) {
- if (read(fd, &pid, sizeof(pid)) != sizeof(pid)) {
- unlock_file(fd);
- close(fd);
- return 0;
- }
- if (pid == mypid) break;
- }
-
- if (i == max_connections) {
- rprintf(FERROR,"Entry not found in lock file %s\n",fname);
- unlock_file(fd);
- close(fd);
- return 0;
- }
-
- pid = 0;
-
- /* remove our mark */
- if (lseek(fd,i*sizeof(pid),SEEK_SET) != i*sizeof(pid) ||
- write(fd, &pid,sizeof(pid)) != sizeof(pid)) {
- rprintf(FERROR,"Couldn't update lock file %s (%s)\n",fname,strerror(errno));
- unlock_file(fd);
- close(fd);
- return 0;
- }
-
- unlock_file(fd);
- close(fd);
- return 1;
-}
-