Unshare netns for VINI.
[util-vserver-pl.git] / src / namespaces.c
1 #ifdef HAVE_CONFIG_H
2 #  include <config.h>
3 #endif
4
5 #include "vserver.h"
6 #include <string.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <stdint.h>
10 #include <sys/types.h>
11 #include <pwd.h>
12
13 #ifdef CLONE_NEWNET
14 #  define DECLARE_NS(X,Y) { #X, CLONE_NEW##X }
15 #else
16 #  warning CLONE_NEWNET not defined, using memorized value
17 #  define DECLARE_NS(X,Y) { #X, Y }
18 #endif
19
20 #define     SPACE_DIR       "pl_spaces"
21
22 static struct {
23     const char * const          id;
24     unsigned char               bit;
25 } const NS2BIT[] = {
26     DECLARE_NS(NET,             32)
27
28     /* All entries between FIRST_NS and the last defined namespace
29      * must be filled in */
30     #define     FIRST_NS        32
31 };
32
33 int
34 text2ns(const char *str)
35 {
36   size_t        i;
37   for (i=0; i<sizeof(NS2BIT)/sizeof(NS2BIT[0]); ++i)
38     if (strcmp(NS2BIT[i].id, str)==0) return NS2BIT[i].bit;
39
40   return -1;
41 }
42
43 const char *
44 ns2text(unsigned int bit)
45 {
46   if ((size_t)bit>=sizeof(NS2BIT)/sizeof(NS2BIT[0])) return 0;
47   return NS2BIT[bit - FIRST_NS].id;
48 }
49
50 #define VSERVERCONF "/etc/vservers/"
51
52 uint32_t
53 get_space_flag(xid_t xid) {
54     char *ctx_space_dir, *space_name;
55     struct passwd *slice_user;
56     FILE *fp_in;
57     unsigned int bit;
58
59     slice_user = get_pwuid(xid);
60
61     if (!slice_user)
62         goto out_err1;
63
64     ctx_space_dir=(char *) malloc(sizeof(VSERVERCONF "/" SPACE_DIR "Z")+strlen(slice_user->pw_name));
65     if (!ctx_space_dir)
66         goto out_err1;
67
68     sprintf(ctx_space_dir,VSERVERCONF "%s/" SPACE_DIR, slice_user->pw_name);
69
70     fp_in = fopen(ctx_space_dir,"r");
71
72     if (!fp_in)
73         goto out_dontcare;
74
75     space_name=(char *) malloc(sizeof("GOBBLEDYGOOKZ"));
76
77     if (!space_name) {
78         goto out_err2;
79     }
80
81     fgets(space_name,sizeof("GOBBLEDYGOOKZ"),fp_in);
82
83     bit = text2ns(space_name);
84
85     free(space_name);
86     free(ctx_space_dir);
87     close(fp_in);
88
89     return ((1<<bit)>>1);
90
91 out_err2:
92     free(ctx_space_dir);
93     close(fp_in);
94
95 out_err1:
96     return 0;
97
98 out_dontcare:
99     free(ctx_space_dir);
100     return 0;
101
102 }