File: README.new_tests C-code: ======= test-fcntl.c test-lockf.c test-flock.c Compile: ======== gcc -g -Wall -D_FILE_OFFSET_BITS=64 -o test-fcntl test-fcntl.c gcc -g -Wall -D_FILE_OFFSET_BITS=64 -o test-lockf test-lockf.c gcc -g -Wall -D_FILE_OFFSET_BITS=64 -o test-flock test-flock.c ./test-fcntl ./test-fcntl: Usage: ./test-fcntl file [flags] [cmd] [len] [sleep_time] file : file name/device name flags : r (O_RDONLY) | w (O_WRONLY) | rw (O_RDWR) : [rw] cmd : g (F_GETLK), s (F_SETLK), sw (F_SETLKW) : [s] lock.l_type : rl (F_RDLCK), wl (F_WRLCK), ul [F_UNLCK] : [ul] lock.l_whence : ss (SEEK_SET), sc (SEEK_CUR), se (SEEK_END) : [ss] lock.l_start : b : [b 0] lock.l_len : l : [l 0] sleep_time : st : [st 10] ./test-lockf ./test-lockf: Usage: ./test-lockf file [flags] [cmd] [len] [sleep_time] file : file name/device name flags : r (O_RDONLY) | w (O_WRONLY) | rw (O_RDWR) : [w] cmd : x (F_LOCK), xt (F_TLOCK), u (F_ULOCK), t (F_TEST) : [x] len : l : [0] sleep_time : st : [st 10] ./test-flock ./test-flock: Usage: ./test-flock file [flags] [operation] [sleep_time] file : file name/device name flags : r (O_RDONLY) | w (O_WRONLY) | rw (O_RDWR) : [w] operation : s (LOCK_SH), x (LOCK_EX), u (LOCK_UN), sn (LOCK_SH | LOCK_UN), xn (LOCK_EX | LOCK_UN) : [s] sleep_time : st : [st 10] Results: ======== New version of file_record_lock: libdiskfs/file-lock.c(diskfs_S_file_lock): Commented out libnetfs/file-lock.c(netfs_S_file_lock): Commented out libtrivfs/file-lock.c(trivfs_S_file_lock): TODO: Add+comment out libtrivfs/make-peropen.c(trivfs_S_file_lock): FIXME: po->openmodes = O_RDWR; if (openstat & (O_RDONLY|O_WRONLY|O_EXEC)) openstat |= O_RDONLY|O_WRONLY; libfshelp/rlock-tweak.c(fshelp_rlock_tweak): Removed if (lock->l_type == F_RDLCK && !(open_mode & O_READ)) return EACCES; if (lock->l_type == F_WRLCK && !(open_mode & O_WRITE)) return EACCES; Added: /* From POSIX-1003.1: A request for an exclusive lock shall fail if the file descriptor was not opened with write access. */ if ((cmd == F_SETLK64 || cmd == F_SETLKW64 ) && lock->l_type == F_WRLCK && !(open_mode & O_WRITE)) return EBADF; test-fcntl: =========== libdiskfs: ---------- touch foo ./test-fcntl foo {r,w} g {rl,wl} ./test-fcntl foo r {s,sw} wl ./test-fcntl: fcntl: Bad file descriptor ./test-fcntl foo r {s,sw} {rl,ul} T1: T2: ./test-fcntl foo {r,w} {s,sw} {rl,wl} ./test-fcntl foo {r,w} {s,sw} {rl,wl} libnetfs: --------- Not applicable on GNU/Linux? settrans -c ftp: /hurd/hostmux /hurd/ftpfs / Check: file ftp: ftp:: directory ls ftp://ftp.gnu.org/ less ftp://ftp.gnu.org/README ./test-fcntl ftp://ftp.gnu.org/README r g {rl,wl} ./test-fcntl ftp://ftp.gnu.org/README w g {rl,wl} ./test-fcntl: open: Permission denied ./test-fcntl ftp://ftp.gnu.org/README r {s,sw} {rl,ul} ./test-fcntl ftp://ftp.gnu.org/README r {s,sw} wl ./test-fcntl: fcntl: Bad file descriptor settrans -fg ftp: rm ftp: libtrivs: --------- BUG: ./test-fcntl /dev/null r s wl GNU/Linux: ./test-fcntl: fcntl: Bad file descriptor test-lockf: =========== libdiskfs: ---------- touch foo ./test-lockf foo {r,w} {x,xt,u,t} T1, T2: ./test-lockf foo {r,w} {x,xt,u,t} libnetfs: --------- libtrivfs: ---------- test-flock: =========== libdiskfs: ---------- touch foo ./test-flock foo {r,w} {s,x,u,sn,xn} GNU/Linux: ./test-flock foo r x GNU/Hurd: ./test-flock foo r {x,xn} ./test-flock: flock: Bad file descriptor T1: ./test-flock foo w s,x T2: ./test-flock foo w x (waits for the first lock) libnetfs: --------- libtrivfs: ---------- GNU/Hurd T1: ./test-flock /dev/null w s,x BUG: T2: ./test-flock /dev/null w x (does not wait for the first lock)