" olpc-mesh: ssid <SSID>\n"
" [channel <1-13>]\n"
" [dhcp-anycast <MAC address>]\n\n"
+ " adsl: username <username>\n"
+ " protocol pppoa|pppoe|ipoatm\n"
+ " [password <password>]\n"
+ " [encapsulation vcmux|llc]\n\n"
" SLAVE_OPTIONS:\n"
" bridge: [priority <0-63>]\n"
" [path-cost <1-65535>]\n"
return check_valid_enumeration (mode, modes, "mode", _("InfiniBand transport mode"), error);
}
+/* Checks ADSL protocol */
+static gboolean
+check_adsl_protocol (char **protocol, GError **error)
+{
+ const char *protos[] = { NM_SETTING_ADSL_PROTOCOL_PPPOA,
+ NM_SETTING_ADSL_PROTOCOL_PPPOE,
+ NM_SETTING_ADSL_PROTOCOL_IPOATM,
+ NULL };
+
+ return check_valid_enumeration (protocol, protos, "protocol", _("ADSL protocol"), error);
+}
+
+/* Checks ADSL encapsulation */
+static gboolean
+check_adsl_encapsulation (char **encapsulation, GError **error)
+{
+ const char *modes[] = { NM_SETTING_ADSL_ENCAPSULATION_VCMUX,
+ NM_SETTING_ADSL_ENCAPSULATION_LLC,
+ NULL };
+
+ return check_valid_enumeration (encapsulation, modes, "encapsulation", _("ADSL encapsulation"), error);
+}
+
static gboolean
check_and_convert_vlan_flags (const char *flags, guint32 *flags_int, GError **error)
{
}
}
+#define PROMPT_ADSL_ENCAP "(" NM_SETTING_ADSL_ENCAPSULATION_VCMUX "/" NM_SETTING_ADSL_ENCAPSULATION_LLC ") [none]: "
+static void
+do_questionnaire_adsl (char **password, char **encapsulation)
+{
+ gboolean once_more;
+ GError *error = NULL;
+
+ /* Ask for optional 'adsl' arguments. */
+ if (!want_provide_opt_args (_("ADSL"), 2))
+ return;
+
+ if (!*password)
+ *password = nmc_readline (_("Password [none]: "));
+
+ if (!*encapsulation) {
+ do {
+ *encapsulation = nmc_readline (_("ADSL encapsulation %s"), PROMPT_ADSL_ENCAP);
+ once_more = !check_adsl_encapsulation (encapsulation, &error);
+ if (once_more) {
+ g_print ("%s\n", error->message);
+ g_clear_error (&error);
+ g_free (*encapsulation);
+ }
+ } while (once_more);
+ }
+}
+
static gboolean
split_address (char* str, char **ip, char **rest)
{
NMSettingBridgePort *s_bridge_port;
NMSettingVpn *s_vpn;
NMSettingOlpcMesh *s_olpc_mesh;
+ NMSettingAdsl *s_adsl;
const char *slave_type;
g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
if (!success)
return FALSE;
+ } else if (!strcmp (con_type, NM_SETTING_ADSL_SETTING_NAME)) {
+ /* Build up the settings required for 'adsl' */
+ gboolean success = FALSE;
+ char *username_ask = NULL;
+ const char *username = NULL;
+ char *protocol_ask = NULL;
+ const char *protocol = NULL;
+ const char *password_c = NULL;
+ char *password = NULL;
+ const char *encapsulation_c = NULL;
+ char *encapsulation = NULL;
+ nmc_arg_t exp_args[] = { {"username", TRUE, &username, !ask},
+ {"protocol", TRUE, &protocol, !ask},
+ {"password", TRUE, &password_c, FALSE},
+ {"encapsulation", TRUE, &encapsulation_c, FALSE},
+ {NULL} };
+
+ if (!nmc_parse_args (exp_args, FALSE, &argc, &argv, error))
+ return FALSE;
+
+ if (!username && ask)
+ username = username_ask = nmc_readline (_("Username: "));
+ if (!username) {
+ g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("Error: 'username' is required."));
+ goto cleanup_adsl;
+ }
+
+#define PROMPT_ADSL_PROTO "(" NM_SETTING_ADSL_PROTOCOL_PPPOA "/" NM_SETTING_ADSL_PROTOCOL_PPPOE "/" NM_SETTING_ADSL_PROTOCOL_IPOATM "): "
+ if (!protocol && ask)
+ protocol = protocol_ask = nmc_readline (_("Protocol %s"), PROMPT_ADSL_PROTO);
+ if (!protocol) {
+ g_set_error_literal (error, NMCLI_ERROR, NMC_RESULT_ERROR_USER_INPUT,
+ _("Error: 'protocol' is required."));
+ goto cleanup_adsl;
+ }
+ if (!check_adsl_protocol (&protocol_ask, error))
+ goto cleanup_adsl;
+
+ /* Also ask for all optional arguments if '--ask' is specified. */
+ password = g_strdup (password_c);
+ encapsulation = g_strdup (encapsulation_c);
+ if (ask)
+ do_questionnaire_adsl (&password, &encapsulation);
+
+ if (!check_adsl_encapsulation (&encapsulation, error))
+ goto cleanup_adsl;
+
+ /* Add ADSL setting */
+ s_adsl = (NMSettingAdsl *) nm_setting_adsl_new ();
+ nm_connection_add_setting (connection, NM_SETTING (s_adsl));
+
+ g_object_set (s_adsl,
+ NM_SETTING_ADSL_USERNAME, username,
+ NM_SETTING_ADSL_PROTOCOL, protocol,
+ NM_SETTING_ADSL_PASSWORD, password,
+ NM_SETTING_ADSL_ENCAPSULATION, encapsulation,
+ NULL);
+
+ success = TRUE;
+cleanup_adsl:
+ g_free (username_ask);
+ g_free (password);
+ g_free (protocol_ask);
+ g_free (encapsulation);
+ if (!success)
+ return FALSE;
+
} else if (!strcmp (con_type, NM_SETTING_GENERIC_SETTING_NAME)) {
/* Add 'generic' setting */
s_generic = (NMSettingGeneric *) nm_setting_generic_new ();
return nmc_rl_gen_func_basic (text, state, words);
}
+static char *
+gen_func_adsl_proto (const char *text, int state)
+{
+ const char *words[] = { "pppoe", "pppoa", "ipoatm", NULL };
+ return nmc_rl_gen_func_basic (text, state, words);
+}
+
+static char *
+gen_func_adsl_encap (const char *text, int state)
+{
+ const char *words[] = { "vcmux", "llc", NULL };
+ return nmc_rl_gen_func_basic (text, state, words);
+}
+
static char *
gen_func_master_ifnames (const char *text, int state)
{
generator_func = gen_func_bond_mode;
else if (g_str_has_suffix (rl_prompt, PROMPT_BOND_MON_MODE))
generator_func = gen_func_bond_mon_mode;
+ else if (g_str_has_suffix (rl_prompt, PROMPT_ADSL_PROTO))
+ generator_func = gen_func_adsl_proto;
+ else if (g_str_has_suffix (rl_prompt, PROMPT_ADSL_ENCAP))
+ generator_func = gen_func_adsl_encap;
if (generator_func)
match_array = rl_completion_matches (text, generator_func);