chiark / gitweb /
[PATCH] added vsyslog support to klibc.
[elogind.git] / klibc / klibc / socketcalls.pl
1 #!/usr/bin/perl
2 ($arch, $file) = @ARGV;
3
4 if (!open(FILE, "< $file")) {
5     print STDERR "$file: $!\n";
6     exit(1);
7 }
8
9 while ( defined($line = <FILE>) ) {
10     chomp $line;
11     $line =~ s/\s*\#.*$//;      # Strip comments and trailing blanks
12     next unless $line;
13
14     if ( $line =~ /^\s*(.*)\s+([_a-zA-Z][_a-zA-Z0-9]+)\s*\((.*)\)$/ ) {
15         $type = $1;
16         $name = $2;
17         $argv = $3;
18
19         @args = split(/\s*\,\s*/, $argv);
20         @cargs = ();
21
22         $i = 0;
23         for $arg ( @args ) {
24             push(@cargs, "$arg a".$i++);
25         }
26         $nargs = $i;
27
28         if ( $arch eq 'i386' ) {
29             open(OUT, "> socketcalls/${name}.S")
30                 or die "$0: Cannot open socketcalls/${name}.S\n";
31
32             print OUT "#include <sys/socketcalls.h>\n";
33             print OUT "\n";
34             print OUT "\t.text\n";
35             print OUT "\t.align 4\n";
36             print OUT "\t.globl ${name}\n";
37             print OUT "\t.type ${name},\@function\n";
38             print OUT "${name}:\n";
39             print OUT "\tmovb \$SYS_\U${name}\E,%al\n";
40             print OUT "\tjmp __socketcall_common\n";
41             print OUT "\t.size ${name},.-${name}\n";
42         } else {
43             open(OUT, "> socketcalls/${name}.c")
44                 or die "$0: Cannot open socketcalls/${name}.c\n";
45             print OUT "#include \"socketcommon.h\"\n\n";
46             
47             print OUT "#ifdef __NR_$name\n\n";
48             print OUT "_syscall", scalar(@args), "(", $type, ',', $name;
49             $i = 0;
50             foreach $arg ( @args ) {
51                 print OUT ",", $arg, ",a",$i++;
52             }
53             print OUT ");\n";
54             print OUT "\n#else\n\n";
55             
56             print OUT "$type $name (", join(', ', @cargs), ")\n";
57             print OUT "{\n";
58             print OUT "    unsigned long args[$nargs];\n";
59             for ( $i = 0 ; $i < $nargs ; $i++ ) {
60                 print OUT "    args[$i] = (unsigned long)a$i;\n";
61             }
62             print OUT "    return ($type) socketcall(SYS_\U${name}\E, args);\n";
63             print OUT "}\n";
64             print OUT "\n#endif\n";
65         }
66         close(OUT);
67     } else {
68         print STDERR "$file:$.: Could not parse input\n";
69         exit(1);
70     }
71 }