Hi, As written on bug-hurd IRC. Attached is the relevant code.
Thanks!
/* Copyright (C) 1994, 2002, 2015-2019 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with the GNU Hurd. If not, see <http://www.gnu.org/licenses/>. */ #include "priv.h" #include "trivfs_fs_S.h" #include <fcntl.h> #include <sys/file.h> #include "mach-printf.h" kern_return_t trivfs_S_file_lock (struct trivfs_protid *cred, mach_port_t reply, mach_msg_type_name_t reply_type, int flags) { error_t err = 0; struct flock64 lock; struct trivfs_peropen *po = cred->po; struct trivfs_node *tp = cred->po->tp; int openmodes = cred->po->openmodes; mach_port_t rendezvous = MACH_PORT_NULL; if (!cred) return EOPNOTSUPP; mach_printf("libtrivfs/file-lock.c(trivfs_S_file_lock)\n"); lock.l_whence = SEEK_SET; lock.l_start = 0; lock.l_len = 0; if (flags & LOCK_UN) lock.l_type = F_UNLCK; else if (flags & LOCK_SH) lock.l_type = F_RDLCK; else if (flags & LOCK_EX) lock.l_type = F_WRLCK; else return EINVAL; if (!po) { mach_printf("libtrivfs/file-lock.c(trivfs_S_file_lock): !po\n"); po = trivfs_make_peropen (cred, flags); if (!po) return ENOMEM; cred->po = po; } if (!tp) { mach_printf("libtrivfs/file-lock.c(trivfs_S_file_lock): !tp\n"); tp = trivfs_make_node(); if (!tp) return ENOMEM; cred->po->tp = tp; } /* XXX: Fix for flock(2) calling fcntl(2) From flock(2): A shared or exclusive lock can be placed on a file regardless of the mode in which the file was opened. */ if (cred->po->openmodes & (O_RDONLY|O_WRONLY|O_EXEC)) openmodes |= O_RDONLY|O_WRONLY; pthread_mutex_lock (&tp->lock); err = fshelp_rlock_tweak (&tp->credlock, &tp->lock, &cred->po->lock_status, openmodes, 0, 0, flags & LOCK_NB ? F_SETLK64 : F_SETLKW64, &lock, rendezvous); pthread_mutex_unlock (&tp->lock); return err; }
#include <stdio.h> #include <stdarg.h> void mach_print(const char *); #ifndef EXTERNAL_MACH_PRINT asm (".global mach_print;" " mach_print:;" " mov $0xffffffe2, %eax;" " lcall $0x7, $0x0;" " ret;"); #endif /* EXTERNAL_MACH_PRINT */ #define BUFFER_SIZE 1024 static void mach_printf(const char *format, ...) { va_list ap; char buf[BUFFER_SIZE]; va_start(ap, format); vsnprintf(buf, sizeof(buf), format, ap); mach_print(buf); va_end(ap); }
emacs libtrivfs/file-lock.c #include "mach_printf.h" Add mach_printf statements. mach_printf("libdiskfs/file-lock.c(trivfs_S_file_lock)\n"); make -C build-deb/libtrivfs find build-deb -name 'libtrivfs.so*' build-deb/libtrivfs/libtrivfs.so.0.3 build-deb/libtrivfs/libtrivfs.so build-deb/lib/libtrivfs.so.0.3 srs@hurd-2014:~/hurd.debs/0.9.git20190303-1.2/libfshelp-tests$ mkdir libs scp -p -P 5577 10.0.2.2:~/DEBs/hurd/hurd-0.9.git20190303-1.3/build-deb/libtrivfs/libtrivfs.so.0.3 libs (cd libs; ln -s libtrivfs.so.0.3 libtrivfs.so.0) export LD_LIBRARY_PATH=./libs ldd /hurd/null libtrivfs.so.0.3 => ./libs/libtrivfs.so.0.3 (0x01029000) ./test-flock /dev/null ... Installed version of libtrivfs.so is used not the one in libs. No output on console :(