Tuxera NTFS driver
[tomato.git] / release / src-rt-6.x.4708 / router / nvram_arm / main.c
blobe7cd5dbe1ca531c41a780c9477c51e2c1ce88330
1 /*
2 * Frontend command-line utility for Linux NVRAM layer
4 * Copyright (C) 2012, Broadcom Corporation. All Rights Reserved.
5 *
6 * Permission to use, copy, modify, and/or distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
13 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
15 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
16 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 * $Id: main.c 325698 2012-04-04 12:40:07Z $
21 #include <stdio.h>
22 #include <stdlib.h>
23 #include <string.h>
25 #include <typedefs.h>
26 #include <bcmnvram.h>
28 #define PROFILE_HEADER "HDR1"
29 #define PROFILE_HEADER_NEW "HDR2"
31 unsigned char get_rand()
33 unsigned char buf[1];
34 FILE *fp;
36 fp = fopen("/dev/urandom", "r");
37 if (fp == NULL) {
38 #ifdef ASUS_DEBUG
39 fprintf(stderr, "Could not open /dev/urandom.\n");
40 #endif
41 return 0;
43 fread(buf, 1, 1, fp);
44 fclose(fp);
46 return buf[0];
49 int nvram_save_new(char *file, char *buf)
51 FILE *fp;
52 char *name;
53 unsigned long count, filelen, i;
54 unsigned char rand = 0, temp;
56 if ((fp = fopen(file, "w")) == NULL) return -1;
58 count = 0;
59 for (name = buf; *name; name += strlen(name) + 1)
61 //#ifdef ASUS_DEBUG
62 puts(name);
63 //#endif
64 count = count + strlen(name) + 1;
67 filelen = count + (1024 - count % 1024);
68 rand = get_rand() % 30;
69 #ifdef ASUS_DEBUG
70 fprintf(stderr, "random number: %x\n", rand);
71 #endif
72 fwrite(PROFILE_HEADER_NEW, 1, 4, fp);
73 fwrite(&filelen, 1, 3, fp);
74 fwrite(&rand, 1, 1, fp);
75 #ifdef ASUS_DEBUG
76 for (i = 0; i < 4; i++)
78 fprintf(stderr, "%2x ", PROFILE_HEADER_NEW[i]);
80 for (i = 0; i < 3; i++)
82 fprintf(stderr, "%2x ", ((char *)&filelen)[i]);
84 fprintf(stderr, "%2x ", ((char *)&rand)[0]);
85 #endif
86 for (i = 0; i < count; i++)
88 if (buf[i] == 0x0)
89 buf[i] = 0xfd + get_rand() % 3;
90 else
91 buf[i] = 0xff - buf[i] + rand;
93 fwrite(buf, 1, count, fp);
94 #ifdef ASUS_DEBUG
95 for (i = 0; i < count; i++)
97 if (i % 16 == 0) fprintf(stderr, "\n");
98 fprintf(stderr, "%2x ", (unsigned char) buf[i]);
100 #endif
101 for (i = count; i < filelen; i++)
103 temp = 0xfd + get_rand() % 3;
104 fwrite(&temp, 1, 1, fp);
105 #ifdef ASUS_DEBUG
106 if (i % 16 == 0) fprintf(stderr, "\n");
107 fprintf(stderr, "%2x ", (unsigned char) temp);
108 #endif
110 fclose(fp);
111 return 0;
114 int issyspara(char *p)
116 struct nvram_tuple *t;
117 extern struct nvram_tuple router_defaults[];
119 // skip checking for wl[]_, wan[], lan[]_
120 if (strstr(p, "wl") || strstr(p, "wan") || strstr(p, "lan"))
121 return 1;
123 for (t = router_defaults; t->name; t++)
125 if (strstr(p, t->name))
126 break;
130 if (t->name) return 1;
131 else return 0;
134 int nvram_restore_new(char *file, char *buf)
136 FILE *fp;
137 char header[8], *p, *v;
138 unsigned long count, filelen, *filelenptr, i;
139 unsigned char rand, *randptr;
141 if ((fp = fopen(file, "r+")) == NULL) return -1;
143 count = fread(header, 1, 8, fp);
144 if (count>=8 && strncmp(header, PROFILE_HEADER, 4) == 0)
146 filelenptr = (unsigned long *)(header + 4);
147 #ifdef ASUS_DEBUG
148 fprintf(stderr, "restoring original text cfg of length %x\n", *filelenptr);
149 #endif
150 fread(buf, 1, *filelenptr, fp);
152 else if (count>=8 && strncmp(header, PROFILE_HEADER_NEW, 4) == 0)
154 filelenptr = (unsigned long *)(header + 4);
155 filelen = *filelenptr & 0xffffff;
156 #ifdef ASUS_DEBUG
157 fprintf(stderr, "restoring non-text cfg of length %x\n", filelen);
158 #endif
159 randptr = (unsigned char *)(header + 7);
160 rand = *randptr;
161 #ifdef ASUS_DEBUG
162 fprintf(stderr, "non-text cfg random number %x\n", rand);
163 #endif
164 count = fread(buf, 1, filelen, fp);
165 #ifdef ASUS_DEBUG
166 fprintf(stderr, "non-text cfg count %x\n", count);
167 #endif
168 for (i = 0; i < count; i++)
170 if ((unsigned char) buf[i] > ( 0xfd - 0x1))
171 buf[i] = 0x0;
172 else
173 buf[i] = 0xff + rand - buf[i];
175 #ifdef ASUS_DEBUG
176 for (i = 0; i < count; i++)
178 if (i % 16 == 0) fprintf(stderr, "\n");
179 fprintf(stderr, "%2x ", (unsigned char) buf[i]);
182 for (i = 0; i < count; i++)
184 if (i % 16 == 0) fprintf(stderr, "\n");
185 fprintf(stderr, "%c", buf[i]);
187 #endif
189 else
191 fclose(fp);
192 return 0;
194 fclose(fp);
196 p = buf;
198 while (*p)
200 v = strchr(p, '=');
202 if (v != NULL)
204 *v++ = '\0';
206 if (issyspara(p))
207 nvram_set(p, v);
209 p = v + strlen(v) + 1;
211 else
213 nvram_unset(p);
214 p = p + 1;
217 return 0;
220 void
221 usage(void)
223 fprintf(stderr,
224 "usage: nvram [get name] [set name=value] "
225 "[unset name] [show] [commit] [save] [restore] [erase] ...\n");
226 exit(0);
229 /* NVRAM utility */
231 main(int argc, char **argv)
233 char *name, *value, buf[MAX_NVRAM_SPACE];
234 int size;
236 /* Skip program name */
237 --argc;
238 ++argv;
240 if (!*argv)
241 usage();
243 /* Process the arguments */
244 for (; *argv; ++argv) {
245 if (!strcmp(*argv, "get")) {
246 if (*++argv) {
247 if ((value = nvram_get(*argv)))
248 puts(value);
250 } else if (!strcmp(*argv, "set")) {
251 if (*++argv) {
252 strncpy(value = buf, *argv, sizeof(buf));
253 name = strsep(&value, "=");
254 nvram_set(name, value);
256 } else if (!strcmp(*argv, "unset")) {
257 if (*++argv)
258 nvram_unset(*argv);
259 } else if (!strcmp(*argv, "commit")) {
260 nvram_commit();
261 } else if (!strcmp(*argv, "save")) {
262 if (*++argv)
264 nvram_getall(buf, NVRAM_SPACE);
265 nvram_save_new(*argv, buf);
267 } else if (!strcmp(*argv, "restore")) {
268 if (*++argv)
269 nvram_restore_new(*argv, buf);
270 } else if (!strcmp(*argv, "erase")) {
271 system("nvram_erase");
272 } else if (!strcmp(*argv, "show") ||
273 !strcmp(*argv, "dump")) {
274 nvram_getall(buf, sizeof(buf));
275 for (name = buf; *name; name += strlen(name) + 1)
276 puts(name);
277 size = sizeof(struct nvram_header) + (int) name - (int) buf;
278 if (**argv != 'd')
279 fprintf(stderr, "size: %d bytes (%d left)\n",
280 size, MAX_NVRAM_SPACE - size);
281 } //else
282 // usage();
285 return 0;