• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

drakenclimber / libcgroup / 20928938325

12 Jan 2026 05:33PM UTC coverage: 46.636% (-9.6%) from 56.221%
20928938325

push

github

drakenclimber
bootstrap: Update to googletest v1.17.0

Signed-off-by: Tom Hromatka <tom.hromatka@oracle.com>

4415 of 9467 relevant lines covered (46.64%)

249.1 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

10.28
/src/parse.y
1
// SPDX-License-Identifier: LGPL-2.1-only
2
/**
3
 * Copyright IBM Corporation. 2007
4
 *
5
 * Authors:        Balbir Singh <balbir@linux.vnet.ibm.com>
6
 *
7
 * NOTE: The grammar has been modified, not to be the most efficient, but
8
 * to allow easy updation of internal data structures.
9
 */
10

11
%{
12
#include <stdlib.h>
13
#include <stdio.h>
14
#include <string.h>
15
#include <libcgroup.h>
16
#include <libcgroup-internal.h>
17

18
int yylex(void);
19
extern int line_no;
20
extern char *yytext;
21

22
static void yyerror(const char *s)
×
23
{
24
        fprintf(stderr, "error at line number %d at %s:%s\n", line_no, yytext, s);
×
25
}
×
26

27
int yywrap(void)
7✔
28
{
29
        return 1;
7✔
30
}
31

32
%}
33

34
%token <name> ID MOUNT GROUP PERM TASK ADMIN NAMESPACE DEFAULT TEMPLATE SYSTEMD
35

36
%union {
37
        char *name;
38
        char chr;
39
        int val;
40
        struct cgroup_dictionary *values;
41
}
42
%type <name> group_name
43
%type <val> mountvalue_conf mount task_namevalue_conf admin_namevalue_conf
44
%type <val> admin_conf task_conf task_or_admin group_conf group start
45
%type <val> namespace namespace_conf default default_conf
46
%type <values> namevalue_conf
47
%type <val> template template_conf
48
%type <val> template_task_or_admin template_task_namevalue_conf
49
%type <val> template_admin_namevalue_conf template_task_conf
50
%type <val> template_admin_conf
51
%type <val> systemdvalue_conf systemd
52
%start start
53
%%
54

55
start   : start group
56
        {
57
                $$ = $1;
8✔
58
        }
59
        | start mount
60
        {
61
                $$ = $1;
×
62
        }
63
        | start default
64
        {
65
          $$ = $1;
×
66
        }
67
        | start namespace
68
        {
69
                $$ = $1;
×
70
        }
71
        | start template
72
        {
73
                $$ = $1;
×
74
        }
75
        | start systemd
76
        {
77
                $$ = $1;
×
78
        }
79
        |
80
        {
81
                $$ = 1;
7✔
82
        }
83
        ;
84

85
default :       DEFAULT '{' default_conf '}'
86
        {
87
                $$ = $3;
×
88
                if ($$) {
×
89
                        cgroup_config_define_default();
×
90
                }
91
        }
92
        ;
93

94
default_conf
95
        :       PERM '{' task_or_admin '}'
96
        {
97
                $$ = $3;
×
98
        }
99
        ;
100

101
group   :       GROUP group_name '{' group_conf '}'
102
        {
103
                $$ = $4;
8✔
104
                if ($$) {
8✔
105
                        $$ = cgroup_config_insert_cgroup($2);
8✔
106
                        if (!$$) {
8✔
107
                                fprintf(stderr, "failed to insert group check size and memory");
×
108
                                $$ = ECGOTHER;
×
109
                                return $$;
×
110
                        }
111
                } else {
112
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
113
                        $$ = ECGCONFIGPARSEFAIL;
×
114
                        return $$;
×
115
                }
116
        }
117
        ;
118

119
group_name
120
        :        ID
121
        {
122
                $$ = $1;
8✔
123
        }
124
        |        DEFAULT
125
        {
126
                $$ = $1;
×
127
        }
128

129
group_conf
130
        :       ID '{' namevalue_conf '}'
