diff options
author | Miklos Szeredi <miklos@szeredi.hu> | 2005-02-08 16:15:58 +0000 |
---|---|---|
committer | Miklos Szeredi <miklos@szeredi.hu> | 2005-02-08 16:15:58 +0000 |
commit | a464d3ec2c93e65da4ae752ac126c30e9897d63b (patch) | |
tree | 89f968f340ee8d4d381b8348a83941d0c040b33a /opts.c | |
parent | d5696036a516d330305ec2cd2fedc7d934d36f1d (diff) | |
download | sshfs-a464d3ec2c93e65da4ae752ac126c30e9897d63b.tar sshfs-a464d3ec2c93e65da4ae752ac126c30e9897d63b.tar.gz sshfs-a464d3ec2c93e65da4ae752ac126c30e9897d63b.tar.bz2 sshfs-a464d3ec2c93e65da4ae752ac126c30e9897d63b.zip |
option parsing
Diffstat (limited to 'opts.c')
-rw-r--r-- | opts.c | 99 |
1 files changed, 99 insertions, 0 deletions
@@ -0,0 +1,99 @@ +/* + Mount option parsing + Copyright (C) 2004 Miklos Szeredi <miklos@szeredi.hu> + + This program can be distributed under the terms of the GNU GPL. + See the file COPYING. +*/ + +#include "opts.h" +#include <string.h> +#include <stdlib.h> + +static int process_option(char *arg, struct opt opts[], int case_sensitive) +{ + int i; + char *eq = strchr(arg, '='); + if (eq) + *eq = '\0'; + + for (i = 0; opts[i].optname != NULL; i++) { + if (case_sensitive) { + if (strcmp(opts[i].optname, arg) == 0) + break; + } else if (strcasecmp(opts[i].optname, arg) == 0) + break; + } + if (opts[i].optname == NULL) { + if (eq) + *eq = '='; + return 0; + } + opts[i].present = 1; + if (eq) { + if (opts[i].value) + free(opts[i].value); + opts[i].value = strdup(eq+1); + } + return 1; +} + +static int process_option_group(char *arg, struct opt opts[], + int case_sensitive) +{ + int remove = 1; + char *prevcomma = NULL; + while (1) { + int remove_one; + char *comma = strchr(arg, ','); + if (comma) + *comma = '\0'; + remove_one = process_option(arg, opts, case_sensitive); + if (remove_one) { + if (comma) + memmove(arg, comma + 1, strlen(comma + 1)); + } else { + remove = 0; + if (comma) + arg = comma + 1; + } + if (!remove_one && prevcomma) + *prevcomma = ','; + if (!comma) + break; + prevcomma = comma; + } + return remove; +} + +void process_options(int *argcp, char *argv[], struct opt opts[], + int case_sensitive) +{ + int argctr; + int newargctr; + + for (argctr = 1, newargctr = 1; argctr < *argcp; argctr++) { + char *arg = argv[argctr]; + int removed = 0; + if (arg[0] == '-' && arg[1] == 'o') { + if (arg[2]) + removed = process_option_group(arg+2, opts, case_sensitive); + else { + if (argctr + 1 < *argcp) { + argctr++; + arg = argv[argctr]; + removed = process_option_group(arg, opts, case_sensitive); + if (!removed && argctr != newargctr) + argv[newargctr++] = argv[argctr-1]; + } + } + } + if (!removed) { + if(argctr != newargctr) + argv[newargctr] = arg; + newargctr++; + } + } + *argcp = newargctr; +} + |