enum libmnt_optsrc src;
- unsigned int external : 1; /* visible for external helpers only */
+ unsigned int external : 1, /* visible for external helpers only */
+ quoted : 1; /* name="value" */
};
struct libmnt_optlist {
opt->ent = ent;
if (valsz) {
+ if (*value == '"' && *(value + valsz - 1) == '"') {
+ opt->quoted = 1;
+ value++;
+ valsz -= 2;
+ }
opt->value = strndup(value, valsz);
if (!opt->value)
goto fail;
what == MNT_OL_FLTR_ALL ||
what == MNT_OL_FLTR_HELPERS)) {
- rc = mnt_buffer_append_option(&buf, "rw", 2, NULL, 0);
+ rc = mnt_buffer_append_option(&buf, "rw", 2, NULL, 0, 0);
if (rc)
goto fail;
xx_wanted = 1;
rc = mnt_buffer_append_option(&buf,
opt->name, strlen(opt->name),
opt->value,
- opt->value ? strlen(opt->value) : 0);
+ opt->value ? strlen(opt->value) : 0,
+ opt->quoted);
if (rc)
goto fail;
}
if (no) {
no->src = opt->src;
no->external = opt->external;
+ no->quoted = opt->quoted;
}
}
int mnt_opt_set_quoted_value(struct libmnt_opt *opt, const char *str)
{
- char *value = NULL;
-
- if (str && *str) {
- size_t len = strlen(str);
- char *p;
-
- assert(len);
- p = value = malloc(len + 3);
- if (!value)
- return -ENOMEM;
- *p++ = '"';
- memcpy(p, str, len);
- p += len;
- *p = '"';
- }
-
- free(opt->value);
- opt->value = value;
-
- return 0;
+ opt->quoted = 1;
+ return mnt_opt_set_value(opt, str);
}
int mnt_opt_set_external(struct libmnt_opt *opt, int enable)
int mnt_buffer_append_option(struct ul_buffer *buf,
const char *name, size_t namesz,
- const char *val, size_t valsz)
+ const char *val, size_t valsz,
+ int quoted)
{
int rc = 0;
/* we need to append '=' is value is empty string, see
* 727c689908c5e68c92aa1dd65e0d3bdb6d91c1e5 */
rc = ul_buffer_append_data(buf, "=", 1);
- if (!rc && valsz)
- rc = ul_buffer_append_data(buf, val, valsz);
+ if (!rc && valsz) {
+ if (quoted)
+ rc = ul_buffer_append_data(buf, "\"", 1);
+ if (!rc)
+ rc = ul_buffer_append_data(buf, val, valsz);
+ if (quoted)
+ rc = ul_buffer_append_data(buf, "\"", 1);
+ }
}
return rc;
}
ul_buffer_refer_string(&buf, *optstr);
ul_buffer_set_chunksize(&buf, osz + nsz + vsz + 3); /* to call realloc() only once */
- rc = mnt_buffer_append_option(&buf, name, nsz, value, vsz);
+ rc = mnt_buffer_append_option(&buf, name, nsz, value, vsz, 0);
if (!rc)
*optstr = ul_buffer_get_data(&buf, NULL, NULL);
else if (osz == 0)
ul_buffer_set_chunksize(&buf, osz + nsz + vsz + 3); /* to call realloc() only once */
- rc = mnt_buffer_append_option(&buf, name, nsz, value, vsz);
+ rc = mnt_buffer_append_option(&buf, name, nsz, value, vsz, 0);
if (*optstr && !rc) {
rc = ul_buffer_append_data(&buf, ",", 1);
if (!rc)
if (buf) {
if (ul_buffer_is_empty(buf))
ul_buffer_set_chunksize(buf, chunsz);
- rc = mnt_buffer_append_option(buf, name, namesz, val, valsz);
+ rc = mnt_buffer_append_option(buf, name, namesz, val, valsz, 0);
}
if (rc)
break;
if (valsz && mnt_optmap_entry_novalue(ent))
continue;
- rc = mnt_buffer_append_option(&buf, name, namesz, val, valsz);
+ rc = mnt_buffer_append_option(&buf, name, namesz, val, valsz, 0);
if (rc)
break;
}
} else
sz = strlen(ent->name);
- rc = mnt_buffer_append_option(&buf, ent->name, sz, NULL, 0);
+ rc = mnt_buffer_append_option(&buf, ent->name, sz, NULL, 0, 0);
if (rc)
break;
}