131
        {
132
                $$ = cgroup_config_parse_controller_options($1, $3);
8✔
133
                cgroup_dictionary_free($3);
8✔
134
                if (!$$) {
8✔
135
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
136
                        $$ = ECGCONFIGPARSEFAIL;
×
137
                        return $$;
×
138
                }
139
        }
140
        |       group_conf ID '{' namevalue_conf '}'
141
        {
142
                $$ = cgroup_config_parse_controller_options($2, $4);
×
143
                cgroup_dictionary_free($4);
×
144
                if (!$$) {
×
145
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
146
                        $$ = ECGCONFIGPARSEFAIL;
×
147
                        return $$;
×
148
                }
149
        }
150
        |       PERM '{' task_or_admin '}'
151
        {
152
                $$ = $3;
×
153
                if (!$$) {
×
154
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
155
                        $$ = ECGCONFIGPARSEFAIL;
×
156
                        return $$;
×
157
                }
158
        }
159
        ;
160

161
template  :     TEMPLATE ID '{' template_conf '}'
162
        {
163
                $$ = $4;
×
164
                if ($$) {
×
165
                        $$ = template_config_insert_cgroup($2);
×
166
                        if (!$$) {
×
167
                                fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
168
                                $$ = ECGOTHER;
×
169
                                return $$;
×
170
                        }
171
                } else {
172
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
173
                        $$ = ECGCONFIGPARSEFAIL;
×
174
                        return $$;
×
175
                }
176
        }
177
        ;
178

179

180
template_conf
181
        :       ID '{' namevalue_conf '}'
182
        {
183
                $$ = template_config_parse_controller_options($1, $3);
×
184
                cgroup_dictionary_free($3);
×
185
                if (!$$) {
×
186
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
187
                        $$ = ECGCONFIGPARSEFAIL;
×
188
                        return $$;
×
189
                }
190
        }
191
        |       template_conf ID '{' namevalue_conf '}'
192
        {
193
                $$ = template_config_parse_controller_options($2, $4);
×
194
                cgroup_dictionary_free($4);
×
195
                if (!$$) {
×
196
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
197
                        $$ = ECGCONFIGPARSEFAIL;
×
198
                        return $$;
×
199
                }
200
        }
201
        |       PERM '{' template_task_or_admin '}'
202
        {
203
                $$ = $3;
×
204
                if (!$$) {
×
205
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
206
                        $$ = ECGCONFIGPARSEFAIL;
×
207
                        return $$;
×
208
                }
209
        }
210
        ;
211

212
template_task_or_admin
213
        :        TASK '{' template_task_namevalue_conf '}' template_admin_conf
214
        {
215
        $$ = $3 && $5;
×
216
                if (!$$) {
×
217
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
218
                        $$ = ECGCONFIGPARSEFAIL;
×
219
                        return $$;
×
220
                }
221
        }
222
        |       ADMIN '{' template_admin_namevalue_conf '}' template_task_conf
223
        {
224
                $$ = $3 && $5;
×
225
                if (!$$) {
×
226
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
227
                        $$ = ECGCONFIGPARSEFAIL;
×
228
                return $$;
×
229
                }
230
        }
231
        ;
232

233

234
namevalue_conf
235
        :       ID '=' ID ';'
236
        {
237
                struct cgroup_dictionary *dict;
238
                int ret;
239
                ret = cgroup_dictionary_create(&dict, 0);
6✔
240
                if (ret == 0)
6✔
241
                        ret = cgroup_dictionary_add(dict, $1, $3);
6✔
242
                if (ret) {
6✔
243
                        fprintf(stderr, "parsing failed at line number %d:%s\n", line_no,
×
244
                                cgroup_strerror(ret));
245
                        $$ = NULL;
×
246
                        cgroup_dictionary_free(dict);
×
247
                        return ECGCONFIGPARSEFAIL;
×
248
                }
249
                $$ = dict;
6✔
250
        }
251
        |       namevalue_conf ID '=' ID ';'
