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,93 @@ 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
+ char * opts , * value ;
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 );
90
-
91
- printf ("\n\tallowed_progs:" );
92
- value = get_delegate_value (mntent -> mnt_opts , "delegate_progs" );
93
- print_items_per_line (value , ITEMS_PER_LINE );
85
+ for (size_t i = 0 ; i < ARRAY_SIZE (sets ); i ++ ) {
86
+ printf ("\n\t%s:" , sets [i ].header );
87
+ opts = strdup (mntent -> mnt_opts );
88
+ value = get_delegate_value (opts , sets [i ].key );
89
+ print_items_per_line (value , ITEMS_PER_LINE );
90
+ free (opts );
91
+ }
94
92
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
93
printf ("\n" );
99
94
}
100
95
101
- static void split_json_array_str (const char * input )
96
+ static void split_json_array_str (char * input )
102
97
{
103
- char * str , * rest , * strs ;
98
+ char * str , * rest ;
104
99
105
100
if (!input ) {
106
101
jsonw_start_array (json_wtr );
107
102
jsonw_end_array (json_wtr );
108
103
return ;
109
104
}
110
105
111
- strs = strdup (input );
112
- if (!strs )
113
- return ;
114
-
115
106
jsonw_start_array (json_wtr );
116
- for (str = strtok_r (strs , ":" , & rest ); str ;
107
+ for (str = strtok_r (input , ":" , & rest ); str ;
117
108
str = strtok_r (NULL , ":" , & rest )) {
118
109
jsonw_string (json_wtr , str );
119
110
}
120
111
jsonw_end_array (json_wtr );
121
-
122
- free (strs );
123
112
}
124
113
125
114
static void show_token_info_json (struct mntent * mntent )
126
115
{
127
- char * value ;
116
+ char * opts , * value ;
128
117
129
118
jsonw_start_object (json_wtr );
130
-
131
119
jsonw_string_field (json_wtr , "token_info" , mntent -> mnt_dir );
132
120
133
- jsonw_name (json_wtr , "allowed_cmds" );
134
- value = get_delegate_value (mntent -> mnt_opts , "delegate_cmds" );
135
- split_json_array_str (value );
136
-
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 );
121
+ for (size_t i = 0 ; i < ARRAY_SIZE (sets ); i ++ ) {
122
+ jsonw_name (json_wtr , sets [i ].header );
123
+ opts = strdup (mntent -> mnt_opts );
124
+ value = get_delegate_value (opts , sets [i ].key );
125
+ split_json_array_str (value );
126
+ free (opts );
127
+ }
148
128
149
129
jsonw_end_object (json_wtr );
150
130
}
0 commit comments