#### 26.3.13 Parsing of Suboptions Example ¶

The code which might appear in the `mount`(8) program is a perfect example of the use of `getsubopt`:

    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>

    int do_all;
    const char *type;
    int read_size;
    int write_size;
    int read_only;

    enum
    {
      RO_OPTION = 0,
      RW_OPTION,
      READ_SIZE_OPTION,
      WRITE_SIZE_OPTION,
      THE_END
    };

    const char *mount_opts[] =
    {
      [RO_OPTION] = "ro",
      [RW_OPTION] = "rw",
      [READ_SIZE_OPTION] = "rsize",
      [WRITE_SIZE_OPTION] = "wsize",
      [THE_END] = NULL
    };

    int
    main (int argc, char **argv)
    {
      char *subopts, *value;
      int opt;

      while ((opt = getopt (argc, argv, "at:o:")) != -1)
        switch (opt)
          {
          case 'a':
            do_all = 1;
            break;
          case 't':
            type = optarg;
            break;
          case 'o':
            subopts = optarg;
            while (*subopts != '\0')
              switch (getsubopt (&subopts, (char * const *) mount_opts, &value))
                {
                case RO_OPTION:
                  read_only = 1;
                  break;
                case RW_OPTION:
                  read_only = 0;
                  break;
                case READ_SIZE_OPTION:
                  if (value == NULL)
                    abort ();
                  read_size = atoi (value);
                  break;
                case WRITE_SIZE_OPTION:
                  if (value == NULL)
                    abort ();
                  write_size = atoi (value);
                  break;
                default:
                  /* Unknown suboption. */
                  printf ("Unknown suboption `%s'\n", value);
                  break;
                }
            break;
          default:
            abort ();
          }

      /* Do the real work. */

      return 0;
    }