252
        {
253
                int ret = 0;
6✔
254
                ret = cgroup_dictionary_add($1, $2, $4);
6✔
255
                if (ret != 0) {
6✔
256
                        fprintf(stderr, "parsing failed at line number %d: %s\n", line_no,
×
257
                                cgroup_strerror(ret));
258
                        $$ = NULL;
×
259
                        return ECGCONFIGPARSEFAIL;
×
260
                }
261
                $$ = $1;
6✔
262
        }
263
        |
264
        {
265
                $$ = NULL;
2✔
266
        }
267
        ;
268

269
task_namevalue_conf
270
        :       ID '=' ID ';'
271
        {
272
                $$ = cgroup_config_group_task_perm($1, $3);
×
273
                if (!$$) {
×
274
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
275
                        $$ = ECGCONFIGPARSEFAIL;
×
276
                        return $$;
×
277
                }
278
        }
279
        |       task_namevalue_conf ID '=' ID ';'
280
        {
281
                $$ = $1 && cgroup_config_group_task_perm($2, $4);
×
282
                if (!$$) {
×
283
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
284
                        $$ = ECGCONFIGPARSEFAIL;
×
285
                        return $$;
×
286
                }
287
        }
288
        ;
289

290
admin_namevalue_conf
291
        :       ID '=' ID ';'
292
        {
293
                $$ = cgroup_config_group_admin_perm($1, $3);
×
294
                if (!$$) {
×
295
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
296
                        $$ = ECGCONFIGPARSEFAIL;
×
297
                        return $$;
×
298
                }
299
        }
300
        |       admin_namevalue_conf ID '=' ID ';'
301
        {
302
                $$ = $1 && cgroup_config_group_admin_perm($2, $4);
×
303
                if (!$$) {
×
304
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
305
                        $$ = ECGCONFIGPARSEFAIL;
×
306
                        return $$;
×
307
                }
308
        }
309
        ;
310

311
template_task_namevalue_conf
312
        :       ID '=' ID ';'
313
        {
314
                $$ = template_config_group_task_perm($1, $3);
×
315
                if (!$$) {
×
316
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
317
                        $$ = ECGCONFIGPARSEFAIL;
×
318
                        return $$;
×
319
                }
320
        }
321
        |       template_task_namevalue_conf ID '=' ID ';'
322
        {
323
                $$ = $1 && template_config_group_task_perm($2, $4);
×
324
                if (!$$) {
×
325
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
326
                        $$ = ECGCONFIGPARSEFAIL;
×
327
                        return $$;
×
328
                }
329
        }
330
        ;
331

332
template_admin_namevalue_conf
333
        :       ID '=' ID ';'
334
        {
335
                $$ = template_config_group_admin_perm($1, $3);
×
336
                if (!$$) {
×
337
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
338
                        $$ = ECGCONFIGPARSEFAIL;
×
339
                        return $$;
×
340
                }
341
        }
342
        |       template_admin_namevalue_conf ID '=' ID ';'
343
        {
344
                $$ = $1 && template_config_group_admin_perm($2, $4);
×
345
                if (!$$) {
×
346
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
347
                        $$ = ECGCONFIGPARSEFAIL;
×
348
                        return $$;
×
349
                }
350
        }
351
        ;
352

353

354
task_or_admin
355
        :       TASK '{' task_namevalue_conf '}' admin_conf
356
        {
357
                $$ = $3 && $5;
×
358
                if (!$$) {
×
359
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
360
                        $$ = ECGCONFIGPARSEFAIL;
×
361
                        return $$;
×
362
                }
363
        }
364
        |       ADMIN '{' admin_namevalue_conf '}' task_conf
365
        {
366
                $$ = $3 && $5;
×
367
                if (!$$) {
×
368
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
369
                        $$ = ECGCONFIGPARSEFAIL;
×
370
                        return $$;
×
371
                }
372
        }
373
        ;
374

375
admin_conf:        ADMIN '{' admin_namevalue_conf '}'
376
        {
377
                $$ = $3;
×
378
                if (!$$) {
×
379
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
380
                        $$ = ECGCONFIGPARSEFAIL;
×
381
                        return $$;
×
382
                }
383
        }
384
        ;
385

