aboutsummaryrefslogtreecommitdiff
path: root/manual/examples/subopt.c
diff options
context:
space:
mode:
Diffstat (limited to 'manual/examples/subopt.c')
-rw-r--r--manual/examples/subopt.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/manual/examples/subopt.c b/manual/examples/subopt.c
new file mode 100644
index 0000000..4a89f64
--- /dev/null
+++ b/manual/examples/subopt.c
@@ -0,0 +1,75 @@
+#include <stdio.h>
+#include <stdlib.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
+};
+
+const char *mount_opts[] =
+{
+ [RO_OPTION] = "ro",
+ [RW_OPTION] = "rw",
+ [READ_SIZE_OPTION] = "rsize",
+ [WRITE_SIZE_OPTION] = "wsize"
+};
+
+int
+main (int argc, char *argv[])
+{
+ char *subopts, *value;
+ int opt;
+
+ while ((opt = getopt (argc, argv, "at:o:")) != EOF)
+ switch (opt)
+ {
+ case 'a':
+ do_all = 1;
+ break;
+ case 't':
+ type = optarg;
+ break;
+ case 'o':
+ subopts = optarg;
+ while (*subopts != '\0')
+ switch (getsubopt (&subopts, 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;
+}