tools: imagetag: add parameter for padding images
[openwrt/openwrt.git] / tools / firmware-utils / src / imagetag_cmdline.c
index 91ac90b..efb82ac 100644 (file)
@@ -58,12 +58,14 @@ const char *gengetopt_args_info_help[] = {
   "      --inactive=flag-value     Inactive Flag (2=not-specified).  (possible \n                                  values=\"0\", \"1\", \"2\" default=`2')",
   "      --reserved2=STRING        String for second reserved section.",
   "      --kernel-file-has-header  Indicates that the kernel file includes the \n                                  kernel header with correct load address and \n                                  entry point, so no changes are needed  \n                                  (default=off)",
+  "  -p, --pad=size (in MiB)       Pad the image to this size if smaller (in MiB)",
     0
 };
 
 typedef enum {ARG_NO
   , ARG_FLAG
   , ARG_STRING
+  , ARG_INT
 } cmdline_parser_arg_type;
 
 static
@@ -113,6 +115,7 @@ void clear_given (struct gengetopt_args_info *args_info)
   args_info->inactive_given = 0 ;
   args_info->reserved2_given = 0 ;
   args_info->kernel_file_has_header_given = 0 ;
+  args_info->pad_given = 0 ;
 }
 
 static
@@ -165,6 +168,7 @@ void clear_args (struct gengetopt_args_info *args_info)
   args_info->reserved2_arg = NULL;
   args_info->reserved2_orig = NULL;
   args_info->kernel_file_has_header_flag = 0;
+  args_info->pad_orig = NULL;
   
 }
 
@@ -199,6 +203,7 @@ void init_args_info(struct gengetopt_args_info *args_info)
   args_info->inactive_help = gengetopt_args_info_help[23] ;
   args_info->reserved2_help = gengetopt_args_info_help[24] ;
   args_info->kernel_file_has_header_help = gengetopt_args_info_help[25] ;
+  args_info->pad_help = gengetopt_args_info_help[26] ;
   
 }
 
@@ -323,6 +328,7 @@ cmdline_parser_release (struct gengetopt_args_info *args_info)
   free_string_field (&(args_info->inactive_orig));
   free_string_field (&(args_info->reserved2_arg));
   free_string_field (&(args_info->reserved2_orig));
+  free_string_field (&(args_info->pad_orig));
   
   
 
@@ -446,6 +452,8 @@ cmdline_parser_dump(FILE *outfile, struct gengetopt_args_info *args_info)
     write_into_file(outfile, "reserved2", args_info->reserved2_orig, 0);
   if (args_info->kernel_file_has_header_given)
     write_into_file(outfile, "kernel-file-has-header", 0, 0 );
+  if (args_info->pad_given)
+    write_into_file(outfile, "pad", args_info->pad_orig, 0);
   
 
   i = EXIT_SUCCESS;
@@ -690,6 +698,9 @@ int update_arg(void *field, char **orig_field,
   case ARG_FLAG:
     *((int *)field) = !*((int *)field);
     break;
+  case ARG_INT:
+    if (val) *((int *)field) = strtol (val, &stop_char, 0);
+    break;
   case ARG_STRING:
     if (val) {
       string_field = (char **)field;
@@ -702,6 +713,17 @@ int update_arg(void *field, char **orig_field,
     break;
   };
 
+  /* check numeric conversion */
+  switch(arg_type) {
+  case ARG_INT:
+    if (val && !(stop_char && *stop_char == '\0')) {
+      fprintf(stderr, "%s: invalid numeric value: %s\n", package_name, val);
+      return 1; /* failure */
+    }
+    break;
+  default:
+    ;
+  };
 
   /* store the original value */
   switch(arg_type) {
@@ -787,10 +809,11 @@ cmdline_parser_internal (
         { "inactive",  1, NULL, 0 },
         { "reserved2", 1, NULL, 0 },
         { "kernel-file-has-header",    0, NULL, 0 },
+        { "pad",       1, NULL, 'p' },
         { 0,  0, 0, 0 }
       };
 
-      c = getopt_long (argc, argv, "hVi:f:o:b:c:s:n:v:a:m:k:l:e:y:1:2:r:", long_options, &option_index);
+      c = getopt_long (argc, argv, "hVi:f:o:b:c:s:n:v:a:m:k:l:e:y:1:2:r:p:", long_options, &option_index);
 
       if (c == -1) break;      /* Exit from `while (1)' loop.  */
 
@@ -1010,6 +1033,18 @@ cmdline_parser_internal (
             goto failure;
         
           break;
+        case 'p':      /* Pad the image to this size if smaller (in MiB).  */
+        
+        
+          if (update_arg( (void *)&(args_info->pad_arg), 
+               &(args_info->pad_orig), &(args_info->pad_given),
+              &(local_args_info.pad_given), optarg, 0, 0, ARG_INT,
+              check_ambiguity, override, 0, 0,
+              "pad", 'p',
+              additional_error))
+            goto failure;
+        
+          break;
 
         case 0:        /* Long option with no short option */
           /* File with CFE to include in the image..  */