Rebased from upstream / out of band repository.
[librecmc/librecmc.git] / package / utils / nvram / src / cli.c
index 488d641cfcfef49751dd94c2481d3617d5eb6cfb..224a2b7e2664b4ba4acb889816579412af4b4bb5 100644 (file)
 
 static nvram_handle_t * nvram_open_rdonly(void)
 {
-       const char *file = nvram_find_staging();
+       char *file = nvram_find_staging();
 
        if( file == NULL )
                file = nvram_find_mtd();
 
-       if( file != NULL )
-               return nvram_open(file, NVRAM_RO);
+       if( file != NULL ) {
+               nvram_handle_t *h = nvram_open(file, NVRAM_RO);
+               if( strcmp(file, NVRAM_STAGING) )
+                       free(file);
+               return h;
+       }
 
        return NULL;
 }
@@ -129,6 +133,18 @@ static int do_info(nvram_handle_t *nvram)
        return 0;
 }
 
+static void usage(void)
+{
+       fprintf(stderr,
+               "Usage:\n"
+               "       nvram show\n"
+               "       nvram info\n"
+               "       nvram get variable\n"
+               "       nvram set variable=value [set ...]\n"
+               "       nvram unset variable [unset ...]\n"
+               "       nvram commit\n"
+       );
+}
 
 int main( int argc, const char *argv[] )
 {
@@ -139,15 +155,16 @@ int main( int argc, const char *argv[] )
        int done = 0;
        int i;
 
+       if( argc < 2 ) {
+               usage();
+               return 1;
+       }
+
        /* Ugly... iterate over arguments to see whether we can expect a write */
-       for( i = 1; i < argc; i++ )
-               if( ( !strcmp(argv[i], "set")   && ++i < argc ) ||
-                       ( !strcmp(argv[i], "unset") && ++i < argc ) ||
-                       !strcmp(argv[i], "commit") )
-               {
-                       write = 1;
-                       break;
-               }
+       if( ( !strcmp(argv[1], "set")  && 2 < argc ) ||
+               ( !strcmp(argv[1], "unset") && 2 < argc ) ||
+               !strcmp(argv[1], "commit") )
+               write = 1;
 
 
        nvram = write ? nvram_open_staging() : nvram_open_rdonly();
@@ -223,22 +240,14 @@ int main( int argc, const char *argv[] )
                        "       - Insufficient permissions to open mtd device\n"
                        "       - Insufficient memory to complete operation\n"
                        "       - Memory mapping failed or not supported\n"
+                       "       - Nvram magic not found in specific nvram partition\n"
                );
 
                stat = 1;
        }
        else if( !done )
        {
-               fprintf(stderr,
-                       "Usage:\n"
-                       "       nvram show\n"
-                       "       nvram info\n"
-                       "       nvram get variable\n"
-                       "       nvram set variable=value [set ...]\n"
-                       "       nvram unset variable [unset ...]\n"
-                       "       nvram commit\n"
-               );
-
+               usage();
                stat = 1;
        }