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