/** * match_strdup: - allocate a new string with the contents of a substring_t * @s: &substring_t to copy * * Description: Allocates and returns a string filled with the contents of * the &substring_t @s. The caller is responsible for freeing the returned * string with kfree(). */ char *match_strdup(const substring_t *s) { char *p = kmalloc(s->to - s->from + 1, GFP_KERNEL); if (p) match_strcpy(p, s); return p; }
static void v9fs_parse_options(char *options, struct v9fs_session_info *v9ses) { char *p; substring_t args[MAX_OPT_ARGS]; int option; int ret; /* setup defaults */ v9ses->port = V9FS_PORT; v9ses->maxdata = 9000; v9ses->proto = PROTO_TCP; v9ses->extended = 1; v9ses->afid = ~0; v9ses->debug = 0; v9ses->rfdno = ~0; v9ses->wfdno = ~0; if (!options) return; while ((p = strsep(&options, ",")) != NULL) { int token; if (!*p) continue; token = match_token(p, tokens, args); if (token < Opt_uname) { if ((ret = match_int(&args[0], &option)) < 0) { dprintk(DEBUG_ERROR, "integer field, but no integer?\n"); continue; } } switch (token) { case Opt_port: v9ses->port = option; break; case Opt_msize: v9ses->maxdata = option; break; case Opt_uid: v9ses->uid = option; break; case Opt_gid: v9ses->gid = option; break; case Opt_afid: v9ses->afid = option; break; case Opt_rfdno: v9ses->rfdno = option; break; case Opt_wfdno: v9ses->wfdno = option; break; case Opt_debug: v9ses->debug = option; break; case Opt_tcp: v9ses->proto = PROTO_TCP; break; case Opt_unix: v9ses->proto = PROTO_UNIX; break; case Opt_fd: v9ses->proto = PROTO_FD; break; case Opt_uname: match_strcpy(v9ses->name, &args[0]); break; case Opt_remotename: match_strcpy(v9ses->remotename, &args[0]); break; case Opt_legacy: v9ses->extended = 0; break; case Opt_nodevmap: v9ses->nodev = 1; break; default: continue; } } }