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

Reply via email to