vserver 1.9.3
[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-2004  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  *
13  */
14
15 #include <linux/config.h>
16 #include <linux/linkage.h>
17 #include <asm/errno.h>
18
19 #include <linux/vs_base.h>
20 #include <linux/vs_context.h>
21 #include <linux/vserver/switch.h>
22
23
24 static inline int
25 vc_get_version(uint32_t id)
26 {
27         return VCI_VERSION;
28 }
29
30
31 #include <linux/vserver/legacy.h>
32 #include <linux/vserver/context.h>
33 #include <linux/vserver/network.h>
34 #include <linux/vserver/namespace.h>
35 #include <linux/vserver/sched.h>
36 #include <linux/vserver/limit.h>
37 #include <linux/vserver/inode.h>
38 #include <linux/vserver/signal.h>
39 #include <linux/vserver/dlimit.h>
40
41
42 extern asmlinkage long
43 sys_vserver(uint32_t cmd, uint32_t id, void __user *data)
44 {
45         if (!capable(CAP_CONTEXT))
46                 return -EPERM;
47
48         vxdprintk(VXD_CBIT(switch, 0),
49                 "vc: VCMD_%02d_%d[%d], %d",
50                 VC_CATEGORY(cmd), VC_COMMAND(cmd),
51                 VC_VERSION(cmd), id);
52
53         switch (cmd) {
54         case VCMD_get_version:
55                 return vc_get_version(id);
56
57 #ifdef  CONFIG_VSERVER_LEGACY
58         case VCMD_new_s_context:
59                 return vc_new_s_context(id, data);
60         case VCMD_set_ipv4root:
61                 return vc_set_ipv4root(id, data);
62 #endif
63
64         case VCMD_task_xid:
65                 return vc_task_xid(id, data);
66         case VCMD_vx_info:
67                 return vc_vx_info(id, data);
68
69         case VCMD_task_nid:
70                 return vc_task_nid(id, data);
71         case VCMD_nx_info:
72                 return vc_nx_info(id, data);
73
74         case VCMD_set_namespace:
75                 return vc_set_namespace(id, data);
76         case VCMD_cleanup_namespace:
77                 return vc_cleanup_namespace(id, data);
78         }
79
80         /* those are allowed while in setup too */
81         if (!vx_check(0, VX_ADMIN|VX_WATCH) &&
82                 !vx_flags(VXF_STATE_SETUP,0))
83                 return -EPERM;
84
85 #ifdef  CONFIG_VSERVER_LEGACY
86         switch (cmd) {
87         case VCMD_set_cflags:
88         case VCMD_set_ccaps:
89                 if (vx_check(0, VX_WATCH))
90                         return 0;
91         }
92 #endif
93
94         switch (cmd) {
95         case VCMD_get_rlimit:
96                 return vc_get_rlimit(id, data);
97         case VCMD_set_rlimit:
98                 return vc_set_rlimit(id, data);
99         case VCMD_get_rlimit_mask:
100                 return vc_get_rlimit_mask(id, data);
101
102         case VCMD_vx_get_vhi_name:
103                 return vc_get_vhi_name(id, data);
104         case VCMD_vx_set_vhi_name:
105                 return vc_set_vhi_name(id, data);
106
107         case VCMD_set_cflags:
108                 return vc_set_cflags(id, data);
109         case VCMD_get_cflags:
110                 return vc_get_cflags(id, data);
111
112         case VCMD_set_ccaps:
113                 return vc_set_ccaps(id, data);
114         case VCMD_get_ccaps:
115                 return vc_get_ccaps(id, data);
116
117         case VCMD_set_nflags:
118                 return vc_set_nflags(id, data);
119         case VCMD_get_nflags:
120                 return vc_get_nflags(id, data);
121
122         case VCMD_set_ncaps:
123                 return vc_set_ncaps(id, data);
124         case VCMD_get_ncaps:
125                 return vc_get_ncaps(id, data);
126
127         case VCMD_set_sched_v2:
128                 return vc_set_sched_v2(id, data);
129         /* this is version 3 */
130         case VCMD_set_sched:
131                 return vc_set_sched(id, data);
132
133         case VCMD_add_dlimit:
134                 return vc_add_dlimit(id, data);
135         case VCMD_rem_dlimit:
136                 return vc_rem_dlimit(id, data);
137         case VCMD_set_dlimit:
138                 return vc_set_dlimit(id, data);
139         case VCMD_get_dlimit:
140                 return vc_get_dlimit(id, data);
141         }
142
143         /* below here only with VX_ADMIN */
144         if (!vx_check(0, VX_ADMIN|VX_WATCH))
145                 return -EPERM;
146
147         switch (cmd) {
148         case VCMD_ctx_kill:
149                 return vc_ctx_kill(id, data);
150
151         case VCMD_wait_exit:
152                 return vc_wait_exit(id, data);
153
154 #ifdef  CONFIG_VSERVER_LEGACY
155         case VCMD_create_context:
156                 return vc_ctx_create(id, data);
157 #endif
158
159         case VCMD_get_iattr:
160                 return vc_get_iattr(id, data);
161         case VCMD_set_iattr:
162                 return vc_set_iattr(id, data);
163
164         case VCMD_enter_namespace:
165                 return vc_enter_namespace(id, data);
166
167         case VCMD_ctx_create:
168 #ifdef  CONFIG_VSERVER_LEGACY
169                 if (id == 1) {
170                         current->xid = 1;
171                         return 1;
172                 }
173 #endif
174                 return vc_ctx_create(id, data);
175         case VCMD_ctx_migrate:
176                 return vc_ctx_migrate(id, data);
177
178         case VCMD_net_create:
179                 return vc_net_create(id, data);
180         case VCMD_net_migrate:
181                 return vc_net_migrate(id, data);
182
183         }
184         return -ENOSYS;
185 }
186