0f6aeb589fe8118f0455876f38b9810bed40d511
[linux-2.6.git] / enter_admin.c
1 /* enter_admin.c        Vsys script to switch a vserver into admin mode in which it has access 
2  *                      to the Internet. Install in /vsys and invoke as echo $$ > /vsys/enter_admin.in
3  *                      from within the slice.
4  *                      3/21/2008       Sapan Bhatia
5  */
6
7 #include <sys/syscall.h>
8 #include <stdio.h>
9 #include <stdlib.h>
10 #include <errno.h>
11 #include <string.h>
12
13 #ifndef CLONE_NEWNET
14 #define CLONE_NEWNET    0x40000000      /* New network namespace (lo, device, names sockets, etc) */
15 #endif
16
17 #define         __NR_set_space          327
18 #define         PATHLEN                 1024
19
20 int set_space(int pid, int id, int toggle, unsigned long unshare_flags) { 
21                 return syscall(__NR_set_space, pid, id, toggle, unshare_flags);
22 }
23
24 int get_slice_xid(char *slice_name) {
25         char slicepath[PATHLEN];
26         FILE *fp;
27         int xid;
28         snprintf(slicepath, sizeof(slicepath), "/etc/vservers/%s/context");
29
30         if ((fp = fopen(slicepath, "r")) == NULL) {
31                 printf("Could not open %s\n", slicepath);       
32                 return -1;
33         }
34
35         if (fscanf(fp, "%d", &xid)==0) {
36                 printf("Could not read ctx file\n");
37                 return -1;
38         }
39
40         fclose (fp);
41         return xid;
42 }
43
44 int verify_ownership(int pid, int arg_xid) {
45         char procpath[PATHLEN];
46         FILE *fp;
47         int xid;
48         snprintf(procpath, sizeof(procpath), "/proc/%d/vinfo");
49
50         if ((fp = fopen(procpath, "r")) == NULL) {
51                 printf("Could not open %s\n", procpath);        
52                 return -1;
53         }
54
55         if (fscanf(fp, "XID: %d", &xid)==0) {
56                 printf("Could not read ctx file\n");
57                 return -1;
58         }
59
60         fclose (fp);
61         return (arg_xid==xid);
62
63 }
64
65 int main(int argc, char *argv[]) {
66         int xid;
67         int pid;
68
69         if (argc < 1) {
70                 printf("Slice name missing. Was I invoked by vsys?\n");
71                 exit(1);
72         }
73
74         scanf("%d",&pid);
75
76         if ((xid = get_slice_xid(argv[1]))==-1) {
77                 printf("Could not get xid for slice %s\n",argv[1]);
78                 exit(1);
79         }
80
81         if (!verify_ownership(pid, xid)) {
82                 printf("Does xid %d really own %d?\n",xid,pid);
83                 exit(1);
84         }
85
86         set_space(pid, xid, 0, CLONE_NEWNET);
87 }