386
task_conf:        TASK '{' task_namevalue_conf '}'
387
        {
388
                $$ = $3;
×
389
                if (!$$) {
×
390
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
391
                        $$ = ECGCONFIGPARSEFAIL;
×
392
                        return $$;
×
393
                }
394
        }
395
        ;
396

397
template_admin_conf:        ADMIN '{' template_admin_namevalue_conf '}'
398
        {
399
                $$ = $3;
×
400
                if (!$$) {
×
401
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
402
                        $$ = ECGCONFIGPARSEFAIL;
×
403
                        return $$;
×
404
                }
405
        }
406
        ;
407

408
template_task_conf:        TASK '{' template_task_namevalue_conf '}'
409
        {
410
                $$ = $3;
×
411
                if (!$$) {
×
412
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
413
                        $$ = ECGCONFIGPARSEFAIL;
×
414
                        return $$;
×
415
                }
416
        }
417
        ;
418

419
mountvalue_conf
420
        :       ID '=' ID ';'
421
        {
422
                if (!cgroup_config_insert_into_mount_table($1, $3)) {
×
423
                        cgroup_config_cleanup_mount_table();
×
424
                        $$ = ECGCONFIGPARSEFAIL;
×
425
                        return $$;
×
426
                }
427
                $$ = 1;
×
428
        }
429
        |       mountvalue_conf ID '=' ID ';'
430
        {
431
                if (!cgroup_config_insert_into_mount_table($2, $4)) {
×
432
                        cgroup_config_cleanup_mount_table();
×
433
                        $$ = ECGCONFIGPARSEFAIL;
×
434
                        return $$;
×
435
                }
436
                $$ = 1;
×
437
        }
438
        ;
439

440
mount   :       MOUNT '{' mountvalue_conf '}'
441
        {
442
                $$ = $3;
×
443
                if (!$$) {
×
444
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
445
                        $$ = ECGCONFIGPARSEFAIL;
×
446
                        return $$;
×
447
                }
448
        }
449
        ;
450

451
namespace_conf
452
        :       ID '=' ID ';'
453
        {
454
                if (!cgroup_config_insert_into_namespace_table($1, $3)) {
×
455
                        cgroup_config_cleanup_namespace_table();
×
456
                        $$ = ECGCONFIGPARSEFAIL;
×
457
                        return $$;
×
458
                }
459
                $$ = 1;
×
460
        }
461
        |       namespace_conf ID '=' ID ';'
462
        {
463
                if (!cgroup_config_insert_into_namespace_table($2, $4)) {
×
464
                        cgroup_config_cleanup_namespace_table();
×
465
                        $$ = ECGCONFIGPARSEFAIL;
×
466
                        return $$;
×
467
                }
468
                $$ = 1;
×
469
        }
470
        ;
471

472
namespace   :       NAMESPACE '{' namespace_conf '}'
473
        {
474
                $$ = $3;
×
475
                if (!$$) {
×
476
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
477
                        $$ = ECGCONFIGPARSEFAIL;
×
478
                        return $$;
×
479
                }
480
        }
481
        ;
482

483
systemdvalue_conf
484
        :        ID '=' ID ';'
485
        {
486
                if (!cgroup_alloc_systemd_opts($1, $3)) {
×
487
                        cgroup_cleanup_systemd_opts();
×
488
                        $$ = ECGCONFIGPARSEFAIL;
×
489
                        return $$;
×
490
                }
491
                $$ = 1;
×
492
        }
493
        |        systemdvalue_conf ID '=' ID ';'
494
        {
495
                if (!cgroup_add_systemd_opts($2, $4)) {
×
496
                        cgroup_cleanup_systemd_opts();
×
497
                        $$ = ECGCONFIGPARSEFAIL;
×
498
                        return $$;
×
499
                }
500
                $$ = 1;
×
501
        }
502
        ;
503

504
systemd   :          SYSTEMD '{' systemdvalue_conf '}'
505
        {
506
                $$ = $3;
×
507
                if (!$$) {
×
508
                        fprintf(stderr, "parsing failed at line number %d\n", line_no);
×
509
                        $$ = ECGCONFIGPARSEFAIL;
×
510
                        return $$;
×
511
                }
512
        }
513
        ;
514
%%
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc