1 |
#!/usr/bin/perl |
2 |
|
3 |
while (<DATA>) { |
4 |
/^(\S+)\s+(\S+)\s+\((.*)\)$/ |
5 |
or (/^\s*$/ and next) |
6 |
or die "$_: parse error\n"; |
7 |
|
8 |
my ($ret, $name, $args) = ($1, $2, $3); |
9 |
my @args = split /\s*,\s*/, $args; |
10 |
|
11 |
# $ret MUST be int, or something that is < 0 on error |
12 |
|
13 |
my @cargs = map { $_ eq "path" ? "const char *" : $_ } @args; |
14 |
my $cargs = join ", ", @cargs; |
15 |
|
16 |
print "\nstatic $ret (*orig_$name)($cargs);\n"; |
17 |
print "\nextern \"C\" $ret ($name) (", (join ", ", map "$cargs[$_] a$_", 0..$#args), ")\n"; |
18 |
print "{\n"; |
19 |
for (0..$#args) { |
20 |
if ($args[$_] eq "path") { |
21 |
print " if (toolong (a$_))\n";# |
22 |
print " a$_ = shorten (a$_);\n"; |
23 |
print "\n"; |
24 |
} |
25 |
} |
26 |
print " if (!orig_$name)\n"; |
27 |
print " orig_$name = ($ret (*)($cargs))dlsym (RTLD_NEXT, \"$name\");\n"; |
28 |
print "\n"; |
29 |
print " return orig_$name (", (join ", ", map "a$_", 0..$#args), ");\n"; |
30 |
print "}\n"; |
31 |
} |
32 |
|
33 |
__END__ |
34 |
int open (path, int, mode_t) |
35 |
int creat (path, mode_t) |
36 |
int openat (int, path, int, mode_t) |
37 |
int open64 (path, int, mode_t) |
38 |
int creat64 (path, mode_t) |
39 |
int openat64 (int, path, int, mode_t) |
40 |
int unlink (path) |
41 |
int unlinkat (int, path, int) |
42 |
int mkdir (path, mode_t) |
43 |
int mkdirat (int, path, mode_t) |
44 |
ssize_t readlink (path, char *, size_t) |
45 |
ssize_t readlinkat (int, path, char *, size_t) |
46 |
int stat (path, struct stat *) |
47 |
int lstat (path, struct stat *) |
48 |
int fstatat (int, path, struct stat *, int) |
49 |
int stat64 (path, struct stat64 *) |
50 |
int lstat64 (path, struct stat64 *) |
51 |
int fstatat64 (int, path, struct stat64 *, int) |
52 |
int rename (path, path) |
53 |
int renameat (int, path, int, path) |
54 |
int renameat2 (int, path, int, path, unsigned int) |