summaryrefslogtreecommitdiffstats
path: root/usr/klibc/socketcalls.pl
diff options
context:
space:
mode:
Diffstat (limited to 'usr/klibc/socketcalls.pl')
-rw-r--r--usr/klibc/socketcalls.pl82
1 files changed, 82 insertions, 0 deletions
diff --git a/usr/klibc/socketcalls.pl b/usr/klibc/socketcalls.pl
new file mode 100644
index 0000000..70ded0b
--- /dev/null
+++ b/usr/klibc/socketcalls.pl
@@ -0,0 +1,82 @@
+#!/usr/bin/perl
+
+$v = $ENV{'KBUILD_VERBOSE'};
+$quiet = defined($v) ? !$v : 0;
+
+@args = ();
+for $arg ( @ARGV ) {
+ if ( $arg =~ /^-/ ) {
+ if ( $arg eq '-q' ) {
+ $quiet = 1;
+ } else {
+ die "$0: Unknown option: $arg\n";
+ }
+ } else {
+ push(@args, $arg);
+ }
+}
+($file, $arch, $outputdir) = @args;
+
+if (!open(FILE, "< $file")) {
+ die "$file: $!\n";
+}
+
+print "socketcall-objs := ";
+while ( defined($line = <FILE>) ) {
+ chomp $line;
+ $line =~ s/\s*(|\#.*|\/\/.*)$//; # Strip comments and trailing blanks
+ next unless $line;
+
+ if ( $line =~ /^\s*\<\?\>\s*(.*)\s+([_a-zA-Z][_a-zA-Z0-9]+)\s*\((.*)\)\s*\;$/ ) {
+ $type = $1;
+ $name = $2;
+ $argv = $3;
+
+ @args = split(/\s*\,\s*/, $argv);
+ @cargs = ();
+
+ $i = 0;
+ for $arg ( @args ) {
+ push(@cargs, "$arg a".$i++);
+ }
+ $nargs = $i;
+ print " \\\n\t${name}.o";
+
+ open(OUT, "> ${outputdir}/${name}.c")
+ or die "$0: Cannot open ${outputdir}/${name}.c\n";
+
+ print OUT "#include \"socketcommon.h\"\n";
+ print OUT "\n";
+ print OUT "#if _KLIBC_SYS_SOCKETCALL\n";
+ print OUT "# define DO_THIS_SOCKETCALL\n";
+ print OUT "#else\n";
+ print OUT "# if !defined(__NR_${name})";
+ if ($name eq 'accept') {
+ print OUT " && !defined(__NR_accept4)";
+ }
+ print OUT "\n# define DO_THIS_SOCKETCALL\n";
+ print OUT "# endif\n";
+ print OUT "#endif\n\n";
+
+ print OUT "#if defined(DO_THIS_SOCKETCALL) && defined(SYS_\U${name}\E)\n\n";
+
+ print OUT "extern long __socketcall(int, const unsigned long *);\n\n";
+
+ print OUT "$type ${name}(", join(', ', @cargs), ")\n";
+ print OUT "{\n";
+ print OUT " unsigned long args[$nargs];\n";
+ for ( $i = 0 ; $i < $nargs ; $i++ ) {
+ print OUT " args[$i] = (unsigned long)a$i;\n";
+ }
+ print OUT " return ($type) __socketcall(SYS_\U${name}\E, args);\n";
+ print OUT "}\n\n";
+
+ print OUT "#endif\n";
+
+ close(OUT);
+ } else {
+ die "$file:$.: Could not parse input\n";
+ }
+}
+
+print "\n";