Permalink
Browse files

Add support for parsing --classic switch

This patch adds the necessary logic to parse the --classic switch. All
of the unit tests are adjusted to check that it is parsed correctly.

Signed-off-by: Zygmunt Krynicki <zygmunt.krynicki@canonical.com>
  • Loading branch information...
1 parent a84be35 commit 6f289caa3a7adcfcedef25c13378fb9bd5de2f95 @zyga zyga committed Dec 1, 2016
Showing with 53 additions and 0 deletions.
  1. +35 −0 src/snap-confine-args-test.c
  2. +13 −0 src/snap-confine-args.c
  3. +5 −0 src/snap-confine-args.h
@@ -93,6 +93,37 @@ static void test_sc_nonfatal_parse_args__typical()
// Check supported switches and arguments
g_assert_cmpstr(sc_args_security_tag(args), ==, "snap.app");
g_assert_cmpint(sc_args_is_version_query(args), ==, false);
+ g_assert_cmpint(sc_args_is_classic_confinement(args), ==, false);
+
+ // Check remaining arguments
+ g_assert_cmpint(argc, ==, 3);
+ g_assert_cmpstr(argv[0], ==, "/usr/lib/snapd/snap-confine");
+ g_assert_cmpstr(argv[1], ==, "--option");
+ g_assert_cmpstr(argv[2], ==, "arg");
+ g_assert_null(argv[3]);
+}
+
+static void test_sc_nonfatal_parse_args__typical_classic()
+{
+ // Test that typical invocation of snap-confine is parsed correctly.
+ struct sc_error *err __attribute__ ((cleanup(sc_cleanup_error))) = NULL;
+ struct sc_args *args;
+
+ int argc;
+ char **argv;
+ test_argc_argv(&argc, &argv,
+ "/usr/lib/snapd/snap-confine", "--classic", "snap.app",
+ "--option", "arg", NULL);
+
+ args = sc_nonfatal_parse_args(&argc, &argv, &err);
+ g_test_queue_destroy((GDestroyNotify) sc_args_free, args);
+ g_assert_null(err);
+ g_assert_nonnull(args);
+
+ // Check supported switches and arguments
+ g_assert_cmpstr(sc_args_security_tag(args), ==, "snap.app");
+ g_assert_cmpint(sc_args_is_version_query(args), ==, false);
+ g_assert_cmpint(sc_args_is_classic_confinement(args), ==, true);
// Check remaining arguments
g_assert_cmpint(argc, ==, 3);
@@ -124,6 +155,7 @@ static void test_sc_nonfatal_parse_args__ubuntu_core_launcher()
// Check supported switches and arguments
g_assert_cmpstr(sc_args_security_tag(args), ==, "snap.app");
g_assert_cmpint(sc_args_is_version_query(args), ==, false);
+ g_assert_cmpint(sc_args_is_classic_confinement(args), ==, false);
// Check remaining arguments
g_assert_cmpint(argc, ==, 3);
@@ -153,6 +185,7 @@ static void test_sc_nonfatal_parse_args__version()
// Check supported switches and arguments
g_assert_null(sc_args_security_tag(args));
g_assert_cmpint(sc_args_is_version_query(args), ==, true);
+ g_assert_cmpint(sc_args_is_classic_confinement(args), ==, false);
// Check remaining arguments
g_assert_cmpint(argc, ==, 3);
@@ -247,6 +280,8 @@ static void __attribute__ ((constructor)) init()
g_test_add_func("/args/test_argc_argv", test_test_argc_argv);
g_test_add_func("/args/sc_nonfatal_parse_args/typical",
test_sc_nonfatal_parse_args__typical);
+ g_test_add_func("/args/sc_nonfatal_parse_args/typical_classic",
+ test_sc_nonfatal_parse_args__typical_classic);
g_test_add_func("/args/sc_nonfatal_parse_args/ubuntu_core_launcher",
test_sc_nonfatal_parse_args__ubuntu_core_launcher);
g_test_add_func("/args/sc_nonfatal_parse_args/version",
View
@@ -35,6 +35,8 @@ struct sc_args {
// Flag indicating that --version was passed on command line.
bool is_version_query;
+ // Flag indicating that --classic was passed on command line.
+ bool is_classic_confinement;
};
struct sc_args *sc_nonfatal_parse_args(int *argcp, char ***argvp,
@@ -85,6 +87,9 @@ struct sc_args *sc_nonfatal_parse_args(int *argcp, char ***argvp,
args->is_version_query = true;
// NOTE: --version short-circuits the parser to finish
break;
+ } else if (strcmp(argv[optind], "--classic") == 0) {
+ args->is_classic_confinement = true;
+ continue;
}
// Report unhandled option switches
err = sc_error_init(SC_ARGS_DOMAIN, 0,
@@ -149,6 +154,14 @@ bool sc_args_is_version_query(struct sc_args *args)
return args->is_version_query;
}
+bool sc_args_is_classic_confinement(struct sc_args * args)
+{
+ if (args == NULL) {
+ die("cannot obtain classic confinement flag from NULL argument parser");
+ }
+ return args->is_classic_confinement;
+}
+
const char *sc_args_security_tag(struct sc_args *args)
{
if (args == NULL) {
View
@@ -65,6 +65,11 @@ void sc_args_free(struct sc_args *args);
**/
bool sc_args_is_version_query(struct sc_args *args);
+/**
+ * Check if snap-confine was invoked with the --classic switch.
+ **/
+bool sc_args_is_classic_confinement(struct sc_args *args);
+
/**
* Get the security tag passed to snap-confine.
*

0 comments on commit 6f289ca

Please sign in to comment.