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