chiark / gitweb /
[PATCH] klibc: version 1.0.3
[elogind.git] / klibc / klibc / socketcalls.pl
index cf4daf603616ff11a21fdc391c9beebbf1481b8d..fd82b2b49f2a7de3ff3ba376043dc32b4b7e2822 100644 (file)
@@ -1,17 +1,32 @@
 #!/usr/bin/perl
-($arch, $file) = @ARGV;
+
+$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) = @args;
 
 if (!open(FILE, "< $file")) {
-    print STDERR "$file: $!\n";
-    exit(1);
+    die "$file: $!\n";
 }
 
 while ( defined($line = <FILE>) ) {
     chomp $line;
-    $line =~ s/\s*\#.*$//;     # Strip comments and trailing blanks
+    $line =~ s/\s*[\#\;].*$//; # Strip comments and trailing blanks
     next unless $line;
 
-    if ( $line =~ /^\s*(.*)\s+([_a-zA-Z][_a-zA-Z0-9]+)\s*\((.*)\)$/ ) {
+    if ( $line =~ /^\s*\<\?\>\s*(.*)\s+([_a-zA-Z][_a-zA-Z0-9]+)\s*\((.*)\)$/ ) {
        $type = $1;
        $name = $2;
        $argv = $3;
@@ -26,7 +41,7 @@ while ( defined($line = <FILE>) ) {
        $nargs = $i;
 
        if ( $arch eq 'i386' ) {
-           open(OUT, "> socketcalls/${name}.S")
+           open(OUT, '>', "socketcalls/${name}.S")
                or die "$0: Cannot open socketcalls/${name}.S\n";
 
            print OUT "#include <sys/socketcalls.h>\n";
@@ -39,33 +54,31 @@ while ( defined($line = <FILE>) ) {
            print OUT "\tmovb \$SYS_\U${name}\E,%al\n";
            print OUT "\tjmp __socketcall_common\n";
            print OUT "\t.size ${name},.-${name}\n";
+           close(OUT);
        } else {
-           open(OUT, "> socketcalls/${name}.c")
+           open(OUT, '>', "socketcalls/${name}.c")
                or die "$0: Cannot open socketcalls/${name}.c\n";
-           print OUT "#include \"socketcommon.h\"\n\n";
-           
-           print OUT "#ifdef __NR_$name\n\n";
-           print OUT "_syscall", scalar(@args), "(", $type, ',', $name;
-           $i = 0;
-           foreach $arg ( @args ) {
-               print OUT ",", $arg, ",a",$i++;
-           }
-           print OUT ");\n";
-           print OUT "\n#else\n\n";
-           
+
+           print OUT "#include \"../socketcommon.h\"\n";
+           print OUT "\n";
+           print OUT "#ifndef __NR_${name}\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";
-           print OUT "\n#endif\n";
+           print OUT "    return ($type) __socketcall(SYS_\U${name}\E, args);\n";
+           print OUT "}\n\n";
+
+           print OUT "#endif\n";
+
+           close(OUT);
        }
-       close(OUT);
     } else {
-       print STDERR "$file:$.: Could not parse input\n";
-       exit(1);
+       die "$file:$.: Could not parse input\n";
     }
 }