#!/usr/bin/perl while () { /^(\S+)\s+(\S+)\s+\((.*)\)$/ or (/^\s*$/ and next) or die "$_: parse error\n"; my ($ret, $name, $args) = ($1, $2, $3); my @args = split /\s*,\s*/, $args; # $ret MUST be int, or something that is < 0 on error my @cargs = map { $_ eq "path" ? "const char *" : $_ } @args; my $cargs = join ", ", @cargs; print "\nstatic $ret (*orig_$name)($cargs);\n"; print "\nextern \"C\" $ret ($name) (", (join ", ", map "$cargs[$_] a$_", 0..$#args), ")\n"; print "{\n"; for (0..$#args) { if ($args[$_] eq "path") { #print " const char *orig_a$_ = a$_;\n"; print " if (toolong (a$_))\n";# print " a$_ = shorten (a$_);\n"; print "\n"; } } if ($name eq "readlink") { print " MAGIC_READLINK (a0, a1, a2);\n\n"; } elsif ($name eq "readlinkat") { print " MAGIC_READLINK (a1, a2, a3);\n\n"; } print " if (!orig_$name)\n"; print " orig_$name = ($ret (*)($cargs))dlsym (RTLD_NEXT, \"$name\");\n"; print "\n"; print " return orig_$name (", (join ", ", map "a$_", 0..$#args), ");\n"; print "}\n"; } __END__ int open (path, int, mode_t) int creat (path, mode_t) int openat (int, path, int, mode_t) int open64 (path, int, mode_t) int openat64 (int, path, int, mode_t) int unlink (path) int unlinkat (int, path, int) int chdir (path) int mkdir (path, mode_t) int mkdirat (int, path, mode_t) int rmdir (path) ssize_t readlink (path, char *, size_t) ssize_t readlinkat (int, path, char *, size_t) int mknod (path, mode_t, dev_t) int mknodat (int, path, mode_t, dev_t) int stat (path, struct stat *) int lstat (path, struct stat *) int fstatat (int, path, struct stat *, int) int stat64 (path, struct stat64 *) int lstat64 (path, struct stat64 *) int fstatat64 (int, path, struct stat64 *, int) int statx (int, path, int, unsigned int, struct statx *) int rename (path, path) int renameat (int, path, int, path) int renameat2 (int, path, int, path, unsigned int) int access (path, int) int faccessat (int, path, int, int) int chmod (path, mode_t) int fchmodat (int, path, mode_t, int) int chown (path, uid_t, gid_t) int lchown (path, uid_t, gid_t) int fchownat (int, path, uid_t, gid_t, int) int utime (path, const struct utimebuf *) int utimes (path, const struct timeval *) int futimesat (int, path, const struct timeval *) int utimensat (int, path, const struct timespec *, int) int symlink (path, path) int symlinkat (path, int, path) int link (path, path) int linkat (int, path, int, path, int) int truncate (path, off_t) int truncate64 (path, off64_t)