diff options
Diffstat (limited to 'util-linux/mount.c')
| -rw-r--r-- | util-linux/mount.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/util-linux/mount.c b/util-linux/mount.c index d0f0ae1ad..d0d109c09 100644 --- a/util-linux/mount.c +++ b/util-linux/mount.c | |||
| @@ -556,27 +556,33 @@ static int verbose_mount(const char *source, const char *target, | |||
| 556 | #endif | 556 | #endif |
| 557 | 557 | ||
| 558 | // Append mount options to string | 558 | // Append mount options to string |
| 559 | // ("merge two comma-separated lists" is a good candidate for libbb!) | ||
| 559 | static void append_mount_options(char **oldopts, const char *newopts) | 560 | static void append_mount_options(char **oldopts, const char *newopts) |
| 560 | { | 561 | { |
| 561 | if (*oldopts && **oldopts) { | 562 | if (*oldopts && **oldopts) { |
| 563 | //TODO: do this unconditionally? | ||
| 564 | //this way, newopts of "opt1,opt2,opt1" | ||
| 565 | //will be de-duped into "opt1,opt2" in _both_ cases | ||
| 566 | //(whether or now old opts are empty) | ||
| 567 | //the only modification needed is to not prepend extra comma | ||
| 568 | //when old opts is "". | ||
| 562 | // Do not insert options which are already there | 569 | // Do not insert options which are already there |
| 563 | while (newopts[0]) { | 570 | while (*newopts) { |
| 564 | char *p; | 571 | char *p; |
| 565 | int len; | 572 | int len; |
| 566 | 573 | ||
| 574 | //if (*newopts == ',') { newopts++; continue; } | ||
| 567 | len = strchrnul(newopts, ',') - newopts; | 575 | len = strchrnul(newopts, ',') - newopts; |
| 568 | p = *oldopts; | 576 | p = *oldopts; |
| 569 | while (1) { | 577 | while (1) { |
| 570 | if (!strncmp(p, newopts, len) | 578 | if (strncmp(p, newopts, len) == 0 |
| 571 | && (p[len] == ',' || p[len] == '\0')) | 579 | && (p[len] == ',' || p[len] == '\0')) |
| 572 | goto skip; | 580 | goto skip; |
| 573 | p = strchr(p,','); | 581 | p = strchr(p, ','); |
| 574 | if (!p) break; | 582 | if (!p) break; |
| 575 | p++; | 583 | p++; |
| 576 | } | 584 | } |
| 577 | p = xasprintf("%s,%.*s", *oldopts, len, newopts); | 585 | xasprintf_inplace(*oldopts, "%s,%.*s", *oldopts, len, newopts); |
| 578 | free(*oldopts); | ||
| 579 | *oldopts = p; | ||
| 580 | skip: | 586 | skip: |
| 581 | newopts += len; | 587 | newopts += len; |
| 582 | while (*newopts == ',') newopts++; | 588 | while (*newopts == ',') newopts++; |
| @@ -2065,12 +2071,11 @@ static int singlemount(struct mntent *mp, int ignore_busy) | |||
| 2065 | if (!is_prefixed_with(filteropts, ",ip="+1) | 2071 | if (!is_prefixed_with(filteropts, ",ip="+1) |
| 2066 | && !strstr(filteropts, ",ip=") | 2072 | && !strstr(filteropts, ",ip=") |
| 2067 | ) { | 2073 | ) { |
| 2068 | char *dotted, *ip; | 2074 | char *ip; |
| 2069 | // Insert "ip=..." option into options | 2075 | // Insert "ip=..." option into options |
| 2070 | dotted = xmalloc_sockaddr2dotted_noport(&lsa->u.sa); | 2076 | ip = xmalloc_sockaddr2dotted_noport(&lsa->u.sa); |
| 2071 | if (ENABLE_FEATURE_CLEAN_UP) free(lsa); | 2077 | if (ENABLE_FEATURE_CLEAN_UP) free(lsa); |
| 2072 | ip = xasprintf("ip=%s", dotted); | 2078 | xasprintf_inplace(ip, "ip=%s", ip); |
| 2073 | if (ENABLE_FEATURE_CLEAN_UP) free(dotted); | ||
| 2074 | // Note: IPv6 scoped addresses ("host%iface", see RFC 4007) should be | 2079 | // Note: IPv6 scoped addresses ("host%iface", see RFC 4007) should be |
| 2075 | // handled by libc in getnameinfo() (inside xmalloc_sockaddr2dotted_noport()). | 2080 | // handled by libc in getnameinfo() (inside xmalloc_sockaddr2dotted_noport()). |
| 2076 | // Currently, glibc does not support that (has no NI_NUMERICSCOPE), | 2081 | // Currently, glibc does not support that (has no NI_NUMERICSCOPE), |
