2 * Frontend command-line utility for Linux NVRAM layer
4 * Copyright (C) 2012, Broadcom Corporation. All Rights Reserved.
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.
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 $
28 #define PROFILE_HEADER "HDR1"
29 #define PROFILE_HEADER_NEW "HDR2"
31 unsigned char get_rand()
36 fp
= fopen("/dev/urandom", "r");
39 fprintf(stderr
, "Could not open /dev/urandom.\n");
49 int nvram_save_new(char *file
, char *buf
)
53 unsigned long count
, filelen
, i
;
54 unsigned char rand
= 0, temp
;
56 if ((fp
= fopen(file
, "w")) == NULL
) return -1;
59 for (name
= buf
; *name
; name
+= strlen(name
) + 1)
64 count
= count
+ strlen(name
) + 1;
67 filelen
= count
+ (1024 - count
% 1024);
68 rand
= get_rand() % 30;
70 fprintf(stderr
, "random number: %x\n", rand
);
72 fwrite(PROFILE_HEADER_NEW
, 1, 4, fp
);
73 fwrite(&filelen
, 1, 3, fp
);
74 fwrite(&rand
, 1, 1, fp
);
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]);
86 for (i
= 0; i
< count
; i
++)
89 buf
[i
] = 0xfd + get_rand() % 3;
91 buf
[i
] = 0xff - buf
[i
] + rand
;
93 fwrite(buf
, 1, count
, fp
);
95 for (i
= 0; i
< count
; i
++)
97 if (i
% 16 == 0) fprintf(stderr
, "\n");
98 fprintf(stderr
, "%2x ", (unsigned char) buf
[i
]);
101 for (i
= count
; i
< filelen
; i
++)
103 temp
= 0xfd + get_rand() % 3;
104 fwrite(&temp
, 1, 1, fp
);
106 if (i
% 16 == 0) fprintf(stderr
, "\n");
107 fprintf(stderr
, "%2x ", (unsigned char) temp
);
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"))
123 for (t
= router_defaults
; t
->name
; t
++)
125 if (strstr(p
, t
->name
))
130 if (t
->name
) return 1;
134 int nvram_restore_new(char *file
, char *buf
)
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);
148 fprintf(stderr
, "restoring original text cfg of length %x\n", *filelenptr
);
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;
157 fprintf(stderr
, "restoring non-text cfg of length %x\n", filelen
);
159 randptr
= (unsigned char *)(header
+ 7);
162 fprintf(stderr
, "non-text cfg random number %x\n", rand
);
164 count
= fread(buf
, 1, filelen
, fp
);
166 fprintf(stderr
, "non-text cfg count %x\n", count
);
168 for (i
= 0; i
< count
; i
++)
170 if ((unsigned char) buf
[i
] > ( 0xfd - 0x1))
173 buf
[i
] = 0xff + rand
- buf
[i
];
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
]);
209 p
= v
+ strlen(v
) + 1;
224 "usage: nvram [get name] [set name=value] "
225 "[unset name] [show] [commit] [save] [restore] [erase] ...\n");
231 main(int argc
, char **argv
)
233 char *name
, *value
, buf
[MAX_NVRAM_SPACE
];
236 /* Skip program name */
243 /* Process the arguments */
244 for (; *argv
; ++argv
) {
245 if (!strcmp(*argv
, "get")) {
247 if ((value
= nvram_get(*argv
)))
250 } else if (!strcmp(*argv
, "set")) {
252 strncpy(value
= buf
, *argv
, sizeof(buf
));
253 name
= strsep(&value
, "=");
254 nvram_set(name
, value
);
256 } else if (!strcmp(*argv
, "unset")) {
259 } else if (!strcmp(*argv
, "commit")) {
261 } else if (!strcmp(*argv
, "save")) {
264 nvram_getall(buf
, NVRAM_SPACE
);
265 nvram_save_new(*argv
, buf
);
267 } else if (!strcmp(*argv
, "restore")) {
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)
277 size
= sizeof(struct nvram_header
) + (int) name
- (int) buf
;
279 fprintf(stderr
, "size: %d bytes (%d left)\n",
280 size
, MAX_NVRAM_SPACE
- size
);