tag rc6
[openwrt/svn-archive/openwrt.git] / package / nvram / src / main.c
diff --git a/package/nvram/src/main.c b/package/nvram/src/main.c
new file mode 100644 (file)
index 0000000..7af2672
--- /dev/null
@@ -0,0 +1,88 @@
+/*
+ * Frontend command-line utility for Linux NVRAM layer
+ *
+ * Copyright 2004, Broadcom Corporation
+ * All Rights Reserved.
+ * 
+ * THIS SOFTWARE IS OFFERED "AS IS", AND BROADCOM GRANTS NO WARRANTIES OF ANY
+ * KIND, EXPRESS OR IMPLIED, BY STATUTE, COMMUNICATION OR OTHERWISE. BROADCOM
+ * SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A SPECIFIC PURPOSE OR NONINFRINGEMENT CONCERNING THIS SOFTWARE.
+ *
+ * $Id$
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <typedefs.h>
+#include <bcmnvram.h>
+
+static void
+usage(void)
+{
+       fprintf(stderr, "usage: nvram [get name] [set name=value] [unset name] [show]\n");
+       exit(0);
+}
+
+/* hack for some PMON default nvram values which have '\r' appended */
+void
+puts_trim_cr(char *str)
+{
+       int len= strlen(str);
+       if (len && (str[len-1] == '\r')) len--;
+       printf("%.*s\n", len, str);
+}
+
+/* NVRAM utility */
+int
+main(int argc, char **argv)
+{
+       char *name, *value, buf[NVRAM_SPACE];
+       int size;
+
+       /* Skip program name */
+       --argc;
+       ++argv;
+
+       if (!*argv) 
+               usage();
+
+       /* Process the remaining arguments. */
+       for (; *argv; argv++) {
+               if (!strncmp(*argv, "get", 3)) {
+                       if (*++argv) {
+                               if ((value = nvram_get(*argv))) {
+                                       puts_trim_cr(value);
+                               }
+                       }
+               }
+               else if (!strncmp(*argv, "set", 3)) {
+                       if (*++argv) {
+                               strncpy(value = buf, *argv, sizeof(buf));
+                               name = strsep(&value, "=");
+                               nvram_set(name, value);
+                       }
+               }
+               else if (!strncmp(*argv, "unset", 5)) {
+                       if (*++argv)
+                               nvram_unset(*argv);
+               }
+               else if (!strncmp(*argv, "commit", 5)) {
+                       nvram_commit();
+               }
+               else if (!strncmp(*argv, "show", 4) ||
+                          !strncmp(*argv, "getall", 6)) {
+                       nvram_getall(buf, sizeof(buf));
+                       for (name = buf; *name; name += strlen(name) + 1)
+                               puts_trim_cr(name);
+                       size = sizeof(struct nvram_header) + (int) name - (int) buf;
+                       fprintf(stderr, "size: %d bytes (%d left)\n", size, NVRAM_SPACE - size);
+               }
+               if (!*argv)
+                       break;
+       }
+
+       return 0;
+}