20
20
21
21
#define MOUNTS_FILE "/proc/mounts"
22
22
23
+ struct {
24
+ const char * header ;
25
+ const char * key ;
26
+ } sets [] = {
27
+ {"allowed_cmds" , "delegate_cmds" },
28
+ {"allowed_maps" , "delegate_maps" },
29
+ {"allowed_progs" , "delegate_progs" },
30
+ {"allowed_attachs" , "delegate_attachs" },
31
+ };
32
+
23
33
static bool has_delegate_options (const char * mnt_ops )
24
34
{
25
35
return strstr (mnt_ops , "delegate_cmds" ) ||
@@ -28,123 +38,97 @@ static bool has_delegate_options(const char *mnt_ops)
28
38
strstr (mnt_ops , "delegate_attachs" );
29
39
}
30
40
31
- static char * get_delegate_value (const char * opts , const char * key )
41
+ static char * get_delegate_value (char * opts , const char * key )
32
42
{
33
43
char * token , * rest , * ret = NULL ;
34
- char * opts_copy = strdup (opts );
35
44
36
- if (!opts_copy )
45
+ if (!opts )
37
46
return NULL ;
38
47
39
- for (token = strtok_r (opts_copy , "," , & rest ); token ;
48
+ for (token = strtok_r (opts , "," , & rest ); token ;
40
49
token = strtok_r (NULL , "," , & rest )) {
41
50
if (strncmp (token , key , strlen (key )) == 0 &&
42
51
token [strlen (key )] == '=' ) {
43
52
ret = token + strlen (key ) + 1 ;
44
53
break ;
45
54
}
46
55
}
47
- free (opts_copy );
48
56
49
57
return ret ;
50
58
}
51
59
52
- static void print_items_per_line (const char * input , int items_per_line )
60
+ static void print_items_per_line (char * input , int items_per_line )
53
61
{
54
- char * str , * rest , * strs ;
62
+ char * str , * rest ;
55
63
int cnt = 0 ;
56
64
57
65
if (!input )
58
66
return ;
59
67
60
- strs = strdup (input );
61
- if (!strs )
62
- return ;
63
-
64
- for (str = strtok_r (strs , ":" , & rest ); str ;
68
+ for (str = strtok_r (input , ":" , & rest ); str ;
65
69
str = strtok_r (NULL , ":" , & rest )) {
66
70
if (cnt % items_per_line == 0 )
67
71
printf ("\n\t " );
68
72
69
73
printf ("%-20s" , str );
70
74
cnt ++ ;
71
75
}
72
-
73
- free (strs );
74
76
}
75
77
76
78
#define ITEMS_PER_LINE 4
77
79
static void show_token_info_plain (struct mntent * mntent )
78
80
{
79
- char * value ;
81
+ size_t i ;
80
82
81
83
printf ("token_info %s" , mntent -> mnt_dir );
82
84
83
- printf ("\n\tallowed_cmds:" );
84
- value = get_delegate_value (mntent -> mnt_opts , "delegate_cmds" );
85
- print_items_per_line (value , ITEMS_PER_LINE );
86
-
87
- printf ("\n\tallowed_maps:" );
88
- value = get_delegate_value (mntent -> mnt_opts , "delegate_maps" );
89
- print_items_per_line (value , ITEMS_PER_LINE );
85
+ for (i = 0 ; i < ARRAY_SIZE (sets ); i ++ ) {
86
+ char * opts , * value ;
90
87
91
- printf ("\n\tallowed_progs:" );
92
- value = get_delegate_value (mntent -> mnt_opts , "delegate_progs" );
93
- print_items_per_line (value , ITEMS_PER_LINE );
88
+ printf ("\n\t%s:" , sets [i ].header );
89
+ opts = strdup (mntent -> mnt_opts );
90
+ value = get_delegate_value (opts , sets [i ].key );
91
+ print_items_per_line (value , ITEMS_PER_LINE );
92
+ free (opts );
93
+ }
94
94
95
- printf ("\n\tallowed_attachs:" );
96
- value = get_delegate_value (mntent -> mnt_opts , "delegate_attachs" );
97
- print_items_per_line (value , ITEMS_PER_LINE );
98
95
printf ("\n" );
99
96
}
100
97
101
- static void split_json_array_str (const char * input )
98
+ static void split_json_array_str (char * input )
102
99
{
103
- char * str , * rest , * strs ;
100
+ char * str , * rest ;
104
101
105
102
if (!input ) {
106
103
jsonw_start_array (json_wtr );
107
104
jsonw_end_array (json_wtr );
108
105
return ;
109
106
}
110
107
111
- strs = strdup (input );
112
- if (!strs )
113
- return ;
114
-
115
108
jsonw_start_array (json_wtr );
116
- for (str = strtok_r (strs , ":" , & rest ); str ;
109
+ for (str = strtok_r (input , ":" , & rest ); str ;
117
110
str = strtok_r (NULL , ":" , & rest )) {
118
111
jsonw_string (json_wtr , str );
119
112
}
120
113
jsonw_end_array (json_wtr );
121
-
122
- free (strs );
123
114
}
124
115
125
116
static void show_token_info_json (struct mntent * mntent )
126
117
{
127
- char * value ;
118
+ size_t i ;
128
119
129
120
jsonw_start_object (json_wtr );
130
-
131
121
jsonw_string_field (json_wtr , "token_info" , mntent -> mnt_dir );
132
122
133
- jsonw_name (json_wtr , "allowed_cmds" );
134
- value = get_delegate_value (mntent -> mnt_opts , "delegate_cmds" );
135
- split_json_array_str (value );
123
+ for (i = 0 ; i < ARRAY_SIZE (sets ); i ++ ) {
124
+ char * opts , * value ;
136
125
137
- jsonw_name (json_wtr , "allowed_maps" );
138
- value = get_delegate_value (mntent -> mnt_opts , "delegate_maps" );
139
- split_json_array_str (value );
140
-
141
- jsonw_name (json_wtr , "allowed_progs" );
142
- value = get_delegate_value (mntent -> mnt_opts , "delegate_progs" );
143
- split_json_array_str (value );
144
-
145
- jsonw_name (json_wtr , "allowed_attachs" );
146
- value = get_delegate_value (mntent -> mnt_opts , "delegate_attachs" );
147
- split_json_array_str (value );
126
+ jsonw_name (json_wtr , sets [i ].header );
127
+ opts = strdup (mntent -> mnt_opts );
128
+ value = get_delegate_value (opts , sets [i ].key );
129
+ split_json_array_str (value );
130
+ free (opts );
131
+ }
148
132
149
133
jsonw_end_object (json_wtr );
150
134
}
0 commit comments