]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
api_extensions: introduce lxc_has_api_extension() 2630/head
authorChristian Brauner <christian.brauner@ubuntu.com>
Fri, 21 Sep 2018 08:28:34 +0000 (10:28 +0200)
committerChristian Brauner <christian.brauner@ubuntu.com>
Fri, 21 Sep 2018 13:17:15 +0000 (15:17 +0200)
This is modeled after LXD's API extension checks. This allows API users
to query the given LXC instance whether a given API extension is
supported.

Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
doc/api-extensions.md [new file with mode: 0644]
src/lxc/Makefile.am
src/lxc/api_extensions.h [new file with mode: 0644]
src/lxc/lxccontainer.c
src/lxc/lxccontainer.h

diff --git a/doc/api-extensions.md b/doc/api-extensions.md
new file mode 100644 (file)
index 0000000..f071237
--- /dev/null
@@ -0,0 +1,34 @@
+# API extensions
+
+The changes below were introduced to the LXC API after the 3.0 API was finalized.
+
+They are all backward compatible and can be detected by client tools by
+called the `lxc_has_api_extension` function.
+
+## lxc\_log
+
+This introduces a way to initialize a logging instance from the API for a given
+container.
+
+## lxc\_config\_item\_is\_supported
+
+This introduces the `lxc_config_item_is_supported` function. It allows users to
+check whether their LXC instance supports a given configuration key.
+
+## console\_log
+
+This adds support to container's console log. The console log is implemented as
+an efficient ringbuffer.
+
+## reboot2
+
+This adds `reboot2()` as a new API extension. This function properly waits
+until a reboot succeeded. It takes a timeout argument. When set to `> 0`
+`reboot2()` will block until the timeout is reached, if timeout is set to zero
+`reboot2()` will not block, if set to -1 `reboot2()` will block indefinitly.
+
+## mount\_injection
+
+This adds support for injecting and removing mounts into/from a running
+containers. Two new API functions `mount()` and `umount()` are added. They
+mirror the current mount and umount API of the kernel.
index aa879500d6a48184d2ef347127399cb5b9baabfd..51c871eb6ed6b78c7513f4b5922099bd14c1ed6f 100644 (file)
@@ -2,7 +2,8 @@ pkginclude_HEADERS = attach_options.h \
                     lxccontainer.h \
                     version.h
 
-noinst_HEADERS = attach.h \
+noinst_HEADERS = api_extensions.h \
+                attach.h \
                 caps.h \
                 cgroups/cgroup.h \
                 cgroups/cgroup_utils.h \
@@ -85,6 +86,7 @@ endif
 
 lib_LTLIBRARIES = liblxc.la
 liblxc_la_SOURCES = af_unix.c af_unix.h \
+                   api_extensions.h \
                    attach.c attach.h \
                    caps.c caps.h \
                    cgroups/cgfsng.c \
diff --git a/src/lxc/api_extensions.h b/src/lxc/api_extensions.h
new file mode 100644 (file)
index 0000000..3cac925
--- /dev/null
@@ -0,0 +1,48 @@
+/* liblxcapi
+ *
+ * Copyright © 2018 Christian Brauner <christian.brauner@ubuntu.com>.
+ * Copyright © 2018 Canonical Ltd.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2, as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#ifndef __LXC_API_EXTENSIONS_H
+#define __LXC_API_EXTENSIONS_H
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+
+/*
+ * api_extensions is the list of all API extensions in the order they were
+ * added.
+
+ The following kind of changes come with a new extensions:
+
+ - New public functions
+ - New configuration key
+ - New valid values for a configuration key
+*/
+static char *api_extensions[] = {
+       "lxc_log",
+       "lxc_config_item_is_supported",
+       "console_log",
+       "reboot2",
+       "mount_injection",
+       "cgroup_relative",
+};
+
+static size_t nr_api_extensions = sizeof(api_extensions) / sizeof(*api_extensions);
+
+#endif /* __LXC_API_EXTENSIONS_H */
index bdfe057cc2eeb35253eb8df65723789486bca256..80cf73207a5f70da7ebfbf1bba6d52fc543a3e0e 100644 (file)
@@ -42,6 +42,7 @@
 #include <unistd.h>
 
 #include "af_unix.h"
+#include "api_extensions.h"
 #include "attach.h"
 #include "cgroup.h"
 #include "commands.h"
@@ -5671,3 +5672,16 @@ bool lxc_config_item_is_supported(const char *key)
 {
        return !!lxc_get_config(key);
 }
+
+bool lxc_has_api_extension(const char *extension)
+{
+       /* The NULL API extension is always present. :) */
+       if (!extension)
+               return true;
+
+       for (size_t i = 0; i < nr_api_extensions; i++)
+               if (strcmp(api_extensions[i], extension) == 0)
+                       return true;
+
+       return false;
+}
index fdabbe474ceabf95aaddf9ba9c4bdca5ef48b3d1..459531076ecd4f4b3f6dc6bdc1dbc4dab2940a0d 100644 (file)
@@ -1123,6 +1123,13 @@ void lxc_log_close(void);
  */
 bool lxc_config_item_is_supported(const char *key);
 
+/*!
+ * \brief Check if an API extension is supported by this LXC instance.
+ *
+ * \param extension API extension to check for.
+ */
+bool lxc_has_api_extension(const char *extension);
+
 #ifdef  __cplusplus
 }
 #endif