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