false])) as $if) { if ($config['interfaces'][$if]['if'] == $cloneif) { return true; } } return false; } $a_clones = &config_read_array('wireless', 'clone'); if ($_SERVER['REQUEST_METHOD'] === 'GET') { if (isset($_GET['id']) && !empty($a_clones[$_GET['id']])) { $id = $_GET['id']; } if (isset($id)) { $pconfig['if'] = $a_clones[$id]['if']; $pconfig['cloneif'] = $a_clones[$id]['cloneif']; $pconfig['mode'] = $a_clones[$id]['mode']; $pconfig['descr'] = $a_clones[$id]['descr']; } else { $pconfig = ['if' => '', 'cloneif' => '', 'mode' => 'bss', 'descr' => '']; } } elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { $input_errors = array(); $pconfig = $_POST; if (isset($_POST['id']) && !empty($a_clones[$pconfig['id']])) { $id = $pconfig['id']; } /* input validation */ $reqdfields = explode(" ", "if mode"); $reqdfieldsn = array(gettext("Parent interface"),gettext("Mode")); do_input_validation($_POST, $reqdfields, $reqdfieldsn, $input_errors); if (count($input_errors) == 0) { $clone = array(); $clone['if'] = $pconfig['if']; $clone['mode'] = $pconfig['mode']; $clone['descr'] = $pconfig['descr']; if (isset($id) && $clone['if'] == $a_clones[$id]['if']) { $clone['cloneif'] = $a_clones[$id]['cloneif']; } if (empty($clone['cloneif'])) { $clone_id = 1; do { $clone_exists = false; $clone['cloneif'] = "{$pconfig['if']}_wlan{$clone_id}"; foreach ($a_clones as $existing) { if ($clone['cloneif'] == $existing['cloneif']) { $clone_exists = true; $clone_id++; break; } } } while ($clone_exists); } if (isset($id) && clone_inuse($a_clones[$id]['cloneif'])) { if ($clone['if'] != $a_clones[$id]['if']) { $input_errors[] = gettext("This wireless clone cannot be modified because it is still assigned as an interface."); } elseif ($clone['mode'] != $a_clones[$id]['mode']) { $input_errors[] = gettext("Use the configuration page for the assigned interface to change the mode."); } } if (count($input_errors) == 0) { if (empty(_interfaces_wlan_clone($clone['cloneif'], $clone))) { $input_errors[] = sprintf(gettext('Error creating interface with mode %s. The %s interface may not support creating more clones with the selected mode.'), $wlan_modes[$clone['mode']], $clone['if']); } else { if (isset($id)) { if ($clone['if'] != $a_clones[$id]['if']) { mwexec("/sbin/ifconfig " . escapeshellarg($a_clones[$id]['cloneif']) . " destroy"); } $a_clones[$id] = $clone; } else { $a_clones[] = $clone; } usort($a_clones, function($a, $b) { return strnatcmp($a['cloneif'], $b['cloneif']); }); write_config(); header(url_safe('Location: /interfaces_wireless.php')); exit; } } } } legacy_html_escape_form_data($pconfig); include("head.inc"); ?>