1
- #define _GNU_SOURCE
2
1
#include <stdlib.h>
3
2
#include <stdio.h>
4
- #include <stdint.h>
5
3
#include <string.h>
6
- #include <dlfcn.h>
7
4
#include "nvram-faker.h"
8
5
#include "ini.h"
9
6
10
7
#define RED_ON "\033[22;31m"
11
8
#define RED_OFF "\033[22;00m"
12
- #define DEFAULT_BUFFER_LEN 1024
9
+ #define DEFAULT_KV_PAIR_LEN 1024
13
10
14
11
#ifndef INI_FILE_PATH
15
12
#define INI_FILE_PATH "/nvram.ini"
16
13
#endif
17
14
18
- #ifndef LOG_FILE_PATH
19
- #define LOG_FILE_PATH "/tmp/faker.log"
20
- #endif
21
-
22
15
static int kv_count = 0 ;
23
- static int fn_count = 0 ;
24
- static int key_value_pair_len = DEFAULT_BUFFER_LEN ;
25
- static int fake_filenames_len = DEFAULT_BUFFER_LEN ;
26
- ini_info_t * ii = NULL ;
16
+ static int key_value_pair_len = DEFAULT_KV_PAIR_LEN ;
27
17
static char * * key_value_pairs = NULL ;
28
- static char * * fake_filenames = NULL ;
29
- FILE * flog ;
30
18
31
19
void initialize_ini (void ) __attribute__((constructor ));
32
20
void end (void ) __attribute__((destructor ));
33
21
34
- int fname_check (const char * filename );
35
-
36
22
static int ini_handler (void * user , const char * section , const char * name ,const char * value )
37
23
{
38
24
39
25
int old_kv_len ;
40
- ini_info_t * new_ii ;
41
26
char * * kv ;
42
- char * * fn ;
43
27
char * * new_kv ;
44
28
int i ;
45
-
29
+
46
30
if (NULL == user || NULL == section || NULL == name || NULL == value )
47
31
{
48
- fprintf ( flog , "bad parameter to ini_handler\n" );
32
+ printf ( "bad parameter to ini_handler\n" );
49
33
return 0 ;
50
34
}
51
-
52
- new_ii = * ((ini_info_t * * ) user );
53
-
54
- if (NULL == new_ii )
35
+ kv = * ((char * * * )user );
36
+ if (NULL == kv )
55
37
{
56
- fprintf ( flog , "ini_info struct is NULL\n" );
38
+ printf ( "kv is NULL\n" );
57
39
return 0 ;
58
40
}
59
-
60
- kv = new_ii -> kv_pairs ;
61
- fn = new_ii -> fake_fns ;
62
-
41
+
63
42
if (kv_count >= key_value_pair_len )
64
43
{
65
44
old_kv_len = key_value_pair_len ;
66
45
key_value_pair_len = (key_value_pair_len * 2 );
67
46
new_kv = (char * * )malloc (key_value_pair_len );
68
- if (NULL == new_kv )
47
+ if (NULL == kv )
69
48
{
70
- fprintf ( flog , "Failed to reallocate key value array.\n" );
49
+ printf ( "Failed to reallocate key value array.\n" );
71
50
return 0 ;
72
51
}
73
52
for (i = 0 ;i < old_kv_len ;i ++ )
74
53
{
75
54
new_kv [i ]= kv [i ];
76
55
}
77
-
78
- free (new_ii -> kv_pairs );
56
+ free (* (char * * * )user );
79
57
kv = new_kv ;
80
- new_ii -> kv_pairs = kv ;
81
- }
82
-
83
- if (fn_count >= fake_filenames_len )
84
- {
85
- fprintf (flog ,"Sorry you are limited to 1024 filenames to fake\n" );
86
- fprintf (flog ,"Seriously it will probably make things painfully slow\n" );
87
- fprintf (flog ,"if you had more.\n" );
88
- return 0 ;
89
- }
90
-
91
- fprintf (flog ,"Got %s:%s\n" ,name ,value );
92
- if (strstr (name ,"fake_filename" )){
93
- fn [fn_count ++ ]= strdup (value );
94
- }else {
95
- kv [kv_count ++ ]= strdup (name );
96
- kv [kv_count ++ ]= strdup (value );
58
+ * (char * * * )user = kv ;
97
59
}
60
+ printf ("Got %s:%s\n" ,name ,value );
61
+ kv [kv_count ++ ]= strdup (name );
62
+ kv [kv_count ++ ]= strdup (value );
98
63
99
64
return 1 ;
100
65
}
101
66
102
67
void initialize_ini (void )
103
68
{
104
69
int ret ;
105
- char * flog_path = NULL ;
106
- flog_path = getenv ("FAKER_LOG" );
107
-
108
-
109
- if (NULL == flog_path || '\0' == flog_path [0 ]){
110
- //if no log provided log to stderr
111
- flog = stderr ;
112
- fprintf (flog ,RED_ON "**************************************************\n" );
113
- fprintf (flog ,"**\t\tTO LOG TO A FILE\t\t**\n" );
114
- fprintf (flog ,"**\t SET \"FAKER_LOG\" ENV VARIABLE\t\t**\n" );
115
- fprintf (flog ,"**************************************************\n" RED_OFF );
116
- }else {
117
- flog = fopen (flog_path ,"w+" );
118
- if ( NULL == flog ){
119
- fprintf (stderr ,"Failed to open log file \"%s\"\n" ,flog_path );
120
- exit (1 );
121
- }
122
- }
123
-
124
- setvbuf (flog ,NULL ,_IONBF ,0 );
125
- fprintf (flog ,"Initializing.\n" );
126
- if (NULL == ii ){
127
- ii = malloc (sizeof (ini_info_t ));
128
- if (NULL == ii ){
129
- fprintf (flog ,"Failed to allocate memory for update info struct. Terminating.\n" );
130
- exit (1 );
131
- }
132
-
133
- }
134
-
70
+ printf ("Initializing.\n" );
135
71
if (NULL == key_value_pairs )
136
72
{
137
73
key_value_pairs = malloc (key_value_pair_len );
138
74
}
139
75
if (NULL == key_value_pairs )
140
76
{
141
- fprintf ( flog , "Failed to allocate memory for key value array. Terminating.\n" );
77
+ printf ( "Failed to allocate memory for key value array. Terminating.\n" );
142
78
exit (1 );
143
79
}
144
-
145
- if (NULL == fake_filenames )
146
- {
147
- fake_filenames = malloc (fake_filenames_len );
148
- }
149
- if (NULL == fake_filenames )
150
- {
151
- fprintf (flog ,"Failed to allocate memory for fake filenames array. Terminating.\n" );
152
- exit (1 );
153
- }
154
-
155
- ii -> kv_pairs = key_value_pairs ;
156
- ii -> fake_fns = fake_filenames ;
157
-
158
- ret = ini_parse (INI_FILE_PATH ,ini_handler ,(void * )& ii );
159
- fprintf (flog ,"ret from ini_parse was: %d\n" ,ret );
80
+
81
+ ret = ini_parse (INI_FILE_PATH ,ini_handler ,(void * )& key_value_pairs );
82
+ printf ("ret from ini_parse was: %d\n" ,ret );
160
83
if (0 != ret )
161
84
{
162
- fprintf ( flog , "INI parse failed. Terminating\n" );
85
+ printf ( "INI parse failed. Terminating\n" );
163
86
free (key_value_pairs );
164
87
key_value_pairs = NULL ;
165
88
exit (1 );
166
89
}
167
-
168
-
169
90
170
91
return ;
171
92
@@ -176,23 +97,10 @@ void end(void)
176
97
int i ;
177
98
for (i = 0 ;i < kv_count ;i ++ )
178
99
{
179
- if (NULL != key_value_pairs [i ])
180
- free (key_value_pairs [i ]);
181
- }
182
-
183
- for (i = 0 ;i < fn_count ;i ++ )
184
- {
185
- if (NULL != fake_filenames [i ])
186
- free (fake_filenames [i ]);
100
+ free (key_value_pairs [i ]);
187
101
}
188
102
free (key_value_pairs );
189
- free (fake_filenames );
190
103
key_value_pairs = NULL ;
191
- fake_filenames = NULL ;
192
- free (ii );
193
- ii = NULL ;
194
-
195
- fclose (flog );
196
104
197
105
return ;
198
106
}
@@ -207,7 +115,7 @@ char *nvram_get(const char *key)
207
115
{
208
116
if (strcmp (key ,key_value_pairs [i ]) == 0 )
209
117
{
210
- fprintf ( flog , "%s=%s\n" ,key ,key_value_pairs [i + 1 ]);
118
+ printf ( "%s=%s\n" ,key ,key_value_pairs [i + 1 ]);
211
119
found = 1 ;
212
120
value = key_value_pairs [i + 1 ];
213
121
break ;
@@ -217,10 +125,7 @@ char *nvram_get(const char *key)
217
125
ret = NULL ;
218
126
if (!found )
219
127
{
220
- if (flog == stderr )
221
- fprintf (flog , RED_ON "%s=Unknown\n" RED_OFF ,key );
222
- else
223
- fprintf (flog , "%s=Unknown (FAILED LOOKUP)\n" ,key );
128
+ printf ( RED_ON "%s=Unknown\n" RED_OFF ,key );
224
129
}else
225
130
{
226
131
@@ -229,59 +134,4 @@ char *nvram_get(const char *key)
229
134
return ret ;
230
135
}
231
136
232
- FILE * fopen (const char * filename , const char * mode ){
233
- static FILE * (* my_fopen ) (const char * filename , const char * mode ) = NULL ;
234
- char * base ;
235
- char fakename [64 ];
236
-
237
- if (!my_fopen )
238
- my_fopen = dlsym (RTLD_NEXT ,"fopen" );
239
- FILE * p = my_fopen (filename ,mode );
240
- if (p == 0 ){
241
- if ( fname_check (filename ) ){
242
- base = basename (filename );
243
- if (strlen (base ) > 54 )
244
- base [53 ]= '\0' ;
245
- snprintf (fakename ,64 ,"/tmp/%s.fake" ,base );
246
-
247
- p = my_fopen (fakename ,"a+" );
248
- }
249
- }
250
- return p ;
251
- }
252
-
253
- int fname_check (const char * filename ){
254
- int i = 0 ;
255
-
256
- for (i = 0 ; i < fn_count ; i ++ ){
257
- if (strstr (filename ,fake_filenames [i ])){
258
- fprintf (flog ,"FILE %s not found providing false positive\n" ,filename );
259
- return 1 ;
260
- }
261
- }
262
-
263
- return 0 ;
264
- }
265
-
266
- int open (const char * fn , int flags ){
267
- static int (* my_open ) (const char * fn , int flags ) = NULL ;
268
- char * base ;
269
- char fakename [64 ];
270
-
271
-
272
- if (!my_open )
273
- my_open = dlsym (RTLD_NEXT , "open" );
274
-
275
- int p = my_open (fn ,flags );
276
- if (p == -1 ){
277
- if ( fname_check (fn ) ){
278
- base = basename (fn );
279
- if (strlen (base )> 54 )
280
- base [53 ]= '\0' ;
281
- snprintf (fakename ,64 ,"/tmp/%s.fake" ,base );
282
- p = my_open (fakename ,O_RDWR |O_CREAT |O_APPEND );
283
- }
284
- }
285
137
286
- return p ;
287
- }
0 commit comments