linux/fs/smbfs/getopt.c
<<
>>
Prefs
   1/*
   2 * getopt.c
   3 */
   4
   5#include <linux/kernel.h>
   6#include <linux/string.h>
   7#include <linux/net.h>
   8
   9#include "getopt.h"
  10
  11/**
  12 *      smb_getopt - option parser
  13 *      @caller: name of the caller, for error messages
  14 *      @options: the options string
  15 *      @opts: an array of &struct option entries controlling parser operations
  16 *      @optopt: output; will contain the current option
  17 *      @optarg: output; will contain the value (if one exists)
  18 *      @flag: output; may be NULL; should point to a long for or'ing flags
  19 *      @value: output; may be NULL; will be overwritten with the integer value
  20 *              of the current argument.
  21 *
  22 *      Helper to parse options on the format used by mount ("a=b,c=d,e,f").
  23 *      Returns opts->val if a matching entry in the 'opts' array is found,
  24 *      0 when no more tokens are found, -1 if an error is encountered.
  25 */
  26int smb_getopt(char *caller, char **options, struct option *opts,
  27               char **optopt, char **optarg, unsigned long *flag,
  28               unsigned long *value)
  29{
  30        char *token;
  31        char *val;
  32        int i;
  33
  34        do {
  35                if ((token = strsep(options, ",")) == NULL)
  36                        return 0;
  37        } while (*token == '\0');
  38        *optopt = token;
  39
  40        *optarg = NULL;
  41        if ((val = strchr (token, '=')) != NULL) {
  42                *val++ = 0;
  43                if (value)
  44                        *value = simple_strtoul(val, NULL, 0);
  45                *optarg = val;
  46        }
  47
  48        for (i = 0; opts[i].name != NULL; i++) {
  49                if (!strcmp(opts[i].name, token)) {
  50                        if (!opts[i].flag && (!val || !*val)) {
  51                                printk("%s: the %s option requires an argument\n",
  52                                       caller, token);
  53                                return -1;
  54                        }
  55
  56                        if (flag && opts[i].flag)
  57                                *flag |= opts[i].flag;
  58
  59                        return opts[i].val;
  60                }
  61        }
  62        printk("%s: Unrecognized mount option %s\n", caller, token);
  63        return -1;
  64}
  65