perl 5.0 alpha 3
[perl.git] / do / syscall
1 int
2 do_syscall(arglast)
3 int *arglast;
4 {
5     register STR **st = stack->ary_array;
6     register int sp = arglast[1];
7     register int items = arglast[2] - sp;
8 #ifdef atarist
9     unsigned long arg[14]; /* yes, we really need that many ! */
10 #else
11     unsigned long arg[8];
12 #endif
13     register int i = 0;
14     int retval = -1;
15
16 #ifdef HAS_SYSCALL
17 #ifdef TAINT
18     for (st += ++sp; items--; st++)
19         tainted |= (*st)->str_tainted;
20     st = stack->ary_array;
21     sp = arglast[1];
22     items = arglast[2] - sp;
23 #endif
24     TAINT_PROPER("syscall");
25     /* This probably won't work on machines where sizeof(long) != sizeof(int)
26      * or where sizeof(long) != sizeof(char*).  But such machines will
27      * not likely have syscall implemented either, so who cares?
28      */
29     while (items--) {
30         if (st[++sp]->str_nok || !i)
31             arg[i++] = (unsigned long)str_gnum(st[sp]);
32 #ifndef lint
33         else
34             arg[i++] = (unsigned long)st[sp]->str_ptr;
35 #endif /* lint */
36     }
37     sp = arglast[1];
38     items = arglast[2] - sp;
39     switch (items) {
40     case 0:
41         fatal("Too few args to syscall");
42     case 1:
43         retval = syscall(arg[0]);
44         break;
45     case 2:
46         retval = syscall(arg[0],arg[1]);
47         break;
48     case 3:
49         retval = syscall(arg[0],arg[1],arg[2]);
50         break;
51     case 4:
52         retval = syscall(arg[0],arg[1],arg[2],arg[3]);
53         break;
54     case 5:
55         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4]);
56         break;
57     case 6:
58         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5]);
59         break;
60     case 7:
61         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6]);
62         break;
63     case 8:
64         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
65           arg[7]);
66         break;
67 #ifdef atarist
68     case 9:
69         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
70           arg[7], arg[8]);
71         break;
72     case 10:
73         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
74           arg[7], arg[8], arg[9]);
75         break;
76     case 11:
77         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
78           arg[7], arg[8], arg[9], arg[10]);
79         break;
80     case 12:
81         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
82           arg[7], arg[8], arg[9], arg[10], arg[11]);
83         break;
84     case 13:
85         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
86           arg[7], arg[8], arg[9], arg[10], arg[11], arg[12]);
87         break;
88     case 14:
89         retval = syscall(arg[0],arg[1],arg[2],arg[3],arg[4],arg[5],arg[6],
90           arg[7], arg[8], arg[9], arg[10], arg[11], arg[12], arg[13]);
91         break;
92 #endif /* atarist */
93     }
94     return retval;
95 #else
96     fatal("syscall() unimplemented");
97 #endif
98 }
99