From: didier g. <di...@us...> - 2010-02-26 13:58:17
|
Update of /cvsroot/netatalk/netatalk/libatalk/adouble In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv23019/libatalk/adouble Modified Files: ad_lock.c Log Message: lock don't call fcntl if fd == 0, it's a symlink Index: ad_lock.c =================================================================== RCS file: /cvsroot/netatalk/netatalk/libatalk/adouble/ad_lock.c,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -d -r1.18 -r1.19 *** ad_lock.c 12 Nov 2009 06:28:40 -0000 1.18 --- ad_lock.c 26 Feb 2010 12:57:50 -0000 1.19 *************** *** 41,44 **** --- 41,56 ---- /* ----------------------- */ + static int set_lock(int fd, int cmd, struct flock *lock) + { + if (!fd) { + /* We assign fd = 0 for symlinks -> do nothing */ + if (cmd == F_GETLK) + lock->l_type = F_UNLCK; + return 0; + } + return fcntl(fd, cmd, lock); + } + + /* ----------------------- */ static int XLATE_FCNTL_LOCK(int type) { *************** *** 76,80 **** if (!ad->adf_excl) { lock->lock.l_type = F_UNLCK; ! fcntl(ad->adf_fd, F_SETLK, &lock->lock); /* unlock */ } } --- 88,92 ---- if (!ad->adf_excl) { lock->lock.l_type = F_UNLCK; ! set_lock(ad->adf_fd, F_SETLK, &lock->lock); /* unlock */ } } *************** *** 140,144 **** if (!ad->adf_excl) for (i = 0; i < ad->adf_lockcount; i++) { if (OVERLAP(off, len, lock[i].lock.l_start, lock[i].lock.l_len)) ! fcntl(fd, F_SETLK, &lock[i].lock); } } --- 152,156 ---- if (!ad->adf_excl) for (i = 0; i < ad->adf_lockcount; i++) { if (OVERLAP(off, len, lock[i].lock.l_start, lock[i].lock.l_len)) ! set_lock(fd, F_SETLK, &lock[i].lock); } } *************** *** 344,348 **** /* attempt to lock the file. */ ! if (!adf->adf_excl && fcntl(adf->adf_fd, F_SETLK, &lock) < 0) return -1; --- 356,360 ---- /* attempt to lock the file. */ ! if (!adf->adf_excl && set_lock(adf->adf_fd, F_SETLK, &lock) < 0) return -1; *************** *** 386,390 **** fcntl_lock_err: lock.l_type = F_UNLCK; ! if (!adf->adf_excl) fcntl(adf->adf_fd, F_SETLK, &lock); return -1; } --- 398,402 ---- fcntl_lock_err: lock.l_type = F_UNLCK; ! if (!adf->adf_excl) set_lock(adf->adf_fd, F_SETLK, &lock); return -1; } *************** *** 419,423 **** lock.l_type = (adf->adf_flags & O_RDWR) ?F_WRLCK : F_RDLCK; ! if (fcntl(adf->adf_fd, F_GETLK, &lock) < 0) { /* is that kind of error possible ?*/ return (errno == EACCES || errno == EAGAIN)?1:-1; --- 431,435 ---- lock.l_type = (adf->adf_flags & O_RDWR) ?F_WRLCK : F_RDLCK; ! if (set_lock(adf->adf_fd, F_GETLK, &lock) < 0) { /* is that kind of error possible ?*/ return (errno == EACCES || errno == EAGAIN)?1:-1; *************** *** 570,574 **** * here. */ if (!adf->adf_excl) { ! err = fcntl(adf->adf_fd, F_SETLK, &lock); } else { --- 582,586 ---- * here. */ if (!adf->adf_excl) { ! err = set_lock(adf->adf_fd, F_SETLK, &lock); } else { *************** *** 603,607 **** } ! err = fcntl(adf->adf_fd, F_SETLK, &lock); if (!err) adf->adf_excl = 1; --- 615,619 ---- } ! err = set_lock(adf->adf_fd, F_SETLK, &lock); if (!err) adf->adf_excl = 1; |