Browse Source

Revert "mandatory anonymous section identifier"

This reverts commits:
df72af474075 "mandatory anonymous section identifier"
2eb9c097e392 "cli: remove now-defunct UCI_FLAG_EXPORT_NAME support"
fe45f97302cb "test: adjust for auto-naming anonymous sections"

After some discussion we came to the conclusion that we need a different
fix.

Signed-off-by: Felix Fietkau <nbd@nbd.name>
Felix Fietkau 3 years ago
parent
commit
c203c2f900
5 changed files with 19 additions and 37 deletions
  1. 8 4
      cli.c
  2. 5 26
      file.c
  3. 3 3
      list.c
  4. 2 2
      test/references/show_parsing_multiline_package.result
  5. 1 2
      uci.h

+ 8 - 4
cli.c

@@ -156,6 +156,8 @@ static void uci_usage(void)
 		"\t-d <str>   set the delimiter for list values in uci show\n"
 		"\t-f <file>  use <file> as input instead of stdin\n"
 		"\t-m         when importing, merge data into an existing package\n"
+		"\t-n         name unnamed sections on export (default)\n"
+		"\t-N         don't name unnamed sections\n"
 		"\t-p <path>  add a search path for config change files\n"
 		"\t-P <path>  add a search path for config change files and use as default\n"
 		"\t-q         quiet mode (don't print error messages)\n"
@@ -727,6 +729,12 @@ int main(int argc, char **argv)
 				ctx->flags &= ~UCI_FLAG_STRICT;
 				ctx->flags |= UCI_FLAG_PERROR;
 				break;
+			case 'n':
+				ctx->flags |= UCI_FLAG_EXPORT_NAME;
+				break;
+			case 'N':
+				ctx->flags &= ~UCI_FLAG_EXPORT_NAME;
+				break;
 			case 'p':
 				uci_add_delta_path(ctx, optarg);
 				break;
@@ -741,10 +749,6 @@ int main(int argc, char **argv)
 			case 'X':
 				flags &= ~CLI_FLAG_SHOW_EXT;
 				break;
-			case 'n':
-			case 'N':
-				/* obsolete */
-				break;
 			default:
 				uci_usage();
 				return 0;

+ 5 - 26
file.c

@@ -288,27 +288,6 @@ int uci_parse_argument(struct uci_context *ctx, FILE *stream, char **str, char *
 	return 0;
 }
 
-/*
- * Fixup sections functions does the fixup of all sections for given package.
- * It is used as a preprocessing step for fixing up existing anonymous sections
- * from configurations.
- *
- * It uses uci_fixup_section() from list.c and then adds delta changes.
- */
-static void
-uci_fixup_sections(struct uci_context *ctx, struct uci_package *p)
-{
-	struct uci_element *e;
-	struct uci_section *s;
-
-	uci_foreach_element(&p->sections, e) {
-		s = uci_to_section(e);
-		s->package->name_index++;
-		uci_fixup_section(ctx, s);
-		s->anonymous = false;
-	}
-}
-
 static int
 uci_fill_ptr(struct uci_context *ctx, struct uci_ptr *ptr, struct uci_element *e)
 {
@@ -431,6 +410,7 @@ static void uci_parse_config(struct uci_context *ctx)
 	char *name;
 	char *type;
 
+	uci_fixup_section(ctx, ctx->pctx->section);
 	if (!ctx->pctx->package) {
 		if (!ctx->pctx->name)
 			uci_parse_error(ctx, "attempting to import a file without a package name");
@@ -626,7 +606,8 @@ static void uci_export_package(struct uci_package *p, FILE *stream, bool header)
 	uci_foreach_element(&p->sections, s) {
 		struct uci_section *sec = uci_to_section(s);
 		fprintf(stream, "\nconfig %s", uci_escape(ctx, sec->type));
-		fprintf(stream, " '%s'", uci_escape(ctx, sec->e.name));
+		if (!sec->anonymous || (ctx->flags & UCI_FLAG_EXPORT_NAME))
+			fprintf(stream, " '%s'", uci_escape(ctx, sec->e.name));
 		fprintf(stream, "\n");
 		uci_foreach_element(&sec->options, o) {
 			struct uci_option *opt = uci_to_option(o);
@@ -710,6 +691,7 @@ error:
 			UCI_THROW(ctx, ctx->err);
 	}
 
+	uci_fixup_section(ctx, ctx->pctx->section);
 	if (!pctx->package && name)
 		uci_switch_config(ctx);
 	if (package)
@@ -717,7 +699,6 @@ error:
 	if (pctx->merge)
 		pctx->package = NULL;
 
-	uci_fixup_sections(ctx, *package);
 	pctx->name = NULL;
 	uci_switch_config(ctx);
 
@@ -903,7 +884,6 @@ static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na
 	char *filename;
 	bool confdir;
 	FILE *file = NULL;
-	size_t n_change;
 
 	switch (name[0]) {
 	case '.':
@@ -933,8 +913,7 @@ static struct uci_package *uci_file_load(struct uci_context *ctx, const char *na
 	if (package) {
 		package->path = filename;
 		package->has_delta = confdir;
-		n_change = uci_load_delta(ctx, package, false);
-		package->name_index += n_change;
+		uci_load_delta(ctx, package, false);
 	}
 
 done:

+ 3 - 3
list.c

@@ -150,7 +150,7 @@ __private void uci_fixup_section(struct uci_context *ctx, struct uci_section *s)
 	struct uci_element *e;
 	char buf[16];
 
-	if (!s || !s->anonymous)
+	if (!s || s->e.name)
 		return;
 
 	/*
@@ -175,7 +175,7 @@ __private void uci_fixup_section(struct uci_context *ctx, struct uci_section *s)
 			break;
 		}
 	}
-	sprintf(buf, "cfg%02x%04x", s->package->name_index, hash % (1 << 16));
+	sprintf(buf, "cfg%02x%04x", ++s->package->n_section, hash % (1 << 16));
 	s->e.name = uci_strdup(ctx, buf);
 }
 
@@ -274,7 +274,7 @@ uci_lookup_list(struct uci_list *list, const char *name)
 	struct uci_element *e;
 
 	uci_foreach_element(list, e) {
-		if (e->name && !strcmp(e->name, name))
+		if (!strcmp(e->name, name))
 			return e;
 	}
 	return NULL;

+ 2 - 2
test/references/show_parsing_multiline_package.result

@@ -1,5 +1,5 @@
-sockd.cfg01ca82=main
-sockd.cfg01ca82.version='1.4.1'
+sockd.@main[0]=main
+sockd.@main[0].version='1.4.1'
 sockd.instance0=sockd
 sockd.instance0.enabled='1'
 sockd.instance0.internal_network='vpn'

+ 1 - 2
uci.h

@@ -370,7 +370,7 @@ enum uci_option_type {
 enum uci_flags {
 	UCI_FLAG_STRICT =        (1 << 0), /* strict mode for the parser */
 	UCI_FLAG_PERROR =        (1 << 1), /* print parser error messages */
-	UCI_FLAG_EXPORT_NAME =   (1 << 2), /* when exporting, name unnamed sections [unused] */
+	UCI_FLAG_EXPORT_NAME =   (1 << 2), /* when exporting, name unnamed sections */
 	UCI_FLAG_SAVED_DELTA = (1 << 3), /* store the saved delta in memory as well */
 };
 
@@ -435,7 +435,6 @@ struct uci_package
 	struct uci_backend *backend;
 	void *priv;
 	int n_section;
-	int name_index;
 	struct uci_list delta;
 	struct uci_list saved_delta;
 };