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 :(