1 /*
2 * SPDX-License-Identifier: GPL-2.0-or-later
3 *
4 * Copyright (c) 2018 Jan Stancek <jstancek@redhat.com>
5 */
6
7 #include <limits.h>
8 #include <stdio.h>
9 #include <unistd.h>
10
11 #define TST_NO_DEFAULT_MAIN
12 #include "tst_test.h"
13 #include "tst_sys_conf.h"
14
15 static struct tst_sys_conf *save_restore_data;
16
tst_sys_conf_dump(void)17 void tst_sys_conf_dump(void)
18 {
19 struct tst_sys_conf *i;
20
21 for (i = save_restore_data; i; i = i->next)
22 tst_res(TINFO, "%s = %s", i->path, i->value);
23 }
24
tst_sys_conf_save_str(const char * path,const char * value)25 int tst_sys_conf_save_str(const char *path, const char *value)
26 {
27 struct tst_sys_conf *n = SAFE_MALLOC(sizeof(*n));
28
29 strncpy(n->path, path, sizeof(n->path));
30 strncpy(n->value, value, sizeof(n->value));
31
32 n->next = save_restore_data;
33 save_restore_data = n;
34
35 return 0;
36 }
37
tst_sys_conf_save(const char * path)38 int tst_sys_conf_save(const char *path)
39 {
40 char line[PATH_MAX];
41 FILE *fp;
42 void *ret;
43 char flag;
44
45 if (!path)
46 tst_brk(TBROK, "path is empty");
47
48 flag = path[0];
49 if (flag == '?' || flag == '!')
50 path++;
51
52 if (access(path, F_OK) != 0) {
53 switch (flag) {
54 case '?':
55 tst_res(TINFO, "Path not found: '%s'", path);
56 break;
57 case '!':
58 tst_brk(TBROK|TERRNO, "Path not found: '%s'", path);
59 break;
60 default:
61 tst_brk(TCONF|TERRNO, "Path not found: '%s'", path);
62 }
63 return 1;
64 }
65
66 fp = fopen(path, "r");
67 if (fp == NULL) {
68 tst_brk(TBROK | TERRNO, "Failed to open FILE '%s' for reading",
69 path);
70 return 1;
71 }
72
73 ret = fgets(line, sizeof(line), fp);
74 fclose(fp);
75
76 if (ret == NULL) {
77 tst_brk(TBROK | TERRNO, "Failed to read anything from '%s'",
78 path);
79 }
80
81 return tst_sys_conf_save_str(path, line);
82 }
83
tst_sys_conf_restore(int verbose)84 void tst_sys_conf_restore(int verbose)
85 {
86 struct tst_sys_conf *i;
87
88 for (i = save_restore_data; i; i = i->next) {
89 if (verbose) {
90 tst_res(TINFO, "Restoring conf.: %s -> %s\n",
91 i->path, i->value);
92 }
93 FILE_PRINTF(i->path, "%s", i->value);
94 }
95 }
96
97