X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=klibc%2Fklibc%2Fsocketcalls.pl;h=fd82b2b49f2a7de3ff3ba376043dc32b4b7e2822;hb=cb948532ff3cb7edf1d2eead7a5cce9e8a1a7a97;hp=cf4daf603616ff11a21fdc391c9beebbf1481b8d;hpb=a41a0e28c2ba0abf99b5e7ea17645ae0e4f05758;p=elogind.git diff --git a/klibc/klibc/socketcalls.pl b/klibc/klibc/socketcalls.pl index cf4daf603..fd82b2b49 100644 --- a/klibc/klibc/socketcalls.pl +++ b/klibc/klibc/socketcalls.pl @@ -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 = ) ) { 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 = ) ) { $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 \n"; @@ -39,33 +54,31 @@ while ( defined($line = ) ) { 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"; } }