88f164c81d77b5e2504a81ba9f10ccaaa0f0eeea
[linux-2.6.git] / kernel / vserver / switch.c
1 /*
2  *  linux/kernel/vserver/switch.c
3  *
4  *  Virtual Server: Syscall Switch
5  *
6  *  Copyright (C) 2003-2005  Herbert Pƶtzl
7  *
8  *  V0.01  syscall switch
9  *  V0.02  added signal to context
10  *  V0.03  added rlimit functions
11  *  V0.04  added iattr, task/xid functions
12  *  V0.05  added debug/history stuff
13  *
14  */
15
16 #include <linux/config.h>
17 #include <linux/linkage.h>
18 #include <linux/sched.h>
19 #include <asm/errno.h>
20
21 #include <linux/vserver/network.h>
22 #include <linux/vserver/switch.h>
23 #include <linux/vserver/debug.h>
24
25
26 static inline int
27 vc_get_version(uint32_t id)
28 {
29         return VCI_VERSION;
30 }
31
32 #include <linux/vserver/context_cmd.h>
33 #include <linux/vserver/cvirt_cmd.h>
34 #include <linux/vserver/limit_cmd.h>
35 #include <linux/vserver/network_cmd.h>
36 #include <linux/vserver/sched_cmd.h>
37 #include <linux/vserver/debug_cmd.h>
38 #include <linux/vserver/inode_cmd.h>
39
40 #include <linux/vserver/legacy.h>
41 #include <linux/vserver/namespace.h>
42 #include <linux/vserver/inode.h>
43 #include <linux/vserver/signal.h>
44 #include <linux/vserver/dlimit.h>
45
46
47 extern asmlinkage long
48 sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
49 {
50         vxdprintk(VXD_CBIT(switch, 0),
51                 "vc: VCMD_%02d_%d[%d], %d",
52                 VC_CATEGORY(cmd), VC_COMMAND(cmd),
53                 VC_VERSION(cmd), id);
54
55 #ifdef  CONFIG_VSERVER_LEGACY
56         if (!capable(CAP_CONTEXT) &&
57                 /* dirty hack for capremove */
58                 !(cmd==VCMD_new_s_context && id==-2))
59                 return -EPERM;
60 #else
61         if (!capable(CAP_CONTEXT))
62                 return -EPERM;
63 #endif
64
65         switch (cmd) {
66         case VCMD_get_version:
67                 return vc_get_version(id);
68
69         case VCMD_dump_history:
70 #ifdef  CONFIG_VSERVER_HISTORY
71                 return vc_dump_history(id);
72 #else
73                 return -ENOSYS;
74 #endif
75
76 #ifdef  CONFIG_VSERVER_LEGACY
77         case VCMD_new_s_context:
78                 return vc_new_s_context(id, data);
79 #endif
80 #ifdef  CONFIG_VSERVER_LEGACYNET
81         case VCMD_set_ipv4root:
82                 return vc_set_ipv4root(id, data);
83 #endif
84
85         case VCMD_task_xid:
86                 return vc_task_xid(id, data);
87         case VCMD_vx_info:
88                 return vc_vx_info(id, data);
89
90         case VCMD_task_nid:
91                 return vc_task_nid(id, data);
92         case VCMD_nx_info:
93                 return vc_nx_info(id, data);
94
95         case VCMD_set_namespace:
96                 return vc_set_namespace(id, data);
97         case VCMD_cleanup_namespace:
98                 return vc_cleanup_namespace(id, data);
99         }
100
101         /* those are allowed while in setup too */
102         if (!vx_check(0, VX_ADMIN|VX_WATCH) &&
103                 !vx_flags(VXF_STATE_SETUP,0))
104                 return -EPERM;
105
106 #ifdef  CONFIG_VSERVER_LEGACY
107         switch (cmd) {
108         case VCMD_set_cflags:
109         case VCMD_set_ccaps:
110                 if (vx_check(0, VX_WATCH))
111                         return 0;
112         }
113 #endif
114
115         switch (cmd) {
116         case VCMD_get_rlimit:
117                 return vc_get_rlimit(id, data);
118         case VCMD_set_rlimit:
119                 return vc_set_rlimit(id, data);
120         case VCMD_get_rlimit_mask:
121                 return vc_get_rlimit_mask(id, data);
122
123         case VCMD_vx_get_vhi_name:
124                 return vc_get_vhi_name(id, data);
125         case VCMD_vx_set_vhi_name:
126                 return vc_set_vhi_name(id, data);
127
128         case VCMD_set_cflags:
129                 return vc_set_cflags(id, data);
130         case VCMD_get_cflags:
131                 return vc_get_cflags(id, data);
132
133         case VCMD_set_ccaps:
134                 return vc_set_ccaps(id, data);
135         case VCMD_get_ccaps:
136                 return vc_get_ccaps(id, data);
137
138         case VCMD_set_nflags:
139                 return vc_set_nflags(id, data);
140         case VCMD_get_nflags:
141                 return vc_get_nflags(id, data);
142
143         case VCMD_set_ncaps:
144                 return vc_set_ncaps(id, data);
145         case VCMD_get_ncaps:
146                 return vc_get_ncaps(id, data);
147
148         case VCMD_set_sched_v2:
149                 return vc_set_sched_v2(id, data);
150         /* this is version 3 */
151         case VCMD_set_sched:
152                 return vc_set_sched(id, data);
153
154         case VCMD_add_dlimit:
155                 return vc_add_dlimit(id, data);
156         case VCMD_rem_dlimit:
157                 return vc_rem_dlimit(id, data);
158         case VCMD_set_dlimit:
159                 return vc_set_dlimit(id, data);
160         case VCMD_get_dlimit:
161                 return vc_get_dlimit(id, data);
162         }
163
164         /* below here only with VX_ADMIN */
165         if (!vx_check(0, VX_ADMIN|VX_WATCH))
166                 return -EPERM;
167
168         switch (cmd) {
169         case VCMD_ctx_kill:
170                 return vc_ctx_kill(id, data);
171
172         case VCMD_wait_exit:
173                 return vc_wait_exit(id, data);
174
175         case VCMD_create_context:
176 #ifdef  CONFIG_VSERVER_LEGACY
177                 return vc_ctx_create(id, data);
178 #else
179                 return -ENOSYS;
180 #endif
181
182         case VCMD_get_iattr:
183                 return vc_get_iattr(id, data);
184         case VCMD_set_iattr:
185                 return vc_set_iattr(id, data);
186
187         case VCMD_enter_namespace:
188                 return vc_enter_namespace(id, data);
189
190         case VCMD_ctx_create:
191 #ifdef  CONFIG_VSERVER_LEGACY
192                 if (id == 1) {
193                         current->xid = 1;
194                         return 1;
195                 }
196 #endif
197                 return vc_ctx_create(id, data);
198         case VCMD_ctx_migrate:
199                 return vc_ctx_migrate(id, data);
200
201         case VCMD_net_create:
202                 return vc_net_create(id, data);
203         case VCMD_net_migrate:
204                 return vc_net_migrate(id, data);
205
206         }
207         return -ENOSYS;
208 }
209