cleanup, move parse_tuple to libuci, add some input validation
[project/uci.git] / uci.h
diff --git a/uci.h b/uci.h
index 0c79587..0cb352d 100644 (file)
--- a/uci.h
+++ b/uci.h
@@ -29,6 +29,7 @@
 #define UCI_DEBUG_TYPECAST
 #endif
 
+#include <stdbool.h>
 #include <setjmp.h>
 #include <stdio.h>
 
@@ -42,6 +43,7 @@ enum
        UCI_ERR_NOTFOUND,
        UCI_ERR_IO,
        UCI_ERR_PARSE,
+       UCI_ERR_DUPLICATE,
        UCI_ERR_UNKNOWN,
        UCI_ERR_LAST
 };
@@ -58,10 +60,24 @@ struct uci_package;
 struct uci_section;
 struct uci_option;
 struct uci_history;
+struct uci_context;
 struct uci_parse_context;
 
 
 /**
+ * uci_parse_tuple: Parse an uci tuple
+ * @ctx: uci context
+ * @str: input string
+ * @package: output package pointer
+ * @section: output section pointer
+ * @option: output option pointer
+ * @value: output value pointer
+ *
+ * format: <package>[.<section>[.<option>]][=<value>]
+ */
+extern int uci_parse_tuple(struct uci_context *ctx, char *str, char **package, char **section, char **option, char **value);
+
+/**
  * uci_alloc_context: Allocate a new uci context
  */
 extern struct uci_context *uci_alloc_context(void);
@@ -84,18 +100,20 @@ extern void uci_perror(struct uci_context *ctx, const char *str);
  * @stream: file stream to import from
  * @name: (optional) assume the config has the given name
  * @package: (optional) store the last parsed config package in this variable
+ * @single: ignore the 'package' keyword and parse everything into a single package
  *
  * the name parameter is for config files that don't explicitly use the 'package <...>' keyword
  */
-extern int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct uci_package **package);
+extern int uci_import(struct uci_context *ctx, FILE *stream, const char *name, struct uci_package **package, bool single);
 
 /**
  * uci_export: Export one or all uci config packages
  * @ctx: uci context
  * @stream: output stream
  * @package: (optional) uci config package to export
+ * @header: include the package header
  */
-extern int uci_export(struct uci_context *ctx, FILE *stream, struct uci_package *package);
+extern int uci_export(struct uci_context *ctx, FILE *stream, struct uci_package *package, bool header);
 
 /**
  * uci_load: Parse an uci config file and store it in the uci context
@@ -110,9 +128,9 @@ extern int uci_load(struct uci_context *ctx, const char *name, struct uci_packag
  * uci_unload: Unload a config file from the uci context
  *
  * @ctx: uci context
- * @name: name of the config file
+ * @package: pointer to the uci_package struct
  */
-extern int uci_unload(struct uci_context *ctx, const char *name);
+extern int uci_unload(struct uci_context *ctx, struct uci_package *p);
 
 /**
  * uci_cleanup: Clean up after an error
@@ -126,14 +144,14 @@ extern int uci_cleanup(struct uci_context *ctx);
  *
  * @ctx: uci context
  * @res: where to store the result
- * @package: config package
+ * @package: uci_package struct 
  * @section: config section (optional)
  * @option: option to search for (optional)
  *
  * If section is omitted, then a pointer to the config package is returned
  * If option is omitted, then a pointer to the config section is returned
  */
-extern int uci_lookup(struct uci_context *ctx, struct uci_element **res, char *package, char *section, char *option);
+extern int uci_lookup(struct uci_context *ctx, struct uci_element **res, struct uci_package *package, char *section, char *option);
 
 /**
  * uci_set_element_value: Replace an element's value with a new one
@@ -157,6 +175,13 @@ extern int uci_set_element_value(struct uci_context *ctx, struct uci_element **e
 extern int uci_set(struct uci_context *ctx, char *package, char *section, char *option, char *value);
 
 /**
+ * uci_commit: commit changes to a package
+ * @ctx: uci context
+ * @p: uci_package struct
+ */
+extern int uci_commit(struct uci_context *ctx, struct uci_package *p);
+
+/**
  * uci_list_configs: List available uci config files
  *
  * @ctx: uci context
@@ -214,6 +239,9 @@ struct uci_package
        struct uci_element e;
        struct uci_list sections;
        struct uci_context *ctx;
+       bool confdir;
+       char *path;
+
        /* private: */
        int n_section;
        struct uci_list history;