]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
confile: list namespaced keys
authorChristian Brauner <christian.brauner@ubuntu.com>
Tue, 15 Aug 2017 23:24:20 +0000 (01:24 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Tue, 15 Aug 2017 23:48:20 +0000 (01:48 +0200)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/confile.c
src/lxc/confile.h
src/lxc/lxccontainer.c

index f9b3cf925a410223e0c49e0f57554ab6be011232..7bd71e366e83b2629bf0f16d0e09f18cdb0e973b 100644 (file)
@@ -4453,6 +4453,67 @@ int lxc_list_config_items(char *retv, int inlen)
        return fulllen;
 }
 
+int lxc_list_subkeys(struct lxc_conf *conf, const char *key, char *retv,
+                    int inlen)
+{
+       int len;
+       int fulllen = 0;
+
+       if (!retv)
+               inlen = 0;
+       else
+               memset(retv, 0, inlen);
+
+       if (!strcmp(key, "lxc.apparmor")) {
+               strprint(retv, inlen, "allow_incomplete\n");
+               strprint(retv, inlen, "profile\n");
+       } else if (!strcmp(key, "lxc.selinux")) {
+               strprint(retv, inlen, "context\n");
+       } else if (!strcmp(key, "lxc.mount")) {
+               strprint(retv, inlen, "auto\n");
+               strprint(retv, inlen, "entry\n");
+               strprint(retv, inlen, "fstab\n");
+       } else if (!strcmp(key, "lxc.rootfs")) {
+               strprint(retv, inlen, "mount\n");
+               strprint(retv, inlen, "options\n");
+               strprint(retv, inlen, "path\n");
+       } else if (!strcmp(key, "lxc.uts")) {
+               strprint(retv, inlen, "name\n");
+       } else if (!strcmp(key, "lxc.hook")) {
+               strprint(retv, inlen, "autodev\n");
+               strprint(retv, inlen, "clone\n");
+               strprint(retv, inlen, "destroy\n");
+               strprint(retv, inlen, "mount\n");
+               strprint(retv, inlen, "post-stop\n");
+               strprint(retv, inlen, "pre-mount\n");
+               strprint(retv, inlen, "pre-start\n");
+               strprint(retv, inlen, "start\n");
+               strprint(retv, inlen, "stop\n");
+       } else if (!strcmp(key, "lxc.cap")) {
+               strprint(retv, inlen, "drop\n");
+               strprint(retv, inlen, "keep\n");
+       } else if (!strcmp(key, "lxc.console")) {
+               strprint(retv, inlen, "logfile\n");
+               strprint(retv, inlen, "path\n");
+       } else if (!strcmp(key, "lxc.seccomp")) {
+               strprint(retv, inlen, "profile\n");
+       } else if (!strcmp(key, "lxc.signal")) {
+               strprint(retv, inlen, "halt\n");
+               strprint(retv, inlen, "reboot\n");
+               strprint(retv, inlen, "stop\n");
+       } else if (!strcmp(key, "lxc.start")) {
+               strprint(retv, inlen, "auto\n");
+               strprint(retv, inlen, "delay\n");
+               strprint(retv, inlen, "order\n");
+       } else if (!strcmp(key, "lxc.monitor")) {
+               strprint(retv, inlen, "unshare\n");
+       } else {
+               fulllen = -1;
+       }
+
+       return fulllen;
+}
+
 int lxc_list_net(struct lxc_conf *c, const char *key, char *retv, int inlen)
 {
        int len;
index 88a98cfb2fa04f19ba51bbcc390aaddac4098076..50c09ba2951e3da047777bea72c1b7787532df35 100644 (file)
 struct lxc_conf;
 struct lxc_list;
 
+/* Callback prototype to set a configuration item.
+ * Must be implemented when adding a new configuration key.
+ */
 typedef int (*config_set_cb)(const char *key, const char *value,
                             struct lxc_conf *conf, void *data);
+
+/* Callback prototype to get a configuration item.
+ * Must be implemented when adding a new configuration key.
+ */
 typedef int (*config_get_cb)(const char *key, char *value, int inlen,
                             struct lxc_conf *conf, void *data);
+
+/* Callback prototype to clear a configuration item.
+ * Must be implemented when adding a new configuration key.
+ */
 typedef int (*config_clr_cb)(const char *key, struct lxc_conf *conf,
                             void *data);
 
@@ -47,37 +58,60 @@ struct lxc_config_t {
        config_clr_cb clr;
 };
 
+/* Get the jump table entry for the given configuration key. */
 extern struct lxc_config_t *lxc_get_config(const char *key);
 
+/* List all available config items. */
+extern int lxc_list_config_items(char *retv, int inlen);
+
+/* Given a configuration key namespace (e.g. lxc.apparmor) list all associated
+ * subkeys for that namespace.
+ * Must be implemented when adding a new configuration key.
+ */
+extern int lxc_list_subkeys(struct lxc_conf *conf, const char *key, char *retv,
+                           int inlen);
+
 /* List all configuration items associated with a given network. For example
  * pass "lxc.net.[i]" to retrieve all configuration items associated with
  * the network associated with index [i].
  */
 extern int lxc_list_net(struct lxc_conf *c, const char *key, char *retv,
                        int inlen);
-extern int lxc_list_config_items(char *retv, int inlen);
-extern int lxc_config_read(const char *file, struct lxc_conf *conf, bool from_include);
+
+extern int lxc_config_read(const char *file, struct lxc_conf *conf,
+                          bool from_include);
+
 extern int append_unexp_config_line(const char *line, struct lxc_conf *conf);
 
 extern int lxc_config_define_add(struct lxc_list *defines, char* arg);
+
 extern int lxc_config_define_load(struct lxc_list *defines,
                                  struct lxc_conf *conf);
 
 /* needed for lxc-attach */
 extern signed long lxc_config_parse_arch(const char *arch);
+
 extern int lxc_fill_elevated_privileges(char *flaglist, int *flags);
 
 extern int lxc_clear_config_item(struct lxc_conf *c, const char *key);
+
 extern void write_config(FILE *fout, struct lxc_conf *c);
 
-extern bool do_append_unexp_config_line(struct lxc_conf *conf, const char *key, const char *v);
+extern bool do_append_unexp_config_line(struct lxc_conf *conf, const char *key,
+                                       const char *v);
 
 /* These are used when cloning a container */
-extern void clear_unexp_config_line(struct lxc_conf *conf, const char *key, bool rm_subkeys);
+extern void clear_unexp_config_line(struct lxc_conf *conf, const char *key,
+                                   bool rm_subkeys);
+
 extern bool clone_update_unexp_hooks(struct lxc_conf *conf, const char *oldpath,
-       const char *newpath, const char *oldname, const char *newmame);
+                                    const char *newpath, const char *oldname,
+                                    const char *newmame);
+
 bool clone_update_unexp_ovl_paths(struct lxc_conf *conf, const char *oldpath,
                                  const char *newpath, const char *oldname,
                                  const char *newname, const char *ovldir);
+
 extern bool network_new_hwaddrs(struct lxc_conf *conf);
-#endif
+
+#endif /* __LXC_CONFILE_H */
index 564d3aa7e6046c4723eef41c6d43ccccdc98d126..1f15ee1df08f04dd952411d73224ee88c0f4a1bb 100644 (file)
@@ -2268,6 +2268,8 @@ static int do_lxcapi_get_keys(struct lxc_container *c, const char *key, char *re
                ret = lxc_list_net(c->lxc_conf, key, retv, inlen);
        else if (strncmp(key, "lxc.network.", 12) == 0)
                ret = lxc_list_nicconfigs_legacy(c->lxc_conf, key, retv, inlen);
+       else
+               ret = lxc_list_subkeys(c->lxc_conf, key, retv, inlen);
 
        container_mem_unlock(c);
        return ret;