]> git.sur5r.net Git - u-boot/blobdiff - tools/mkimage.c
mkimage: Convert to use getopt()
[u-boot] / tools / mkimage.c
index 8af9d50e2cd9916109e5807510755fb131c54f4b..f0cc53d42329cde0cff7f81477a996cb788c07d9 100644 (file)
@@ -67,6 +67,119 @@ static void show_image_types(void)
        fprintf(stderr, "\n");
 }
 
+static void process_args(int argc, char **argv)
+{
+       char *ptr;
+       int opt;
+
+       while ((opt = getopt(argc, argv,
+                            "a:A:cC:d:D:e:f:Fk:K:ln:O:rR:sT:vVx")) != -1) {
+               switch (opt) {
+               case 'l':
+                       params.lflag = 1;
+                       break;
+               case 'A':
+                       params.arch = genimg_get_arch_id(optarg);
+                       if (params.arch < 0)
+                               usage();
+                       break;
+               case 'c':
+                       params.comment = optarg;
+                       break;
+               case 'C':
+                       params.comp = genimg_get_comp_id(optarg);
+                       if (params.comp < 0)
+                               usage();
+                       break;
+               case 'D':
+                       params.dtc = optarg;
+                       break;
+               case 'O':
+                       params.os = genimg_get_os_id(optarg);
+                       if (params.os < 0)
+                               usage();
+                       break;
+               case 'T':
+                       params.type = genimg_get_type_id(optarg);
+                       if (params.type < 0) {
+                               show_image_types();
+                               usage();
+                       }
+                       break;
+               case 'a':
+                       params.addr = strtoull(optarg, &ptr, 16);
+                       if (*ptr) {
+                               fprintf(stderr, "%s: invalid load address %s\n",
+                                       params.cmdname, optarg);
+                               exit(EXIT_FAILURE);
+                       }
+                       break;
+               case 'd':
+                       params.datafile = optarg;
+                       params.dflag = 1;
+                       break;
+               case 'e':
+                       params.ep = strtoull(optarg, &ptr, 16);
+                       if (*ptr) {
+                               fprintf(stderr, "%s: invalid entry point %s\n",
+                                       params.cmdname, optarg);
+                               exit(EXIT_FAILURE);
+                       }
+                       params.eflag = 1;
+                       break;
+               case 'f':
+                       params.datafile = optarg;
+                       /* no break */
+               case 'F':
+                       /*
+                        * The flattened image tree (FIT) format
+                        * requires a flattened device tree image type
+                        */
+                       params.type = IH_TYPE_FLATDT;
+                       params.fflag = 1;
+                       break;
+               case 'k':
+                       params.keydir = optarg;
+                       break;
+               case 'K':
+                       params.keydest = optarg;
+                       break;
+               case 'n':
+                       params.imagename = optarg;
+                       break;
+               case 'r':
+                       params.require_keys = 1;
+                       break;
+               case 'R':
+                       /*
+                        * This entry is for the second configuration
+                        * file, if only one is not enough.
+                        */
+                       params.imagename2 = optarg;
+                       break;
+               case 's':
+                       params.skipcpy = 1;
+                       break;
+               case 'v':
+                       params.vflag++;
+                       break;
+               case 'V':
+                       printf("mkimage version %s\n", PLAIN_VERSION);
+                       exit(EXIT_SUCCESS);
+               case 'x':
+                       params.xflag++;
+                       break;
+               default:
+                       usage();
+               }
+       }
+
+       if (optind >= argc)
+               usage();
+       params.imagefile = argv[optind];
+}
+
+
 int main(int argc, char **argv)
 {
        int ifd = -1;
@@ -78,144 +191,10 @@ int main(int argc, char **argv)
        int dfd;
 
        params.cmdname = *argv;
-       params.addr = params.ep = 0;
-
-       while (--argc > 0 && **++argv == '-') {
-               while (*++*argv) {
-                       switch (**argv) {
-                       case 'l':
-                               params.lflag = 1;
-                               break;
-                       case 'A':
-                               if ((--argc <= 0) ||
-                                       (params.arch =
-                                       genimg_get_arch_id (*++argv)) < 0)
-                                       usage ();
-                               goto NXTARG;
-                       case 'c':
-                               if (--argc <= 0)
-                                       usage();
-                               params.comment = *++argv;
-                               goto NXTARG;
-                       case 'C':
-                               if ((--argc <= 0) ||
-                                       (params.comp =
-                                       genimg_get_comp_id (*++argv)) < 0)
-                                       usage ();
-                               goto NXTARG;
-                       case 'D':
-                               if (--argc <= 0)
-                                       usage ();
-                               params.dtc = *++argv;
-                               goto NXTARG;
-
-                       case 'O':
-                               if ((--argc <= 0) ||
-                                       (params.os =
-                                       genimg_get_os_id (*++argv)) < 0)
-                                       usage ();
-                               goto NXTARG;
-                       case 'T':
-                               params.type = -1;
-                               if (--argc >= 0 && argv[1]) {
-                                       params.type =
-                                               genimg_get_type_id(*++argv);
-                               }
-                               if (params.type < 0) {
-                                       show_image_types();
-                                       usage();
-                               }
-                               goto NXTARG;
-                       case 'a':
-                               if (--argc <= 0)
-                                       usage ();
-                               params.addr = strtoul (*++argv, &ptr, 16);
-                               if (*ptr) {
-                                       fprintf (stderr,
-                                               "%s: invalid load address %s\n",
-                                               params.cmdname, *argv);
-                                       exit (EXIT_FAILURE);
-                               }
-                               goto NXTARG;
-                       case 'd':
-                               if (--argc <= 0)
-                                       usage ();
-                               params.datafile = *++argv;
-                               params.dflag = 1;
-                               goto NXTARG;
-                       case 'e':
-                               if (--argc <= 0)
-                                       usage ();
-                               params.ep = strtoul (*++argv, &ptr, 16);
-                               if (*ptr) {
-                                       fprintf (stderr,
-                                               "%s: invalid entry point %s\n",
-                                               params.cmdname, *argv);
-                                       exit (EXIT_FAILURE);
-                               }
-                               params.eflag = 1;
-                               goto NXTARG;
-                       case 'f':
-                               if (--argc <= 0)
-                                       usage ();
-                               params.datafile = *++argv;
-                               /* no break */
-                       case 'F':
-                               /*
-                                * The flattened image tree (FIT) format
-                                * requires a flattened device tree image type
-                                */
-                               params.type = IH_TYPE_FLATDT;
-                               params.fflag = 1;
-                               goto NXTARG;
-                       case 'k':
-                               if (--argc <= 0)
-                                       usage();
-                               params.keydir = *++argv;
-                               goto NXTARG;
-                       case 'K':
-                               if (--argc <= 0)
-                                       usage();
-                               params.keydest = *++argv;
-                               goto NXTARG;
-                       case 'n':
-                               if (--argc <= 0)
-                                       usage ();
-                               params.imagename = *++argv;
-                               goto NXTARG;
-                       case 'r':
-                               params.require_keys = 1;
-                               break;
-                       case 'R':
-                               if (--argc <= 0)
-                                       usage();
-                               /*
-                                * This entry is for the second configuration
-                                * file, if only one is not enough.
-                                */
-                               params.imagename2 = *++argv;
-                               goto NXTARG;
-                       case 's':
-                               params.skipcpy = 1;
-                               break;
-                       case 'v':
-                               params.vflag++;
-                               break;
-                       case 'V':
-                               printf("mkimage version %s\n", PLAIN_VERSION);
-                               exit(EXIT_SUCCESS);
-                       case 'x':
-                               params.xflag++;
-                               break;
-                       default:
-                               usage ();
-                       }
-               }
-NXTARG:                ;
-       }
+       params.addr = 0;
+       params.ep = 0;
 
-       if (argc != 1)
-               usage ();
+       process_args(argc, argv);
 
        /* set tparams as per input type_id */
        tparams = imagetool_get_type(params.type);
@@ -231,7 +210,7 @@ NXTARG:             ;
         */
        if (tparams->check_params)
                if (tparams->check_params (&params))
-                       usage ();
+                       usage();
 
        if (!params.eflag) {
                params.ep = params.addr;
@@ -240,8 +219,6 @@ NXTARG:             ;
                        params.ep += tparams->header_size;
        }
 
-       params.imagefile = *argv;
-
        if (params.fflag){
                if (tparams->fflag_handle)
                        /*
@@ -311,21 +288,25 @@ NXTARG:           ;
                exit (retval);
        }
 
-       dfd = open(params.datafile, O_RDONLY | O_BINARY);
-       if (dfd < 0) {
-               fprintf(stderr, "%s: Can't open %s: %s\n",
-                       params.cmdname, params.datafile, strerror(errno));
-               exit(EXIT_FAILURE);
-       }
+       if ((params.type != IH_TYPE_MULTI) && (params.type != IH_TYPE_SCRIPT)) {
+               dfd = open(params.datafile, O_RDONLY | O_BINARY);
+               if (dfd < 0) {
+                       fprintf(stderr, "%s: Can't open %s: %s\n",
+                               params.cmdname, params.datafile,
+                               strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
 
-       if (fstat(dfd, &sbuf) < 0) {
-               fprintf(stderr, "%s: Can't stat %s: %s\n",
-                       params.cmdname, params.datafile, strerror(errno));
-               exit(EXIT_FAILURE);
-       }
+               if (fstat(dfd, &sbuf) < 0) {
+                       fprintf(stderr, "%s: Can't stat %s: %s\n",
+                               params.cmdname, params.datafile,
+                               strerror(errno));
+                       exit(EXIT_FAILURE);
+               }
 
-       params.file_size = sbuf.st_size + tparams->header_size;
-       close(dfd);
+               params.file_size = sbuf.st_size + tparams->header_size;
+               close(dfd);
+       }
 
        /*
         * In case there an header with a variable