From b733cccf1a835b91de3fbdd098e0f2fd076a4793 Mon Sep 17 00:00:00 2001 From: Pino Toscano Date: Fri, 7 Sep 2012 18:24:20 +0200 Subject: [PATCH 2/2] tmpfs: add --size Add the possibility to specify the size with the --size parameter; this makes tmpfs more usable in fstab or Linuxish mount invocations, since the size in such cases is a mount -o option, which gets translated to a --foo translator argument. The old way (specifying the size as the first argument) is left there; although, if --size is passed then the first argument must be "tmpfs", as it is what is passed by fstab/mount. * tmpfs/tmpfs.c (OPT_SIZE): New macro. (options): Add the "size" option. (parse_opt): Use -1 to indicate when SIZE is not yet set. : Handle case. : Error out only when SIZE is not set. : Error out when SIZE is set and the argument is not "tmpfs". --- tmpfs/tmpfs.c | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/tmpfs/tmpfs.c b/tmpfs/tmpfs.c index 2a98178..8379528 100644 --- a/tmpfs/tmpfs.c +++ b/tmpfs/tmpfs.c @@ -100,9 +100,12 @@ diskfs_reload_global_state () int diskfs_synchronous = 0; +#define OPT_SIZE 600 /* --size */ + static const struct argp_option options[] = { {"mode", 'm', "MODE", 0, "Permissions (octal) for root directory"}, + {"size", OPT_SIZE, "MAX-BYTES", 0, "Maximum size"}, {NULL,} }; @@ -188,7 +191,7 @@ parse_opt (int key, char *arg, struct argp_state *state) if (values == 0) return ENOMEM; state->hook = values; - values->size = 0; + values->size = -1; values->mode = -1; break; case ARGP_KEY_FINI: @@ -214,9 +217,21 @@ parse_opt (int key, char *arg, struct argp_state *state) } break; + case OPT_SIZE: /* --size=MAX-BYTES */ + { + error_t err = parse_opt_size (arg, state, &values->size); + if (err) + return err; + } + break; + case ARGP_KEY_NO_ARGS: - argp_error (state, "must supply maximum size"); - return EINVAL; + if (values->size < 0) + { + argp_error (state, "must supply maximum size"); + return EINVAL; + } + break; case ARGP_KEY_ARGS: if (state->argv[state->next + 1] != 0) @@ -224,6 +239,14 @@ parse_opt (int key, char *arg, struct argp_state *state) argp_error (state, "too many arguments"); return EINVAL; } + else if (values->size >= 0) + { + if (strcmp (state->argv[state->next], "tmpfs") != 0) + { + argp_error (state, "size specified with --size and argument is not \"tmpfs\""); + return EINVAL; + } + } else { error_t err = parse_opt_size (state->argv[state->next], state, -- 1.7.10.4