From: Serge Hallyn <serge.hal...@ubuntu.com> Signed-off-by: Serge Hallyn <serge.hal...@ubuntu.com> --- src/lxc/lxc_user_nic.c | 42 ++++++++++++++++++++++++++++++++---------- 1 file changed, 32 insertions(+), 10 deletions(-)
diff --git a/src/lxc/lxc_user_nic.c b/src/lxc/lxc_user_nic.c index 7d367c1..7ac3020 100644 --- a/src/lxc/lxc_user_nic.c +++ b/src/lxc/lxc_user_nic.c @@ -622,11 +622,19 @@ static bool get_nic_from_line(char *p, char **nic) return true; } +struct entry_line { + char *start; + int len; + bool keep; +}; + static bool cull_entries(int fd, char *me, char *t, char *br) { struct stat sb; char *buf, *p, *e, *nic; off_t len; + struct entry_line *entry_lines = NULL; + int i, n = 0; nic = alloca(100); @@ -643,22 +651,36 @@ static bool cull_entries(int fd, char *me, char *t, char *br) p = buf; e = buf + len; while ((p = find_line(p, e, me, t, br)) != NULL) { + struct entry_line *newe = realloc(entry_lines, n+1); + if (!newe) { + free(entry_lines); + return false; + } + entry_lines = newe; + entry_lines[n].start = p; + entry_lines[n].len = get_eol(p) - entry_lines[n].start; + entry_lines[n].keep = true; + n++; if (!get_nic_from_line(p, &nic)) continue; - if (nic && !nic_exists(nic)) { - // copy from eol(p)+1..e to p - char *src = get_eol(p) + 1, *dest = p; - int diff = src - p; - while (src < e) - *(dest++) = *(src)++; - e -= diff; - } else - p = get_eol(p) + 1; + if (nic && !nic_exists(nic)) + entry_lines[n-1].keep = false; + p += entry_lines[n-1].len + 1; if (p >= e) break; } + p = buf; + for (i=0; i<n; i++) { + if (!entry_lines[i].keep) + continue; + memcpy(p, entry_lines[i].start, entry_lines[i].len); + p += entry_lines[i].len; + *p = '\n'; + p++; + } + free(entry_lines); munmap(buf, sb.st_size); - if (ftruncate(fd, e-buf)) + if (ftruncate(fd, p-buf)) fprintf(stderr, "Failed to set new file size\n"); return true; } -- 1.8.3.2 ------------------------------------------------------------------------------ Shape the Mobile Experience: Free Subscription Software experts and developers: Be at the forefront of tech innovation. Intel(R) Software Adrenaline delivers strategic insight and game-changing conversations that shape the rapidly evolving mobile landscape. Sign up now. http://pubads.g.doubleclick.net/gampad/clk?id=63431311&iu=/4140/ostg.clktrk _______________________________________________ Lxc-devel mailing list Lxc-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/lxc-devel