Browse Source

extend delete command so it can delete list elemets using index

Luka Perkov 11 years ago
parent
commit
e81961bde8
3 changed files with 27 additions and 6 deletions
  1. 5 2
      cli.c
  2. 1 1
      delta.c
  3. 21 3
      list.c

+ 5 - 2
cli.c

@@ -138,7 +138,7 @@ static void uci_usage(void)
 		"\tshow       [<config>[.<section>[.<option>]]]\n"
 		"\tget        <config>.<section>[.<option>]\n"
 		"\tset        <config>.<section>[.<option>]=<value>\n"
-		"\tdelete     <config>[.<section[.<option>]]\n"
+		"\tdelete     <config>[.<section>[[.<option>][=<id>]]]\n"
 		"\trename     <config>.<section>[.<option>]=<name>\n"
 		"\trevert     <config>[.<section>[.<option>]]\n"
 		"\treorder    <config>.<section>=<position>\n"
@@ -414,6 +414,7 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
 	struct uci_element *e;
 	struct uci_ptr ptr;
 	int ret = UCI_OK;
+	int dummy;
 
 	if (argc != 2)
 		return 255;
@@ -423,7 +424,7 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
 		return 1;
 	}
 
-	if (ptr.value && (cmd != CMD_SET) &&
+	if (ptr.value && (cmd != CMD_SET) && (cmd != CMD_DEL) &&
 	    (cmd != CMD_ADD_LIST) && (cmd != CMD_DEL_LIST) &&
 	    (cmd != CMD_RENAME) && (cmd != CMD_REORDER))
 		return 1;
@@ -472,6 +473,8 @@ static int uci_do_section_cmd(int cmd, int argc, char **argv)
 		ret = uci_reorder_section(ctx, ptr.s, strtoul(ptr.value, NULL, 10));
 		break;
 	case CMD_DEL:
+		if (ptr.value && !sscanf(ptr.value, "%d", &dummy))
+			return 1;
 		ret = uci_delete(ctx, &ptr);
 		break;
 	}

+ 1 - 1
delta.c

@@ -480,7 +480,7 @@ int uci_save(struct uci_context *ctx, struct uci_package *p)
 		if (e->name)
 			fprintf(f, ".%s", e->name);
 
-		if (h->cmd == UCI_CMD_REMOVE)
+		if (h->cmd == UCI_CMD_REMOVE && !h->value)
 			fprintf(f, "\n");
 		else
 			fprintf(f, "=%s\n", h->value);

+ 21 - 3
list.c

@@ -549,19 +549,37 @@ int uci_delete(struct uci_context *ctx, struct uci_ptr *ptr)
 	/* NB: pass on internal flag to uci_del_element */
 	bool internal = ctx && ctx->internal;
 	struct uci_package *p;
-	struct uci_element *e;
+	struct uci_element *e1, *e2, *tmp;
+	int index;
 
 	UCI_HANDLE_ERR(ctx);
 
-	e = uci_expand_ptr(ctx, ptr, true);
+	e1 = uci_expand_ptr(ctx, ptr, true);
 	p = ptr->p;
 
 	UCI_ASSERT(ctx, ptr->s);
 
+	if (ptr->value && ptr->o && ptr->o->type == UCI_TYPE_LIST) {
+		if (!sscanf(ptr->value, "%d", &index))
+			return 1;
+
+		uci_foreach_element_safe(&ptr->o->v.list, tmp, e2) {
+			if (index == 0) {
+				if (!internal && p->has_delta)
+					uci_add_delta(ctx, &p->delta, UCI_CMD_REMOVE, ptr->section, ptr->option, ptr->value);
+				uci_free_option(uci_to_option(e2));
+				return 0;
+			}
+			index--;
+		}
+
+		return 0;
+	}
+
 	if (!internal && p->has_delta)
 		uci_add_delta(ctx, &p->delta, UCI_CMD_REMOVE, ptr->section, ptr->option, NULL);
 
-	uci_free_any(&e);
+	uci_free_any(&e1);
 
 	if (ptr->option)
 		ptr->o = NULL;