# This file is part of ltrace.
# Copyright (C) 2013, 2014 Petr Machata, Red Hat 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 of the
# License, 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 this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
# 02110-1301 USA

set bin [ltraceCompile {} [ltraceSource c {
    #define _GNU_SOURCE
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <sys/syscall.h>   /* For SYS_xxx definitions */

    #ifndef SYS_open
    # if defined(__aarch64__)
    #  /* Linux doesn't actually implement SYS_open on AArch64, but for merely
    #   * recording the syscall, it's fine.  */
    #  define SYS_open 1024
    # else
    #  error SYS_open not available.
    # endif
    #endif

    int main(void) {
	syscall(SYS_open, "/some/path", O_RDONLY);
	write(1, "something", 10);
	mount("source", "target", "filesystemtype", 0, 0);
    }
}]]

set dir [ltraceDir]
set conf [ltraceNamedSource "$dir/syscalls.conf" {
    int open(string, int);
    long write(int, string[arg3], ulong);
    int mount(string, string, string, ulong, addr);
}]

# When given the file directly via -F, ltrace should not use it for
# formatting system calls.  The reason is that libraries are generally
# allowed to have functions with the same names as system calls
# (there's no interference between those two).  In particular,
# readdir@SYS has a different prototype from readdir@libc.  If a -F
# somelib.conf is passed, and syscalls.conf is not available, or
# doesn't list readdir, that would be taken from somelib.conf with a
# wrong prototype.

ltraceMatch1 [ltraceRun -L -S -F $conf -- $bin] {^open@SYS\("/some/path"} == 0

# On the other hand, if -F somedir/ is given, we want to accept
# syscalls.conf found there.

ltraceMatch [ltraceRun -L -S -F $dir -- $bin] {
    {{^open@SYS\("/some/path"} == 1}
    {{^write@SYS\(1, "something", 10\)} == 1}
    {{^mount@SYS\("source", "target", "filesystemtype"} == 1}
}

ltraceDone
