confile: preserve newlines

Users were confused when the config file created during cloning or copying a container suddenly missed all newlines. Let's keep them. Signed-off-by: 's avatarChristian Brauner <christian.brauner@ubuntu.com>
parent 9dacc13c
...@@ -2299,44 +2299,51 @@ struct parse_line_conf { ...@@ -2299,44 +2299,51 @@ struct parse_line_conf {
static int parse_line(char *buffer, void *data) static int parse_line(char *buffer, void *data)
{ {
struct lxc_config_t *config;
char *dot, *key, *line, *linep, *value; char *dot, *key, *line, *linep, *value;
struct parse_line_conf *plc = data; bool empty_line;
struct lxc_config_t *config;
int ret = 0; int ret = 0;
char *dup = buffer;
struct parse_line_conf *plc = data;
if (lxc_is_line_empty(buffer)) /* If there are newlines in the config file we should keep them. */
return 0; empty_line = lxc_is_line_empty(dup);
if (empty_line)
dup = "\n";
/* we have to dup the buffer otherwise, at the re-exec for /* we have to dup the buffer otherwise, at the re-exec for
* reboot we modified the original string on the stack by * reboot we modified the original string on the stack by
* replacing '=' by '\0' below * replacing '=' by '\0' below
*/ */
linep = line = strdup(buffer); linep = line = strdup(buffer);
if (!line) { if (!line)
SYSERROR("failed to allocate memory for '%s'", buffer);
return -1; return -1;
if (!plc->from_include) {
ret = append_unexp_config_line(line, plc->conf);
if (ret < 0)
goto on_error;
} }
if (!plc->from_include) if (empty_line)
if ((ret = append_unexp_config_line(line, plc->conf))) return 0;
goto out;
line += lxc_char_left_gc(line, strlen(line)); line += lxc_char_left_gc(line, strlen(line));
/* ignore comments */ /* ignore comments */
if (line[0] == '#') if (line[0] == '#')
goto out; goto on_error;
/* martian option - don't add it to the config itself */ /* martian option - don't add it to the config itself */
if (strncmp(line, "lxc.", 4)) if (strncmp(line, "lxc.", 4))
goto out; goto on_error;
ret = -1; ret = -1;
dot = strstr(line, "="); dot = strchr(line, '=');
if (!dot) { if (!dot) {
ERROR("invalid configuration line: %s", line); ERROR("Invalid configuration line: %s", line);
goto out; goto on_error;
} }
*dot = '\0'; *dot = '\0';
...@@ -2358,13 +2365,13 @@ static int parse_line(char *buffer, void *data) ...@@ -2358,13 +2365,13 @@ static int parse_line(char *buffer, void *data)
config = lxc_getconfig(key); config = lxc_getconfig(key);
if (!config) { if (!config) {
ERROR("unknown key %s", key); ERROR("Unknown configuration key \"%s\"", key);
goto out; goto on_error;
} }
ret = config->set(key, value, plc->conf, data); ret = config->set(key, value, plc->conf, data);
out: on_error:
free(linep); free(linep);
return ret; return ret;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment