516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * CDDL HEADER START
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The contents of this file are subject to the terms of the
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff * Common Development and Distribution License (the "License").
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff * You may not use this file except in compliance with the License.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * or http://www.opensolaris.org/os/licensing.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * See the License for the specific language governing permissions
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * and limitations under the License.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * When distributing Covered Code, include this CDDL HEADER in each
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * If applicable, add the following below this CDDL HEADER, with the
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * fields enclosed by brackets "[]" replaced with your own identifying
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * information: Portions Copyright [yyyy] [name of copyright owner]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * CDDL HEADER END
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Use is subject to license terms.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#pragma ident "%Z%%M% %I% %E% SMI"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <stdio.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <stdlib.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <stddef.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <errno.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <ctype.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <stdarg.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <fcntl.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <unistd.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <net/if.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <sys/types.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <sys/stat.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <sys/wait.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <sys/ipc.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <sys/ddi.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <stropts.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <assert.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <termios.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <time.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <string.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <strings.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <auth_attr.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <auth_list.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <libdevinfo.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <secdb.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <priv.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <pwd.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <umem.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <locale.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <libintl.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <dirent.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#include <inet/wifi_ioctl.h>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Debug information
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#ifdef DEBUG
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxint wifi_debug = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxvoid wifi_dbgprintf(char *fmt, ...);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define PRTDBG(msg) if (wifi_debug > 1) wifi_dbgprintf msg
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#else /* DEBUG */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define PRTDBG(msg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#endif /* DEBUG */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define MAX_HISTORY_NUM 10
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define MAX_PREFERENCE_NUM 10
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define MAX_SCANBUF_LEN 256
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define MAX_CONFIG_FILE_LENGTH 256
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define MAX_LOADPF_LENGTH 256
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define LOADPROFILE_TIMEOUT 10
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define RECORD_ADD 0
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define RECORD_DEL 1
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Wificonfig exit status
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define WIFI_EXIT_DEF 0
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define WIFI_FATAL_ERR 1
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define WIFI_IMPROPER_USE 2
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define WIFI_MINOR_ERR 3
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define WIFI_LOCKF "/var/run/lockf_wifi"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef enum {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PREFERENCE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx HISTORY,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ACTIVEP,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PROFILE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx OTHER
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx} list_type_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define WIFI_PREFER "{preference}"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define WIFI_HISTORY "{history}"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define WIFI_ACTIVEP "{active_profile}"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef enum {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx LINKSTATUS = 0,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx BSSID,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ESSID,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx BSSTYPE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx CREATEIBSS,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx CHANNEL,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx RATES,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx POWERMODE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx AUTHMODE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ENCRYPTION,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WEPKEYID,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WEPKEY,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx SIGNAL,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx RADIOON,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WLANLIST,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx CONFIG_ITEM_END /* 15 */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx} config_item_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef struct ae {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct ae *ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *ae_arg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}ae_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef struct aelist {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int ael_argc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *ael_head, *ael_tail;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx list_type_t type;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}aelist_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef struct section {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct section *section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *section_id;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}section_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * config_file_t is an abstract of configration file,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * either/etc/inet/wifi/wifi.<interface> or /etc/inet/secret/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * wifi/wifiwepkey.<interface>
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef struct config_file {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int section_argc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *section_head, *section_tail;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}config_file_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic config_file_t *gp_config_file = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic config_file_t *gp_wepkey_file = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *p_file_wifi = "/etc/inet/wifi";
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *p_file_wifiwepkey = "/etc/inet/secret/wifiwepkey";
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef enum {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx AUTH_WEP = 0,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx AUTH_OTHER = 1
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx} wifi_auth_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *p_auth_string[] = {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WIFI_WEP_AUTH,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WIFI_CONFIG_AUTH
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx};
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * gbuf: is a global buf, which is used to communicate between the user and
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * the driver
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic wldp_t *gbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *gExecName = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void print_error(uint32_t);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void *safe_malloc(size_t);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void *safe_calloc(size_t, size_t);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *safe_strdup(const char *s1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void safe_snprintf(char *s, size_t n,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *format, ...);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void safe_fclose(FILE *stream);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void new_ae(aelist_t *ael, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic aelist_t *new_ael(list_type_t type);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic config_file_t *new_config_file();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void new_section(config_file_t *p_config_file, aelist_t *p_list,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void destroy_config(config_file_t *p_config_file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic config_file_t *parse_file(const char *pfile);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char **aeltoargv(aelist_t *ael, int *ael_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t fprint_config_file(config_file_t *p_config_file,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *file_name);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *append_pa(const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic section_t *find_section(config_file_t *p_config_file,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic ae_t *find_ae(aelist_t *plist, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void update_aelist(aelist_t *plist, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic const char *get_value(const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *find_active_profile(int);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic const char *essid_of_profile(const char *profile);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t search_interface(char *interface);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic int open_dev(char *devname);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t call_ioctl(int, int, uint32_t, uint32_t);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t del_prefer(config_file_t *p_config_file, const char *prefer,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t rflag);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t del_section(config_file_t *p_config_file, char *section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t set_prefer(config_file_t *p_config_file, const char *prefer,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rank);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void add_to_history(config_file_t *p_config_file,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t check_authority(wifi_auth_t type);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void heuristic_load(int fd, uint32_t ess_num, wl_ess_conf_t **);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *select_profile(int fd, int readonly, int timeout);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *construct_format(uint32_t nt);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void print_gbuf(config_item_t index);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t items_in_profile(aelist_t *, aelist_t *, int, char **);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *get_commit_key(int, int, char **);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void print_wepkey_info(const char *id, const char *wepkeyn);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_print_support_params(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_autoconf(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_startconf(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_loadpf(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_disconnect(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_printpf(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_restoredef(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_history(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_deletepf(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_wepkey(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_setprefer(int fd, int argc, char **arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_rmprefer(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_lsprefer(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_wlanlist(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_showstatus(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_getprofparam(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_setprofparam(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_setprofwepkey(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t is_rates_support(int fd, int num, uint8_t *rates);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_bsstype(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_essid(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_powermode(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_rates(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_channel(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_createibss(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_radioon(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_wepkeyid(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_encryption(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_authmode(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set_wepkey(int fd, const char *pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_createibss(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_bsstype(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_essid(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_bssid(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_radioon(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_signal(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_wepkeyid(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_encryption(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_authmode(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_powermode(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_rates(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_wlanlist(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_linkstatus(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get_channel(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_get(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_set(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t do_createprofile(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t value_is_valid(config_item_t item, const char *value);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef struct cmd_ops {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char cmd[32];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t (*p_do_func)(int fd, int argc, char **argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t b_auth;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t b_fileonly; /* operation only on the config file */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t b_readonly; /* only read from the card or config file */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx} cmd_ops_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic cmd_ops_t do_func[] = {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "autoconf",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_autoconf,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "startconf",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_startconf,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "connect",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_loadpf,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "disconnect",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_disconnect,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "showprofile",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_printpf,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "deleteprofile",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_deletepf,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "history",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_history,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "listprefer",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_lsprefer,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "removeprefer",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_rmprefer,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "setprefer",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_setprefer,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "setwepkey",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_wepkey,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "restoredef",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_restoredef,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "getparam",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_get,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "setparam",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_set,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "createprofile",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_createprofile,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "scan",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_wlanlist,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "showstatus",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_showstatus,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "setprofileparam",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_setprofparam,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "getprofileparam",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_getprofparam,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx },
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "setprofilewepkey",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_setprofwepkey,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx};
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef enum {RW, RO, WO} rw_property_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef struct gs_ops {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx config_item_t index;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char cmd[32];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t (*p_do_get_func)(int fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t (*p_do_set_func)(int fd, const char *arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rw_property_t rw;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx} gs_ops_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic gs_ops_t do_gs_func[] = {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {LINKSTATUS, "linkstatus", NULL, NULL, RO},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {BSSID, "bssid", do_get_bssid, NULL, RO},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {ESSID, "essid", do_get_essid, do_set_essid, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {BSSTYPE, "bsstype", do_get_bsstype, do_set_bsstype, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {CREATEIBSS, "createibss", do_get_createibss, do_set_createibss, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {CHANNEL, "channel", do_get_channel, do_set_channel, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {RATES, "rates", do_get_rates, do_set_rates, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {POWERMODE, "powermode", do_get_powermode, do_set_powermode, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {AUTHMODE, "authmode", do_get_authmode, do_set_authmode, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {ENCRYPTION, "encryption", do_get_encryption, do_set_encryption, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {WEPKEYID, "wepkeyindex", do_get_wepkeyid, do_set_wepkeyid, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {WEPKEY, "wepkey|1-4", NULL, do_set_wepkey, WO},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {SIGNAL, "signal", do_get_signal, NULL, RO},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {RADIOON, "radio", do_get_radioon, do_set_radioon, RW},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx};
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define N_FUNC sizeof (do_func) / sizeof (cmd_ops_t)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define N_GS_FUNC sizeof (do_gs_func) / sizeof (gs_ops_t)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * valid rate value
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxtypedef struct wifi_rates_tab {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *rates_s;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t rates_i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t rates_reserve0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t rates_reserve1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t rates_reserve2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx} wifi_rates_tab_t;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * the rates value is in increments of 500kb/s.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * according to the 802.11 a/b/g specs(IEEE):
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 802.11b(IEEE Std 802.11b-1999) page35, rates should be:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * X02, X04, X0b, X16
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 802.11a(IEEE Std 802.11a-1999) page47, rates should be:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 6,9,12,18,24,36,48,54 Mb/s
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 802.11g(IEEE Std 802.11g-2003) page44, rates should be:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 1,2,5.5,11,6,9,12,18,22,24,33,36,48,54 Mb/s
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define WIFI_RATES_NUM 14
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic wifi_rates_tab_t wifi_rates_s[WIFI_RATES_NUM] = {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"1", WL_RATE_1M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"2", WL_RATE_2M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"5.5", WL_RATE_5_5M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"6", WL_RATE_6M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"9", WL_RATE_9M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"11", WL_RATE_11M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"12", WL_RATE_12M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"18", WL_RATE_18M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"22", WL_RATE_22M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"24", WL_RATE_24M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"33", WL_RATE_33M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"36", WL_RATE_36M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"48", WL_RATE_48M, 0, 0, 0},
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx {"54", WL_RATE_54M, 0, 0, 0}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx};
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/* print the error message on why set or get ioctl command failed. */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxprint_error(uint32_t errorno)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *buf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (errorno) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_SUCCESS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf = gettext("command succeeded");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_NOTSUPPORTED:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_LACK_FEATURE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_HW_ERROR:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_ACCESS_DENIED:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf = strerror(errorno);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_READONLY:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf = gettext("parameter read-only");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_WRITEONLY:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf = gettext("parameter write-only");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_NOAP:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf = gettext("no access point available");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf = gettext("unknown error");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, "%s\n", buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxsafe_malloc(size_t size)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx void *buf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf = malloc(size);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (buf == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: malloc: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxsafe_calloc(size_t nelem, size_t elsize)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx void *buf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf = calloc(nelem, elsize);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (buf == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: calloc: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxsafe_strdup(const char *s1)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *p;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p = strdup(s1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: strdup: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (p);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxsafe_snprintf(char *s, size_t n, const char *format, ...)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int len;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx va_list ap;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx va_start(ap, format);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = vsnprintf(s, n, format, ap);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((len <= 0) || (len > n - 1)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: snprintf: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx va_end(ap);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxsafe_fclose(FILE *stream)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int err;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx err = fclose(stream);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (err == EOF) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: fclose: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * new_ae: Add an element with content pointed by arg to the list *ael.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxnew_ae(aelist_t *ael, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("new_ae(0x%x, \"%s\")\n", ael, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((ael != NULL) && (arg != NULL));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = safe_calloc(sizeof (*pae), 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg = safe_strdup(arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_next = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (ael->ael_tail == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ael->ael_head = pae;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ael->ael_tail->ae_next = pae;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ael->ael_tail = pae;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ael->ael_argc++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * new_ael: Create a new aelist with list_type "type"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * and return the list pointer.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic aelist_t *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxnew_ael(list_type_t type)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = safe_calloc(sizeof (*plist), 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->type = type;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_argc = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_head = plist->ael_tail = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("new_ael(%d) = 0x%x\n", type, plist));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (plist);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * new_config_file: Creates a new config_file_t struct which is counterpart of
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * of the configration file, and return the pointer.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic config_file_t *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxnew_config_file()
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx config_file_t *p_config_file;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file = safe_calloc(sizeof (config_file_t), 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_argc = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_head = p_config_file->section_tail = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("new_config_file() = 0x%x\n", p_config_file));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (p_config_file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * new_section: Add a list pointed by "p_list", with identity "section_id" to
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * the config_file_t struct pointed by "p_config_file"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxnew_section(config_file_t *p_config_file, aelist_t *p_list,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *section_id)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("new_section(0x%x, 0x%x, \"%s\")\n", p_config_file, p_list,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_id));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((p_config_file != NULL) && (p_list != NULL) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (section_id != NULL));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = safe_calloc(sizeof (*p_section), 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section->list = p_list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section->section_next = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section->section_id = safe_strdup(section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_config_file->section_tail == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_head = p_section;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_tail->section_next = p_section;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_tail = p_section;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_argc++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * destroy_config:Destroy the config_file struct
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdestroy_config(config_file_t *p_config_file)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *p_list = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("destory_config(0x%x)\n", p_config_file));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(p_config_file != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_config_file->section_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_list = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_list != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = p_list->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(p_list->ael_head);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_list->ael_head = pae;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(p_list);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_list = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section->section_id != NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(p_section->section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section->section_id = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(p_config_file->section_head);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_head = p_section;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(p_config_file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * parse_file: Parse each section of the configration file
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * and construct the config_file_t structure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Example:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * A config file has contents below:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * {preferrence}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * essid=ap7-3
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * essid=linksys
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * {history}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * essid=ap7-3
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * essid=ap7-2
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * [ap7-3]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * essid=ap7-3
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * wepkeyid=3
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * channel=11
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * rates=1,2
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * [linksys]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * essid=linksys
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * createibss=BSS
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * authmode=OPENSYSTEM
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * wepkeyid=1
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * then its config_file_t structure will be:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * config_file_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |~~~~~~~~~~~~~~~~~~~~~~~~~~|
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * | section_argc=5 |
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |~~~~~~~~~~~~T~~~~~~~~~~~~~|
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * /| *head | *tail |\
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * / ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * / \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * / \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * / \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * / \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * / \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * section_t V section_t V section_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |~~~~~~~~~~~~~~~|~~| |~~~~~~~~~~~~~~~|~~| |~~~~~~~~~~~~~~|~~|
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |"{preferrence}"| | | "{history}" | | | "[linksys]" | |
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |~~~~~~~~~~~~~~~| -+---->|~~~~~~~~~~~~~~~| -+->..->|~~~~~~~~~~~~~~| -+->NULL
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * | *list | | | *list | | | *list | |
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * ~~T~~~~~~~~~~~~~~~~~ ~~~T~~~~~~~~~~~~~~~~ ~~~T~~~~~~~~~~~~~~~
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * | | |
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * | | |
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * V aelist_t V aelist_t V aelist_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |~~~~~~~~~~~~~| |~~~~~~~~~~~~~| |~~~~~~~~~~~~~|
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * | argc=2 | | argc=3 | | argc=4 |
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |~~~~~~~~~~~~~| |~~~~~~~~~~~~~| |~~~~~~~~~~~~~|
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |PREFFERRENCE | | HISTORY | | PROFILE |
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |~~~~~~T~~~~~~| |~~~~~~T~~~~~~| |~~~~~~T~~~~~~|
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |*head |*tail |\ |*head |*tail |\ |*head |*tail |
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * ~~T~~~~~~~~~~~~ \ ~~T~~~~~~~~~~~~ \ /~~~~~~~~~~~~~~~\
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * | \ V V / \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * | \ ... ... / \
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * V ae_t V ae_t ae_t V ae_t V
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |~~~~~~~~~T~~| |~~~~~~~~~T~~| |~~~~~~~~~T~~| |~~~~~~~~~T~~|
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * |"essid= | -+->|"essid= | -+->NULL |"essid= | -+->..->|"wepkeyid| -+->NULL
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * | ap7-3" | | | linksys"| | | linksys"| | | =1" | |
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic config_file_t *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxparse_file(const char *pfile)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx FILE *file = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int fd = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char buf_line[256];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx config_file_t *p_config_file;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx list_type_t cur_list = OTHER;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *prefer_list = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *history_list = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *profile_list = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *activep_list = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(pfile != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The files /etc/inet/wifi and /etc/inet/secret/wifiwepkey should
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * be opened with "r" attribute. If these two files do not exist,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * create them here.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx file = fopen(pfile, "r");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (file == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx fd = open(pfile, O_CREAT|O_EXCL|O_RDWR, 0600);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (fd < 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to open %s"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\n"), gExecName, pfile);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto error1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx file = fdopen(fd, "w");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) chmod(pfile, S_IRUSR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file = new_config_file();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (fgets(buf_line, sizeof (buf_line), file) != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((buf_line[0] == '\n') || (buf_line[0] == ' '))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* replace the old '\n' to '\0' */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf_line[strlen(buf_line) - 1] = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strstr(buf_line, WIFI_PREFER) == buf_line) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (prefer_list == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx cur_list = PREFERENCE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prefer_list = new_ael(PREFERENCE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_section(p_config_file, prefer_list,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WIFI_PREFER);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s : duplicated %s section\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, pfile, WIFI_PREFER);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto error;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (strstr(buf_line, WIFI_HISTORY) == buf_line) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (history_list == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx cur_list = HISTORY;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx history_list = new_ael(HISTORY);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_section(p_config_file, history_list,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WIFI_HISTORY);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s : duplicated %s section\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, pfile, WIFI_HISTORY);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto error;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (strstr(buf_line, WIFI_ACTIVEP) == buf_line) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (activep_list == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx cur_list = ACTIVEP;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx activep_list = new_ael(ACTIVEP);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_section(p_config_file, activep_list,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WIFI_ACTIVEP);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s : duplicated %s section\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, pfile, WIFI_ACTIVEP);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto error;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if ((strchr(buf_line, '[') == buf_line) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (buf_line[strlen(buf_line) - 1] == ']')) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx cur_list = PROFILE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx profile_list = new_ael(PROFILE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_section(p_config_file, profile_list,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf_line);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (cur_list) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case PREFERENCE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (prefer_list->ael_argc <=
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx MAX_PREFERENCE_NUM)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_ae(prefer_list, buf_line);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case HISTORY:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (history_list->ael_argc <=
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx MAX_HISTORY_NUM)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_ae(history_list, buf_line);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case ACTIVEP:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((activep_list->ael_argc <= 1) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strpbrk(buf_line, "=") != NULL))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_ae(activep_list, buf_line);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case PROFILE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strpbrk(buf_line, "=") != NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_ae(profile_list, buf_line);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: %s: file format error\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, pfile);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto error;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("parse_file(\"%s\")=0x%x\n", pfile, p_config_file));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fclose(file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (p_config_file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxerror:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx destroy_config(p_config_file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fclose(file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxerror1:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * construct an argument vector from an aelist
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char **
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxaeltoargv(aelist_t *ael, int *ael_num)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *ae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char **argv = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int argc = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("aeltoargv(%x)\n", ael));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(ael != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv = safe_calloc(sizeof (*argv), ael->ael_argc);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (argc = 0, ae = ael->ael_head; ae; ae = ae->ae_next) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* skip bssid since it can not be set */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strncmp(ae->ae_arg, "bssid=", strlen("bssid=")) == 0)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv[argc] = safe_strdup(ae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argc++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (ae == ael->ael_tail)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("aeltoargv(0x%x) = 0x%x\n\n", ael, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *ael_num = argc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * archived contents into a file
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxfprint_config_file(config_file_t *p_config_file, const char *file_name)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx FILE *file = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int fd = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int len;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *p_list = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char temp_file[256];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct stat buf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("fprint_config_file(0x%x, \"%s\")\n", p_config_file,
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff file_name));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((p_config_file != NULL)&&(strcmp(file_name, "") != 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(temp_file, sizeof (temp_file),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s.tmp", file_name);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx fd = open(temp_file, O_CREAT|O_WRONLY|O_TRUNC, 0600);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (fd < 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to open %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, temp_file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx file = fdopen(fd, "w");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_config_file->section_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_list = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_list != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("fprint_config_file: section_id=%s\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section->section_id));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = fprintf(file, "\n%s\n", p_section->section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (len < 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "failed to update %s: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, file_name, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_fclose(file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = p_list->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = fprintf(file, "%s\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (len < 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: failed to "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "update %s: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, file_name,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_fclose(file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_fclose(file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The attribute of the file /etc/inet/wifi and
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * /etc/inet/security/wifiwepkey should be retained.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if those file do not exist, set default file mode.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (stat(file_name, &buf) != 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (errno == ENOENT) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf.st_mode = 0600;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to get "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "file %s stat: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, file_name, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (rename(temp_file, file_name) != 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to update %s: %s"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\n"), gExecName, file_name, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) chmod(file_name, buf.st_mode);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * append_pa: Each section holds a section_id which identifies a section
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * a profile uses its essid appending "[]" to denote its section_id.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * note: new memory is allocated, remember to free.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxappend_pa(const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int len;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = strlen(arg) + 3;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = safe_malloc(len);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(pbuf, len, "[%s]", arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("append_pa(\"%s\") = \"%s\"\n", arg, pbuf));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * find a section by section_id from p_config_file,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * return the section pointer.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic section_t *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxfind_section(config_file_t *p_config_file, const char *section_id)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("find_section(0x%x, \"%s\")\n", p_config_file, section_id));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((section_id != NULL)&&(p_config_file != NULL));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_config_file->section_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((p_section->section_id != NULL) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(p_section->section_id, section_id) == 0))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (p_section);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * get_value: Get rid of "parameter=" from a "parameter=value", for example:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * when we read an line from file, we gets "essid=ap7-2", this function
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * returns the pointer to string "ap7-2";
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic const char *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxget_value(const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *p;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p = strchr(arg, '=');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("get_value(\"%s\") = \"%s\"\n", arg, p + 1));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p != NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (p + 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * search /dev/wifi to see which interface is available
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxsearch_interface(char *interface)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx DIR *dirp;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct dirent *dp;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char buf[256];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int fd;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("search interface\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(interface != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Try to return the first found wifi interface.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * If no wifi interface is available, return B_FALSE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((dirp = opendir("/dev/wifi")) == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("failed to open '/dev/wifi'\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while ((dp = readdir(dirp)) != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(dp->d_name, ".") == 0 ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx strcmp(dp->d_name, "..") == 0)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (dp->d_name[strlen(dp->d_name) - 1] < '0' ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx dp->d_name[strlen(dp->d_name) - 1] > '9')
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(buf, sizeof (buf), "%s%s",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "/dev/wifi/", dp->d_name);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx fd = open(buf, O_RDWR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (fd == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("interface %s doesn't exist\n", dp->d_name));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("interface %s is the first found interface\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx dp->d_name));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) strlcpy(interface, buf, LIFNAMSIZ);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) close(fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) closedir(dirp);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("failed to find available wireless interface\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) closedir(dirp);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * open_dev: Open the driver.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if the 'devname' has format like 'ath0', we should add the path to that
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * device(/dev/ath0) and open it; if the 'devname' has format like
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * '/dev/wifi/ath0', we open it directly.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic int
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxopen_dev(char *devname)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int fd;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int len;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("open_dev(\"%s\")\n", devname));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(devname != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * If the devname is got from the user input, we
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * add '/dev/' to that relative devname. If it
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * is got from the 'search interface', it is an
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * absolute path.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strncmp(devname, "/dev/wifi/", strlen("/dev/wifi/")) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = safe_strdup(devname);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = strlen(devname) + strlen("/dev/") + 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = safe_malloc(len);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(pbuf, len, "/dev/%s", devname);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx fd = open(pbuf, O_RDWR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (fd == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to open '%s': %s"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\n"), gExecName, devname, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (-1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!isastream(fd)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: %s is "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "not a stream device\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, devname);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) close(fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (-1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * call_ioctl: Fill strioctl structure and issue an ioctl system call
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxcall_ioctl(int fd, int cmd, uint32_t params, uint32_t buf_len)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct strioctl stri;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("call_ioctl_gs(%d, 0x%x, 0x%x, 0x%x)\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx fd, cmd, params, buf_len));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (cmd) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WLAN_GET_PARAM:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(gbuf, 0, MAX_BUF_LEN);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx stri.ic_len = MAX_BUF_LEN;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WLAN_SET_PARAM:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gbuf->wldp_length = buf_len + WIFI_BUF_OFFSET;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx stri.ic_len = gbuf->wldp_length;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WLAN_COMMAND:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gbuf->wldp_length = sizeof (wldp_t);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx stri.ic_len = gbuf->wldp_length;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: ioctl : "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "unsupported ioctl command\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gbuf->wldp_type = NET_802_11;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gbuf->wldp_id = params;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx stri.ic_cmd = cmd;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx stri.ic_timout = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx stri.ic_dp = (char *)gbuf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (ioctl(fd, I_STR, &stri) == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gbuf->wldp_result = 0xffff;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (cmd == WLAN_COMMAND) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (gbuf->wldp_result != WL_SUCCESS ?
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff B_FALSE:B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * del_prefer: Delete an item from the {preferrence} list, the idea is
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * simply free the ae_t element, and set ae_arg to NULL, then when archive
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * the config_file_t struct to the file, it will be delete.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The last flag is used to identify whether this function is invoked due to
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * the 'removeprefer' subcommand or due to 'deleteprofile' subcommand.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdel_prefer(config_file_t *p_config_file, const char *prefer, boolean_t rflag)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, position = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int number;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *prm_ae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("del_prefer(0x%x, \"%s\")\n", p_config_file, prefer));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((prefer != NULL)&&(p_config_file != NULL));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(p_config_file, WIFI_PREFER);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section != NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((p_section == NULL) || (plist == NULL))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx number = plist->ael_argc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prm_ae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(prefer, pae->ae_arg) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg = NULL; /* mark */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!position) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_head = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_next == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_tail = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < position - 1; i++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prm_ae = prm_ae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prm_ae->ae_next = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_next == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_tail = prm_ae;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_argc--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx position++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((number == plist->ael_argc) && (rflag == B_TRUE)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: removeprefer : "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "no such profile: '%s' in the preference list\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, prefer);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * del_section: Delete an section from p_config_file, the idea is
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * simply free the aelist_t struct and set it to NULL, when archiving
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * config_file_t struct to the file, we will find section list is NULL,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * and will not write it to file, so it will be deleted.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdel_section(config_file_t *p_config_file, char *section_id)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *prm_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, position = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("del_section(0x%x, \"%s\")\n", p_config_file, section_id));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("del_section: %d section(s) in config file\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_argc));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((section_id != NULL)&&(p_config_file != NULL));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (find_section(p_config_file, section_id) == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_config_file->section_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prm_section = p_config_file->section_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section->section_id != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(p_section->section_id, section_id) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(plist->ael_head);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_head = pae;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(plist);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section->list = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(p_section->section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section->section_id = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!position) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_head =
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section->section_next == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_tail =
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < position - 1; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prm_section =
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prm_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prm_section->section_next =
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section->section_next == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_tail =
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prm_section;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(p_section);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_config_file->section_argc--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx position++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * set_prefer: Reorder the preferrence list.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxset_prefer(config_file_t *p_config_file, const char *prefer, int rank)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, position = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae_move = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(prefer != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("set_prefer(0x%x, \"%s\", %d)\n", p_config_file, prefer, rank));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = append_pa(prefer);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (find_section(p_config_file, pbuf) == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: setprefer: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "no such profile: '%s'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, prefer);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(p_config_file, WIFI_PREFER);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = new_ael(PREFERENCE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_section(p_config_file, plist, WIFI_PREFER);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_ae(plist, prefer);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae_move = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(prefer, pae->ae_arg) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!position) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_head = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_next == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_tail = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < position - 1; i++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae_move = pae_move->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae_move->ae_next = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_next == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_tail = pae_move;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_argc--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx position++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("set_prefer: %d Profiles in prefer list\n", plist->ael_argc));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (rank > plist->ael_argc) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_ae(plist, prefer);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (rank <= 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = safe_calloc(sizeof (ae_t), 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg = safe_strdup(prefer);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_next = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_head = pae;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_argc++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae_move = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 1; i < rank-1; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae_move = pae_move->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = safe_calloc(sizeof (ae_t), 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg = safe_strdup(prefer);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_next = pae_move->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae_move->ae_next = pae;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_argc++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * If number of prefer list items is larger than the MAX_PREFERENCE_NUM
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * delete those items whose No is larger than MAX_PREFERENCE_NUM.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist->ael_argc > MAX_PREFERENCE_NUM) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae->ae_next != plist->ael_tail)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(plist->ael_tail->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_tail->ae_arg = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(plist->ael_tail);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_tail = pae;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_tail->ae_next = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_argc--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("set_prefer: %d Profiles in prefer list\n", plist->ael_argc));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * add_to_history: Save the scanlist argv into history section
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxadd_to_history(config_file_t *p_config_file, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, j = 0, pos = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae_m = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char item[256];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx time_t cltime;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("add_to_history(0x%x, %d, 0x%x)\n", p_config_file, argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(p_config_file != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(p_config_file, WIFI_HISTORY);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = new_ael(HISTORY);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_section(p_config_file, plist, WIFI_HISTORY);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!strlen(argv[i]))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pos = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae_m = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * add time stamp to the history record
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx cltime = time(&cltime);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) snprintf(item, sizeof (item), "%s%c%ld",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv[i], ',', cltime);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strncmp(item, pae->ae_arg,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx strlen(argv[i])) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!pos) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_head = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_next == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_tail = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (j = 0; j < pos - 1; j++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae_m = pae_m->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae_m->ae_next = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_next == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_tail = pae_m;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_argc--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pos++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_ae(plist, item);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist->ael_argc > MAX_HISTORY_NUM) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < plist->ael_argc - MAX_HISTORY_NUM;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_head = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_argc = MAX_HISTORY_NUM;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_print_usage()
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " autoconf [wait={n|forever}]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " connect profile [wait={n|forever}]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " connect essid [wait={n|forever}]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " disconnect\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " getparam [parameter [...]]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " setparam [parameter=value [...]]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext(
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\tparameters:\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tbssid\t\t - read only: 6 byte mac address of "
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "base station\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tessid\t\t - name of the network, a string of up "
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "to 32 chars\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tbsstype\t\t - bss(ap, infrastructure), ibss(ad-hoc)"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff " or auto\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tcreateibss\t - flag to identify whether a ibss is to be\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\t\t\t created when the network to connect is\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\t\t\t not available, yes or no\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tchannel\t\t - channel(used only when creating an ibss)\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\t\t\t valid value:\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\t\t\t\t 802.11a: 0-99\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\t\t\t\t 802.11b: 1-14\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\t\t\t\t 802.11g: 1-14\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\trates\t\t - set of rates, seperated by ',' valid rates:\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\t\t\t 1,2,5.5,6,9,11,12,18,22,24,33,36,48 and 54\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tpowermode\t - off, mps or fast\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tauthmode\t - opensystem or shared_key\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tencryption\t - none or wep\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\twepkey|1-4\t - write only:\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\t\t\t 5 chars or 10 hex digits for 40bit wepkey;\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\t\t\t 13 chars or 26 hex digits for 128bit wepkey\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\twepkeyindex\t - an integer within the range 1-4\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tsignal\t\t - read only: signal strength from 0 to 15\n"
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "\t\tradio\t\t - on or off\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " restoredef\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " scan\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " showstatus\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path][-i interface]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " setwepkey 1|2|3|4\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, "\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " createprofile profile parameter=value [...]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " deleteprofile profile1 [profile2 [...]]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " showprofile profile1 [profile2 [...]]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " setprofilewepkey profile 1|2|3|4\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " getprofileparam profile [parameter [...]]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " setprofileparam profile [parameter=value [...]]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, "\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " history\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " listprefer\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " removeprefer profile\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("\t%s [-R root_path]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " setprefer profile [n]\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_print_support_params: Query interface which cmd is supported
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_print_support_params(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, n = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_print_support_params(\"%d\")\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd != -1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("\t parameter\tproperty\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < N_GS_FUNC; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gbuf->wldp_result = WL_LACK_FEATURE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((do_gs_func[i].p_do_get_func != NULL) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (do_gs_func[i].p_do_get_func(fd) != B_TRUE)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (gbuf->wldp_result == WL_SUCCESS) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\t%11s", do_gs_func[i].cmd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_gs_func[i].rw == RO)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("\tread only\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("\tread/write\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx n++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (n ? B_TRUE : B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * check_authority: Check if command is permitted.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxcheck_authority(wifi_auth_t type)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct passwd *pw = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("check_authority()\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pw = getpwuid(getuid());
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pw == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (chkauthattr(p_auth_string[type], pw->pw_name) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (type == AUTH_WEP)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "privilege '%s' is required for setting "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "wepkey.\n"), gExecName, WIFI_WEP_AUTH);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "privilege '%s' is required.\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, WIFI_CONFIG_AUTH);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * construct the 'history' and 'scan' output format
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * memory allocated. need to free after the function is invoked.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxconstruct_format(uint32_t nt)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *format;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int len = 0, i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#define FORMAT_LEN 256
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((nt >= 1) && (nt <= 4));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx format = safe_malloc(FORMAT_LEN);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < nt; i++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len += snprintf(format + len, FORMAT_LEN - len, "\t");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((len <= 0) || (len > FORMAT_LEN - 1)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return ("\t\t\t\t");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (format);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * find the essid of the named profile.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * gp_config_file is golable, so the return is gloable too.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic const char *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxessid_of_profile(const char *profile)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("essid_of_profile: profile = %s\n", profile));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = append_pa(profile);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strncmp(pae->ae_arg, "essid=", strlen("essid=")) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("essid_of_profile: essid = %s\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (get_value(pae->ae_arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * If we don't know which profile is our favorate in 'autoconf',
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * we select the wifi network based on the following heuristic
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 1. the network without wep.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 2. the network with the strongst signal.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 3. the network with the faster speed(not implemented since signal affects
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * the speed in some degree).
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxheuristic_load(int fd, uint32_t ess_num, wl_ess_conf_t **p_ess_conf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *flag = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int have_nowep_wlan = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_rssi_t maxsignal = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char essid[34];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int timeout = LOADPROFILE_TIMEOUT;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("heuristic_load: enter\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) call_ioctl(fd, WLAN_COMMAND, WL_LOAD_DEFAULTS, 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx flag = calloc(sizeof (char), ess_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) { /* extract none-wep network */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_ess_conf[i]->wl_ess_conf_wepenabled == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx flag[i] = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx have_nowep_wlan = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if all the wlans are weped, we select the one with strongest signal
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * in all of them, otherwise we just select in the none weped ones.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!have_nowep_wlan)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(flag, 1, ess_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) { /* extract the strongest signal ones */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (flag[i] == 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_ess_conf[i]->wl_ess_conf_sl > maxsignal) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx maxsignal = p_ess_conf[i]->wl_ess_conf_sl;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(flag, 0, i);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (p_ess_conf[i]->wl_ess_conf_sl == maxsignal)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx flag[i] = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (flag[i] == 1)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(flag);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("heuristic_load: %s is selected\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_ess_conf[i]->wl_ess_conf_essid.wl_essid_essid));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* select one in all the networks which meet the preceding stardands */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (i == ess_num)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) do_set_essid(fd, "");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) do_set_essid(fd,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_ess_conf[i]->wl_ess_conf_essid.wl_essid_essid);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((ess_num == 0) || (do_get_essid(fd) == B_FALSE)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: autoconf:"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " failed to connect to any essid\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_MINOR_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) strlcpy(essid, ((wl_essid_t *)(gbuf->wldp_buf))->wl_essid_essid,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (essid));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("%s: autoconf: essid '%s' is selected%s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, essid,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx have_nowep_wlan ? "" : ": this is a WEPed "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "access point");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!have_nowep_wlan)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (timeout > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((do_get_linkstatus(fd) == B_TRUE) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (*(wl_linkstatus_t *)(gbuf->wldp_buf) == WL_CONNECTED)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("%s: connecting to "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "essid '%s'\n"), gExecName, essid);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) sleep(1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx timeout--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to connect to "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "essid '%s'\n"), gExecName, essid);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Called in autoconf and startconf to find which 'profile' is selected.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The process is: check profile names in the prefer list item by item,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if the essid of the profile is in the scan list, then it is the wanted.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * readonly: 1 for startconf
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 0 for autoconf
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * for autoconf, the scan result will be recorded in the history list.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxselect_profile(int fd, int readonly, int timeout)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint32_t ess_num = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int nprefer = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char **ess_argv;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char **hisess_argv;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_ess_conf_t **p_ess_conf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *parg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *selected = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t flag = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((call_ioctl(fd, WLAN_COMMAND, WL_SCAN, 0) == B_FALSE) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (do_get_wlanlist(fd) == B_FALSE)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "autoconf : failed to scan\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ess_num = ((wl_ess_list_t *)(gbuf->wldp_buf))->wl_ess_list_num;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ess_argv = safe_calloc(sizeof (char *), ess_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx hisess_argv = safe_calloc(sizeof (char *), ess_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_ess_conf = safe_calloc(sizeof (wl_ess_list_t *), ess_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_ess_conf[i] = ((wl_ess_list_t *)gbuf->wldp_buf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_ess_list_ess + i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ess_argv[i] = safe_malloc(MAX_SCANBUF_LEN);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (readonly == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx hisess_argv[i] = safe_malloc(MAX_SCANBUF_LEN);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) snprintf(hisess_argv[i], MAX_SCANBUF_LEN,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s%c%02x:%02x:%02x:%02x:%02x:%02x%c%s",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_ess_conf[i]->wl_ess_conf_essid.wl_essid_essid,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ',',
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[0]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[1]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[2]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[3]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[4]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[5]), ',',
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (p_ess_conf[i]->wl_ess_conf_wepenabled == B_TRUE
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ? "wep":"none"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) snprintf(ess_argv[i], MAX_SCANBUF_LEN, "%s",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_ess_conf[i]->wl_ess_conf_essid.wl_essid_essid);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (readonly == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx add_to_history(gp_config_file, ess_num, hisess_argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(hisess_argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(hisess_argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, WIFI_PREFER);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (ess_num > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx heuristic_load(fd, ess_num, p_ess_conf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_EXIT_DEF);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto done;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(plist != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx nprefer = plist->ael_argc;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (nprefer == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (ess_num > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx heuristic_load(fd, ess_num, p_ess_conf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_EXIT_DEF);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto done;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while ((pae != NULL) && (flag != B_TRUE)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx parg = essid_of_profile(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (parg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(parg, ess_argv[i]) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx selected = pae->ae_arg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx flag = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdone:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((selected == NULL) && (timeout == 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx heuristic_load(fd, ess_num, p_ess_conf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(ess_argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(ess_argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(p_ess_conf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (selected);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxis_waittime_valid(char *pbuf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx i = atoi(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (i == -1)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < strlen(pbuf); i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (isdigit(pbuf[i]) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_autoconf: First scan the wlanlist, and select one essid from scan result
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * by the order in {preferrence} list. If no match, then heuristic_load;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_autoconf(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *selected = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int timeout = LOADPROFILE_TIMEOUT, forever = 0, len = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pequal, *param;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char **ld_argv = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_autoconf(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = safe_strdup(argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pequal = strchr(param, '=');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pequal != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pequal++ = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(param, "wait") != 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(pequal, "forever") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx forever = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (is_waittime_valid(pequal) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid value %s for 'wait'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, pequal);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (sscanf(pequal, "%d", &timeout) != 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (timeout == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx forever = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "useless tokens after '%s'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while ((forever == 1) || (timeout > 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx timeout--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx selected = select_profile(fd, 0, max(timeout, forever));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (selected != NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) sleep(1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (selected == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("%s: autoconf: profile [%s]"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " is selected\n"), gExecName, selected);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ld_argv = safe_calloc(sizeof (char *), argc+1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ld_argv[0] = safe_strdup(selected);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = max(strlen(argv[0]), strlen("wait=forever"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ld_argv[1] = safe_malloc(len);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(ld_argv[1], len + 1, forever == 1 ?
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "wait=forever" : "wait=%d", timeout);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = do_loadpf(fd, argc+1, ld_argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(ld_argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(ld_argv[1]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(ld_argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_startconf: almost the same as the do_autoconf, except that doesn't
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * write file.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_startconf(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, ael_num = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_wep_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *selected = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char **argvnew = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_startconf(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx selected = select_profile(fd, 1, 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (selected == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) call_ioctl(fd, WLAN_COMMAND, WL_LOAD_DEFAULTS, 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = append_pa(selected);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_wep_section = find_section(gp_wepkey_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_wep_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_wep_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) do_set_wepkey(fd, pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist->ael_argc == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argvnew = aeltoargv(plist, &ael_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) do_set(fd, ael_num, argvnew);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ael_num; i++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(argvnew[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(argvnew);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxfind_active_profile(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL, *activep_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *pessid = NULL, *pbssid = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char essid[34], bssid[32];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *activeprofile = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("find_active_profile: %d\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_get_essid(fd) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) strlcpy(essid, ((wl_essid_t *)(gbuf->wldp_buf))->wl_essid_essid,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (essid));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_get_bssid(fd) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(bssid, sizeof (bssid), "%02x:%02x:%02x:%02x:%02x:%02x",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[0],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[1],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[2],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[3],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[4],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[5]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx activep_section = find_section(gp_config_file, WIFI_ACTIVEP);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (activep_section == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx activeprofile = get_value(activep_section->list->
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ael_head->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (activeprofile == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = gp_config_file->section_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (((plist = p_section->list) != NULL) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (plist->type == PROFILE) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(p_section->section_id, activeprofile) == 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strncmp(pae->ae_arg, "essid=",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx strlen("essid=")) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pessid = get_value(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strncmp(pae->ae_arg, "bssid=",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx strlen("bssid=")) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbssid = get_value(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pessid && pbssid &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(essid, pessid) == 0) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(bssid, pbssid) == 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (p_section->section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxrecord_active_profile(char *pname, int action)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char pbuf[256];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, WIFI_ACTIVEP);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = new_ael(ACTIVEP);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_section(gp_config_file, plist, WIFI_ACTIVEP);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (action == RECORD_ADD) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(pname != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(pbuf, sizeof (pbuf), "activep=%s", pname);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx update_aelist(plist, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (action == RECORD_DEL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(pname == NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx update_aelist(plist, "activep= ");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_loadpf: load a profile, set related parameters both in wifi
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * and in wifiwepkey, if network name is not exist in the
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * configration files, then we clean all parameters and set essid only
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_loadpf(int fd, int argc, char ** argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, ael_num = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int timeout = LOADPROFILE_TIMEOUT, forever = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_wep_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char **argvnew = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *connect;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pequal, *param;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_loadpf(%d, %x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: connect: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "profile name missing\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = safe_strdup(argv[1]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pequal = strchr(param, '=');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pequal != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pequal++ = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(param, "wait") != 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(pequal, "forever") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx forever = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (is_waittime_valid(pequal) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid value %s for 'wait'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, pequal);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (sscanf(pequal, "%d", &timeout) != 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (timeout == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx forever = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 2) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "useless tokens after '%s'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[1]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) call_ioctl(fd, WLAN_COMMAND, WL_LOAD_DEFAULTS, 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = append_pa(argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_wep_section = find_section(gp_wepkey_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_wep_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) set_prefer(gp_config_file, argv[0], 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_wep_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) do_set_wepkey(fd, pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx connect = "profile";
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) set_prefer(gp_config_file, argv[0], 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist->ael_argc == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argvnew = aeltoargv(plist, &ael_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if there is no 'essid' item in argvnew, the profile
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * name(argv[0]) is treated as essid.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ael_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strncmp(argvnew[i], "essid=", strlen("essid="))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx == 0)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (i == ael_num)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) do_set_essid(fd, argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) do_set(fd, ael_num, argvnew);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ael_num; i++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(argvnew[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(argvnew);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * set flag in {active_profile} so that showprofile knows
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * which profile is active when more than one profiles are
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * created for the same WLAN.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx record_active_profile(pbuf, RECORD_ADD);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) do_set_essid(fd, argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx connect = "essid";
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while ((forever == 1) || (timeout > 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((do_get_linkstatus(fd) == B_TRUE) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (*(wl_linkstatus_t *)(gbuf->wldp_buf) == WL_CONNECTED)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char bssid[32];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* record bssid in the profile */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_get_bssid(fd) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(bssid, sizeof (bssid),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "bssid=%02x:%02x:%02x:%02x:%02x:%02x",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[0],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[1],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[2],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[3],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[4],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((uint8_t *)gbuf->wldp_buf)[5]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx update_aelist(plist, bssid);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("%s: connecting to "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s '%s'\n"), gExecName, connect, argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) sleep(1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx timeout--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("connect counting:......%d\n", timeout));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to connect to "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s '%s'\n"), gExecName, connect, argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if wepkey is set in the profile, display wepkey|n=*****
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * when showprofile and getprofilewepkey.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if wepkeyn is NULL, all the wepkeys will be display,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * otherwise, just display the matching one.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxprint_wepkey_info(const char *id, const char *wepkeyn)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pequal, *param;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_wepkey_file, id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = safe_strdup(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pequal = strchr(param, '=');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pequal == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pequal = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (wepkeyn != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(wepkeyn, param) == 0)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\t%s=*****\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\t%s=*****\n", param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_printpf: print each parameters of the profile, if no network name
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * assigned, then print all profile saved in configration file.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_printpf(int fd, int argc, char ** argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_printpf(%d, %x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if no profile name is inputted, all the profiles will be displayed.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = gp_config_file->section_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist->type == PROFILE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%s\n", p_section->section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\t%s\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * identify whether wepkey is set
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * in the profile
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_wepkey_info(p_section->section_id, NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = append_pa(argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%s\n", p_section->section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\t%s\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * identify whether wepkey is set
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * in the profile
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_wepkey_info(p_section->section_id, NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff gettext("%s: showprofile : "
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff "no such profile: '%s'\n"),
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff gExecName, argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * find_ae: Find an ae by its contents, return its pointer.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic ae_t *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxfind_ae(aelist_t *plist, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *param = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pnext = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((arg == NULL) || (plist == NULL)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("find_ae: arg= NULL or plist=NULL\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("find_ae(0x%x, \"%s\")\n", plist, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = safe_strdup(arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pnext = strchr(param, '=');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pnext != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pnext = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("find_ae: param = \"%s\"\n", param));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((pae->ae_arg != NULL) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strncmp(pae->ae_arg, param, strlen(param)) == 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("find_ae: param = \"%s\"\n", param));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (pae);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * update_aelist: Update an aelist by arg, for example:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * there are an item with content"essid=ap7-2",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * update_aelist(0x..., "essid=myssid2") will update it as "essid=myssid2"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxupdate_aelist(aelist_t *plist, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((arg != NULL)&&(plist != NULL));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("update_aelist(0x%x, \"%s\")\n", plist, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = find_ae(plist, arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_ae(plist, arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae->ae_arg = safe_strdup(arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_deletepf: delete a profile in configration files.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_deletepf(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *section_id;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *prefer;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL, *p_sectionbak = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_deletepf(%d, \"%s\")\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc <= 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if a "all" is inputted, all the profiles will be deleted.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcasecmp(argv[0], "all") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = gp_config_file->section_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while ((p_section != NULL) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((plist = p_section->list) != NULL)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist->type == PROFILE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_sectionbak = p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_id = safe_strdup(p_section->section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) del_section(gp_config_file, section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) del_section(gp_wepkey_file, section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * remove the '[]' of the [section_id]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx prefer = section_id + 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *(prefer + strlen(section_id) - 2) = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) del_prefer(gp_config_file, prefer,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_sectionbak;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = p_section->section_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (gp_config_file != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_id = append_pa(argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (del_section(gp_config_file, section_id)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (del_section(gp_wepkey_file, section_id)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) del_prefer(gp_config_file,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv[i], B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: deleteprofile"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ": no such profile: '%s'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) del_prefer(gp_config_file, argv[i], B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) del_section(gp_wepkey_file, section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_history: Print the list in {history} section.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_history(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *param, *param_bak, *pcomma;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint32_t maxessidlen = 0, ulen;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char format[256], *ntstr;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint32_t nt = 0, cnt = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int len;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx time_t cltime;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_history(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing useless tokens "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "after 'history'\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, WIFI_HISTORY);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("no history section\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * If history section is empty, directly return.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * construct the output format in terms of the
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * maxmium essid length
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = safe_strdup(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pcomma = strchr(param, ',');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pcomma == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: history : "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "data format error\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pcomma = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ulen = strlen(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx maxessidlen = (maxessidlen > ulen
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ? maxessidlen:ulen);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((nt = (maxessidlen / 8 + 1)) > 4)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx nt = 4;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = snprintf(format, sizeof (format), gettext("essid"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ntstr = construct_format(nt);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((ntstr != NULL) && (strlen(ntstr) <= 4));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len += snprintf(format + len, sizeof (format) - len, "%s", ntstr);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len += snprintf(format + len, sizeof (format) - len,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("bssid\t\t encryption\tlast seen\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((len <= 0) || (len > sizeof (format) - 1)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("essid\t\t\t\tbssid\t\t encryption"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\tlast seen\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%s", format);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * output the contents of the history section.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = safe_strdup(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param_bak = param;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((pcomma = strchr(param, ',')) != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pcomma = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx cnt = nt - (min((strlen(param)/8 + 1), 4) - 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ntstr = construct_format(cnt);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(ntstr != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* display essid */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%s%s", param, ntstr);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(ntstr);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = pcomma + 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((pcomma = strchr(param, ',')) != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pcomma = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* display bssid */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%s ", param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = pcomma + 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((pcomma = strchr(param, ',')) != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pcomma = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* display wep */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%s\t\t", param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = pcomma + 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* display time stamp */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx cltime = (time_t)atol(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%s", ctime(&cltime));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param_bak);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_lsprefer: Print the list in {preferrence} section
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_lsprefer(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_lsprefer(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing useless tokens "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "after 'listprefer'\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, WIFI_PREFER);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (plist != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = append_pa(pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%d\t%s\n", ++i, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("no preference section\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_rmprefer: Remove an item in {preferrence} list
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_rmprefer(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_rmprefer(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc <= 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * if a "all" is inputted, all the items in the preference
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * list will be deleted.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcasecmp(argv[0], "all") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, WIFI_PREFER);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section != NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((p_section == NULL) || (plist == NULL))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pae);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_head = plist->ael_tail = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist->ael_argc = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (gp_config_file != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (del_prefer(gp_config_file, argv[i], B_TRUE)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxis_prefer_rank_valid(const char *pbuf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < strlen(pbuf); i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (isdigit(pbuf[i]) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx i = atoi(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((i >= 1) && (i <= MAX_PREFERENCE_NUM))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_setprefer: Set network preferrence
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_setprefer(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rank = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_setprefer(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc <= 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc == 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rank = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (is_prefer_rank_valid(argv[1]) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: preference rank "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "should be an integer within 1-10\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rank = atoi(argv[1]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (set_prefer(gp_config_file, argv[0], rank));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxis_wepkeyindex_valid(const char *pbuf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < strlen(pbuf); i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (isdigit(pbuf[i]) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx i = atoi(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((i >= 1) && (i <= MAX_NWEPKEYS))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxis_channel_valid(const char *pbuf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < strlen(pbuf); i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (isdigit(pbuf[i]) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx i = atoi(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((i >= 0) && (i <= MAX_CHANNEL_NUM))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxis_wepkey_valid(const char *pbuf, uint32_t length)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (length) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 10:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 26:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < length; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (isxdigit(pbuf[i]) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 5:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 13:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (ret == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "wepkey should be:\n"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\t 40bits: 5 char or 10 hex digits.\n"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\t 128bits: 13 char or 26 hex digits.\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * get_valid_wepkey: get an valid wepkey from stdin
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxget_valid_wepkey()
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *buf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t length = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct termios stored_settings;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct termios new_settings;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("get_valid_wepkey()\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf = safe_calloc(sizeof (char), MAX_KEY_LENGTH + 2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Because we need to get single char from terminal, so we need to
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * disable canonical mode and set buffer size to 1 tyte. And because
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * wepkey should not be see by others, so we disable echo too.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fflush(stdin);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) tcgetattr(0, &stored_settings);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_settings = stored_settings;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_settings.c_lflag &= (~ICANON);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_settings.c_lflag &= (~ECHO);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_settings.c_cc[VTIME] = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_settings.c_cc[VMIN] = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* Set new terminal attributes */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) tcsetattr(0, TCSANOW, &new_settings);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (((buf[i++] = getchar()) != '\n') && (i < MAX_KEY_LENGTH + 1)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) putchar('*');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) putchar('\n');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* Restore terminal attributes */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) tcsetattr(0, TCSANOW, &stored_settings);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fflush(stdin);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (buf[--i] != '\n') {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: wepkey length "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "exceeds 26 hex digits\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* Replace last char '\n' with '\0' */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf[i] = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx length = (uint8_t)i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return ((is_wepkey_valid(buf, length) == B_TRUE)?
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx buf : NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_set_wepkey: Set parameters in wepkey, and call ioctl
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_wepkey(int fd, const char *pbuf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int id = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char i = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t len = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t length;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *wepkey = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char key[MAX_KEY_LENGTH] = {0};
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx unsigned int keytmp;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_wep_key_tab_t wepkey_tab;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_wepkey(%d, \"%s\")\n", fd, pbuf));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!check_authority(AUTH_WEP)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx id = pbuf[strlen("wepkeyn") - 1] - '0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wepkey = get_value(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx length = strlen(wepkey);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (length) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 10:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 26:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < length / 2; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) sscanf(wepkey + i * 2, "%2x", &keytmp);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx key[i] = (char)keytmp;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = length / 2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 5:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 13:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) strlcpy(key, wepkey, MAX_KEY_LENGTH);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = length;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_wepkey: error pbuf size\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "wepkey should be:\n"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\t 40bits: 5 char or 10 hex digits.\n"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\t 128bits: 13 char or 26 hex digits.\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(wepkey_tab, 0, sizeof (wepkey_tab));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < MAX_NWEPKEYS; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wepkey_tab[i].wl_wep_operation = WL_NUL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (id > 0 && id <= MAX_NWEPKEYS) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wepkey_tab[id-1].wl_wep_operation = WL_ADD;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wepkey_tab[id-1].wl_wep_length = len;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memcpy(wepkey_tab[id-1].wl_wep_key, key, len);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: wepkeyindex "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "should be an integer within the range 1-4\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &wepkey_tab, sizeof (wl_wep_key_tab_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_WEP_KEY_TAB,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (wl_wep_key_tab_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * get the committed wepkey. the return form is like wepkey1=*****;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic char *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxget_commit_key(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int key;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int len;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *wepkey = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *wepkey_confirm = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx key = atoi(argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (key <= 0 || key > MAX_NWEPKEYS) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: wepkeyindex "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "should be an integer within the range 1-4\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("input wepkey%d:"), key);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wepkey = get_valid_wepkey();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (wepkey == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(gettext("confirm wepkey%d:"), key);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wepkey_confirm = get_valid_wepkey();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (wepkey_confirm == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(wepkey);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(wepkey, wepkey_confirm) != 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(wepkey);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(wepkey_confirm);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: wepkey: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "two inputs are not identical\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(wepkey_confirm); /* wepkey_confirm is no longer used */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = MAX_KEY_LENGTH + strlen("wepkey1=\n") + 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = safe_malloc(len);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(pbuf, len, "%s%d=%s", "wepkey", key, wepkey);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(wepkey); /* wepkey is no longer used */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_wepkey: Get input from user, call do_set_wepkey
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_wepkey(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_wepkey(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc <= 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing useless tokens "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "after 'setwepkey'\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = get_commit_key(fd, argc, argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((pbuf != NULL) && (do_set_wepkey(fd, pbuf) == B_TRUE)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_setprofwepkey(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *section_id = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_setprofwepkey(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc < 2) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 2) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing useless tokens "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "after 'setprofwepkey'\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_id = append_pa(argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_wepkey_file, section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(section_id);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "no such profile: '%s'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argc--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = get_commit_key(fd, argc, argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pbuf == NULL)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx update_aelist(plist, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_wlanlist: Scan for wlanlist
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_wlanlist(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_wlanlist(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing useless tokens "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "after 'scan'\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (call_ioctl(fd, WLAN_COMMAND, WL_SCAN, 0) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to scan\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_get_wlanlist(fd) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_gbuf(WLANLIST);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_showstatus: show the basic status of the interface, including
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * linkstauts, essid, encryption and signal strength.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_showstatus(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_rssi_t signal;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *active_profile = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_showstatus(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing useless tokens "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "after 'showstatus'\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_get_linkstatus(fd) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_gbuf(LINKSTATUS);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (*(wl_linkstatus_t *)(gbuf->wldp_buf) == WL_NOTCONNECTED) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx active_profile = find_active_profile(fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tactive profile: %s\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx active_profile ? active_profile : "none");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_get_essid(fd) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_gbuf(ESSID);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_get_bssid(fd) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_gbuf(BSSID);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_get_encryption(fd) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_gbuf(ENCRYPTION);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_get_signal(fd) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx signal = *(wl_rssi_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (signal < 4) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tsignal strength: weak(%d)\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx signal);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if ((signal >= 4) && (signal <= 11)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tsignal strength: medium(%d)\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx signal);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tsignal strength: strong(%d)\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx signal);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_restoredef: Ask driver for loading default parameters
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_restoredef(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_restoredef(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing useless tokens "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "after 'restoredef'\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx record_active_profile(NULL, RECORD_DEL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (call_ioctl(fd, WLAN_COMMAND, WL_LOAD_DEFAULTS, 0) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_disconnect: disconnect from the current connectted network
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_disconnect(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_disconnect(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc > 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: trailing useless tokens "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "after 'disconnect'\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx record_active_profile(NULL, RECORD_DEL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (call_ioctl(fd, WLAN_COMMAND, WL_DISASSOCIATE, 0) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_essid(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_essid_t essid;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_essid(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * a trick here: clean the active_profile flag
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * in section{active_profile}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx record_active_profile(NULL, RECORD_DEL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(&essid, 0x0, sizeof (essid));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (arg == NULL || strcmp(arg, "") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx essid.wl_essid_length = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx essid.wl_essid_essid[0] = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx essid.wl_essid_length = strlen(arg);
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff if (essid.wl_essid_length > MAX_ESSID_LENGTH - 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "essid exceeds 32 bytes\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) strcpy(essid.wl_essid_essid, arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &essid, sizeof (wl_essid_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_ESSID, sizeof (wl_essid_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_bsstype(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_bss_type_t bsstype;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_bsstype(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(&bsstype, 0xff, sizeof (bsstype));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((strcasecmp(arg, "BSS") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(arg, "AP") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(arg, "INFRASTRUCTURE") == 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx bsstype = WL_BSS_BSS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if ((strcasecmp(arg, "IBSS") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(arg, "AD-HOC") == 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx bsstype = WL_BSS_IBSS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (strcasecmp(arg, "AUTO") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx bsstype = WL_BSS_ANY;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: bsstype: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "bss(ap,infrastructure) ibss(ad-hoc) or auto\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &bsstype, sizeof (wl_bss_type_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_BSS_TYPE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (wl_bss_type_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_createibss(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_create_ibss_t create_ibss;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_createibss(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(&create_ibss, 0x0, sizeof (create_ibss));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcasecmp(arg, "YES") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx create_ibss = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (strcasecmp(arg, "NO") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx create_ibss = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "createibss: yes or no\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &create_ibss,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (wl_create_ibss_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_CREATE_IBSS,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (wl_create_ibss_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_channel(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_phy_conf_t phy_conf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_channel(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(&phy_conf, 0xff, sizeof (phy_conf));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (is_channel_valid(arg) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: channel No. "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "should be:\n"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\t802.11a: 0-99\n"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\t802.11b: 1-14\n"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "\t802.11g: 1-14\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx phy_conf.wl_phy_dsss_conf.wl_dsss_channel = atoi(arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("channel=%d\n", phy_conf.wl_phy_dsss_conf.wl_dsss_channel));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &phy_conf, sizeof (wl_phy_conf_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_PHY_CONFIG,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (wl_phy_conf_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * is_rates_support: Querying driver about supported rates.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxis_rates_support(int fd, int num, uint8_t *rates)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int rates_num = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, j = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t value = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert((rates != NULL)&&(num != 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("is_rates_support(%d, %d, 0x%x)\n", fd, num, rates));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (call_ioctl(fd, WLAN_GET_PARAM, WL_SUPPORTED_RATES, 0)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rates_num = ((wl_rates_t *)(gbuf->wldp_buf))->wl_rates_num;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("rates[%d] = %d\n", i, rates[i]));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (j = 0; j < rates_num; j++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx value = ((wl_rates_t *)gbuf->wldp_buf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_rates_rates[j];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("supported rates[%d]=%d\n", j, value));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (value == rates[i]) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (j == rates_num) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (rates[i] == 11) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "rate 5.5M is not supported\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "rate %dM is not supported\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, rates[i]/2);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic uint8_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxrates_convert(const char *rates)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t ret;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < WIFI_RATES_NUM; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(rates, wifi_rates_s[i].rates_s) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = wifi_rates_s[i].rates_i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (i == WIFI_RATES_NUM) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid rates '%s'\n"), gExecName, rates);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * get_rates: convert string value arg into uint8_t array,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * array length will be save into *len[i].
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * for example:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * arg = "1,2,5.5,11"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * then after call, rates[] = {2,4,11,22} will be returned.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * and *len will equal to 4
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic uint8_t *
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxget_rates(const char *arg, uint32_t *len)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 1, j = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t *rates = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pnext = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *token;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pstart;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pstart_bak;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strlen(arg) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("get_rates: empty rates string\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("get_rates(\"%s\", 0x%x)\n", arg, len));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pstart = safe_strdup(arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pstart_bak = pstart;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while ((pnext = strchr(pstart, ',')) != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pstart = pnext + 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx i++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *len = i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rates = safe_calloc(sizeof (uint8_t), i);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pstart = pstart_bak;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((token = strtok(pstart, ",")) != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("rates[0]: %s\n", token));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rates[0] = rates_convert(token);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx i = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while ((token = strtok(NULL, ",")) != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("rates[%d]: %s\n", i, token));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rates[i++] = rates_convert(token);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pstart_bak);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < *len; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (j = 0; j < i; j++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (rates[j] == rates[i]) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: rates duplicated\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(rates);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (rates);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_rates(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint32_t num = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t *rates;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_rates(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rates = get_rates(arg, &num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((rates == NULL) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx is_rates_support(fd, num, rates) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((wl_rates_t *)(gbuf->wldp_buf))->wl_rates_num = num;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((wl_rates_t *)gbuf->wldp_buf)->wl_rates_rates[i]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx = rates[i];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(rates);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_DESIRED_RATES,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx offsetof(wl_rates_t, wl_rates_rates) +
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx num*sizeof (char)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_powermode(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_ps_mode_t ps_mode;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_powermode(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(&ps_mode, 0xff, sizeof (ps_mode));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((strcasecmp(arg, "OFF") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(arg, "MPS") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(arg, "FAST") == 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (arg[0]) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 'O':
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 'o':
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ps_mode.wl_ps_mode = WL_PM_AM;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 'M':
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 'm':
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ps_mode.wl_ps_mode = WL_PM_MPS;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 'F':
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 'f':
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ps_mode.wl_ps_mode = WL_PM_FAST;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: powermode: off mps or fast\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &ps_mode, sizeof (wl_ps_mode_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_POWER_MODE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (wl_ps_mode_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_authmode(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_authmode_t auth_mode;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_authmode(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(&auth_mode, 0xff, sizeof (auth_mode));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /* Mark */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcasecmp(arg, "OPENSYSTEM") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx auth_mode = WL_OPENSYSTEM;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (strcasecmp(arg, "SHARED_KEY") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx auth_mode = WL_SHAREDKEY;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: authmode: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "opensystem or shared_key\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &auth_mode, sizeof (wl_authmode_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_AUTH_MODE,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (wl_authmode_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_encryption(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_encryption_t encryption;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_encryption(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(&encryption, 0xff, sizeof (encryption));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcasecmp(arg, "NONE") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx encryption = WL_NOENCRYPTION;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (strcasecmp(arg, "WEP") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx encryption = WL_ENC_WEP;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: encryption: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "none or wep\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &encryption, sizeof (wl_encryption_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_ENCRYPTION,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (wl_encryption_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_wepkeyid(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_wep_key_id_t wep_key_id;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_wepkeyid(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(&wep_key_id, 0xff, sizeof (wep_key_id));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (is_wepkeyindex_valid(arg) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: wepkeyindex "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "should be an integer within the range 1-4\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wep_key_id = atoi(arg) - 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &wep_key_id, sizeof (wl_wep_key_id_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_WEP_KEY_ID,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx sizeof (wl_wep_key_id_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set_radioon(int fd, const char *arg)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_radio_t radio;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(arg != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set_radioon(%d, \"%s\")\n", fd, arg));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(&radio, 0xff, sizeof (radio));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcasecmp(arg, "ON") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx radio = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else if (strcasecmp(arg, "OFF") == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx radio = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: radio : on or off\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memmove(gbuf->wldp_buf, &radio, sizeof (wl_radio_t));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_SET_PARAM, WL_RADIO, sizeof (wl_radio_t)));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * print_gbuf: After each ioctl system call, gbuf will contain result, gbuf
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * contents's format varies from each kind of ioctl system call.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxprint_gbuf(config_item_t index)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, j = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint32_t ess_num;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char **ess_argv;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint32_t rates_num;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint32_t subtype;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_bss_type_t bsstype;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_create_ibss_t createibss;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_ps_mode_t *ps_mode;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_authmode_t authmode;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_encryption_t encryption;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_wep_key_id_t wepkeyid;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_rssi_t signal;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_radio_t radioon;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_ess_conf_t **p_ess_conf;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_linkstatus_t linkstatus;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char format[256], *ntstr;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint32_t maxessidlen = 0, nt = 0, cnt = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int len;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t bssid[6];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("print_gbuf(%d)\n", index));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(gbuf->wldp_length < MAX_BUF_LEN);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (index) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case BSSID:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tbssid: ");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(bssid, 0, sizeof (bssid));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (memcmp((uint8_t *)gbuf->wldp_buf, bssid, sizeof (bssid))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("none\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) memset(bssid, 0xff, sizeof (bssid));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (memcmp((uint8_t *)gbuf->wldp_buf, bssid, sizeof (bssid))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("none\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < 5; i++)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%02x:", ((uint8_t *)gbuf->wldp_buf)[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%02x\n", ((uint8_t *)gbuf->wldp_buf)[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case ESSID:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tessid: %s\n", ((wl_essid_t *)(gbuf->wldp_buf))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_essid_essid);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case BSSTYPE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx bsstype = *(wl_bss_type_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (bsstype) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_BSS_BSS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tbsstype: bss(ap, infrastructure)\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_BSS_IBSS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tbsstype: ibss(ad-hoc)\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_BSS_ANY:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tbsstype: auto\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid bsstype value\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case CREATEIBSS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx createibss = *(wl_create_ibss_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (createibss) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case B_TRUE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tcreateibss: yes\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case B_FALSE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tcreateibss: no\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid createibss value\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case CHANNEL:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx subtype = ((wl_fhss_t *)(gbuf->wldp_buf))->wl_fhss_subtype;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (subtype) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_FHSS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_DSSS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_IRBASE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_HRDS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_ERP:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tchannel: %d\n", ((wl_fhss_t *)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (gbuf->wldp_buf))->wl_fhss_channel);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_OFDM:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tchannel: %d\n", ((wl_ofdm_t *)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (gbuf->wldp_buf))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_ofdm_frequency);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid subtype\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case RATES:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rates_num = ((wl_rates_t *)(gbuf->wldp_buf))->wl_rates_num;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\trates: ");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < rates_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char rate;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rate = ((wl_rates_t *)gbuf->wldp_buf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_rates_rates[i];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (rate == WL_RATE_5_5M)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("5.5");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%d", (uint8_t)(rate / 2));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (i == (rates_num - 1))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf(",");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case POWERMODE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ps_mode = (wl_ps_mode_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (ps_mode->wl_ps_mode) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_PM_AM:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tpowermode: off\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_PM_MPS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tpowermode: mps\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_PM_FAST:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tpowermode: fast\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid powermode value\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case AUTHMODE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx authmode = *(wl_authmode_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (authmode) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_OPENSYSTEM:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tauthmode: opensystem\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_SHAREDKEY:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tauthmode: shared_key\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid authmode value\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case ENCRYPTION:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx encryption = *(wl_encryption_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (encryption) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_NOENCRYPTION:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tencryption: none\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_ENC_WEP:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tencryption: wep\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid encryption value\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WEPKEYID:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wepkeyid = *(wl_wep_key_id_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\twepkeyindex: %d\n", wepkeyid + 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case SIGNAL:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx signal = *(wl_rssi_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tsignal: %d\n", signal);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case RADIOON:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx radioon = *(wl_radio_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (radioon) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case B_TRUE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tradio: on\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case B_FALSE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tradio: off\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default: /* Mark */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid radioon value\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case LINKSTATUS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx linkstatus = *(wl_linkstatus_t *)(gbuf->wldp_buf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (linkstatus) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_CONNECTED:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tlinkstatus: connected\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WL_NOTCONNECTED:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tlinkstatus: not connected\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default: /* Mark */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid linkstatus value\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WLANLIST:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ess_num = ((wl_ess_list_t *)(gbuf->wldp_buf))->wl_ess_list_num;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ess_argv = safe_calloc(sizeof (char *), ess_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_ess_conf = safe_calloc(sizeof (wl_ess_conf_t *), ess_num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_ess_conf[i] = ((wl_ess_list_t *)gbuf->wldp_buf)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_ess_list_ess + i;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx maxessidlen = (maxessidlen >
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx strlen(p_ess_conf[i]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_ess_conf_essid.wl_essid_essid) ?
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx maxessidlen :
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx strlen(p_ess_conf[i]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_ess_conf_essid.wl_essid_essid));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * construct the output format.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((nt = (maxessidlen / 8 + 1)) > 4)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx nt = 4;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = snprintf(format, sizeof (format), gettext("essid"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ntstr = construct_format(nt);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(ntstr != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len += snprintf(format + len, sizeof (format) - len, "%s",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ntstr);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len += snprintf(format + len, sizeof (format) - len,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("bssid\t\t type\t\tencryption\tsignallevel\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((len <= 0) || (len > sizeof (format) - 1)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("essid\t\t\t\tbssid\t\t type\t\t"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "encryption\tsignallevel\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%s", format);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ess_argv[i] = safe_malloc(MAX_SCANBUF_LEN);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(ess_argv[i], MAX_SCANBUF_LEN,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s%c%02x:%02x:%02x:%02x:%02x:%02x%c%s",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_ess_conf[i]->wl_ess_conf_essid.wl_essid_essid,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ',',
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[0]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[1]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[2]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[3]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[4]),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (uint8_t)(p_ess_conf[i]->wl_ess_conf_bssid[5]), ',',
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (p_ess_conf[i]->wl_ess_conf_wepenabled ==
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE ? "wep":"none"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx len = strlen(p_ess_conf[i]->wl_ess_conf_essid.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_essid_essid);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx cnt = nt - (min(len /8 + 1, 4) - 1);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ntstr = construct_format(cnt);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(ntstr != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%s%s", p_ess_conf[i]->wl_ess_conf_essid.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wl_essid_essid, ntstr);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(ntstr);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (j = 0; j < 5; j++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%02x:", (uint8_t)(p_ess_conf[i]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_ess_conf_bssid[j]));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("%02x ", (uint8_t)(p_ess_conf[i]
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ->wl_ess_conf_bssid[j]));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_ess_conf[i]->wl_ess_conf_bsstype ==
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WL_BSS_BSS)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("access point");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("ad-hoc");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_ess_conf[i]->wl_ess_conf_wepenabled ==
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx WL_ENC_WEP)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\twep\t");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\tnone\t");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\t%d\n", p_ess_conf[i]->wl_ess_conf_sl);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx add_to_history(gp_config_file, ess_num, ess_argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(p_ess_conf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < ess_num; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(ess_argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(ess_argv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid parameter type\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_get_xxx: will send ioctl to driver, then the driver will fill gbuf
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * with related value. gbuf has a format of wldp_t structure.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_bssid(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_bssid(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_BSSID, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_essid(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_essid(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_ESSID, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_bsstype(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_bsstype(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_BSS_TYPE, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_createibss(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_createibss(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_CREATE_IBSS, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_channel(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_channel(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_PHY_CONFIG, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_wlanlist(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_wlanlist(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_ESS_LIST, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_linkstatus(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_linkstauts(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_LINKSTATUS, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_rates(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_rates(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_DESIRED_RATES, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_powermode(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_powermode(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_POWER_MODE, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_authmode(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_authmode(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_AUTH_MODE, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_encryption(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_encryption(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_ENCRYPTION, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_wepkeyid(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_wepkeyid(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_WEP_KEY_ID, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_signal(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_signal(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_RSSI, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get_radioon(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get_radioon(%d)\n", fd));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (call_ioctl(fd, WLAN_GET_PARAM, WL_RADIO, 0));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * param has two kinds of forms:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 'wepkeyn=*****' (when equalflag == B_TRUE),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 'wepkeyn' (when equalflag == B_FALSE)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxparam_is_wepkey(char *param, boolean_t equalflag)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((equalflag == B_FALSE) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(param, "wepkey1") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(param, "wepkey2") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(param, "wepkey3") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(param, "wepkey4") == 0))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else if ((equalflag == B_TRUE) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strncmp(param, "wepkey1=", strlen("wepkey1="))) == 0 ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strncmp(param, "wepkey2=", strlen("wepkey2="))) == 0 ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strncmp(param, "wepkey3=", strlen("wepkey3="))) == 0 ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strncmp(param, "wepkey4=", strlen("wepkey4="))) == 0)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * update/add items in the profile
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxitems_in_profile(aelist_t *cplist, aelist_t *wplist, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, j = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *param;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pequal;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *wepkey;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (param_is_wepkey(argv[i], B_TRUE) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wepkey = get_value(argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (value_is_valid(WEPKEY, wepkey) == B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid value '%s' for parameter "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "'wepkey'\n"), gExecName, wepkey);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx update_aelist(wplist, argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx continue;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = safe_strdup(argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pequal = strchr(param, '=');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pequal == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid argument '%s', use "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "parameter=value'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pequal++ = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (j = 0; j < N_GS_FUNC; j++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(param, do_gs_func[j].cmd) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (j == N_GS_FUNC) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "unrecognized parameter '%s'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (value_is_valid(do_gs_func[j].index, pequal) ==
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_FALSE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "invalid value '%s' for parameter '%s'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, pequal, param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx update_aelist(cplist, argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_TRUE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_createprofile: Called when create a profile off-line.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_createprofile(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pfbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx const char *profilename;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist_config = NULL, *plist_wepkey = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_createprofile(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc <= 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * When creating a profile, if the profile name is not specified,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * the essid is selected as the profile name. the paramters are
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * saved into the section.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strchr(argv[0], '=') == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pfbuf = safe_strdup(argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argc--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strncmp(argv[i], "essid=", strlen("essid=")) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (i == argc) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "essid required when creating profile\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx profilename = (pfbuf ? pfbuf : get_value(argv[i]));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strlen(profilename) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "non-empty essid required\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * 'all', '{preference}', '{history}', '{active_profile}'
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * and any string with '[' as start and ']' as end should
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * not be a profile name
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((strcasecmp(profilename, "all") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(profilename, WIFI_HISTORY) == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(profilename, WIFI_PREFER) == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(profilename, WIFI_ACTIVEP) == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ((profilename[0] == '[') &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (profilename[strlen(profilename) - 1] == ']'))) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "'%s' is an invalid profile name\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, profilename);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = append_pa(profilename);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_createprofile: profile_name = %s\n", pbuf));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((find_section(gp_config_file, pbuf) != NULL) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx find_section(gp_wepkey_file, pbuf) != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "profile '%s' already exists\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, profilename);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Save each parameters in the profile.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist_config = new_ael(PROFILE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_section(gp_config_file, plist_config, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist_wepkey = new_ael(PROFILE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx new_section(gp_wepkey_file, plist_wepkey, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pfbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (items_in_profile(plist_config, plist_wepkey,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit1:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pfbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_setprofparam(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *psection_config = NULL, *psection_wep = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist_config = NULL, *plist_wepkey = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_setprofparam(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc < 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = append_pa(argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx psection_config = find_section(gp_config_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx psection_wep = find_section(gp_wepkey_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((psection_config == NULL) || (psection_wep == NULL)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "profile '%s' doesn't exist\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (B_FALSE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * modify each parameters in the profile.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist_config = psection_config->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist_wepkey = psection_wep->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argc--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (items_in_profile(plist_config, plist_wepkey,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*ARGSUSED*/
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_getprofparam(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, j = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int flag;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx section_t *p_section = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx aelist_t *plist = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ae_t *pae = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pbuf = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_getprofparam(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc < 1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_IMPROPER_USE);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pbuf = append_pa(argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx p_section = find_section(gp_config_file, pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (p_section == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "profile '%s' doesn't exist\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argc--;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx plist = p_section->list;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(plist != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * If no specific parameter typed, we print out all parameters
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while (pae != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pae->ae_arg != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\t%s\n", pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_wepkey_info(p_section->section_id, NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Match function with do_gs_func[] table, and print its result
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx flag = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (j = 0; j < N_GS_FUNC; j++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(argv[i], do_gs_func[j].cmd) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (param_is_wepkey(argv[i], B_FALSE) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx j = WEPKEY;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_wepkey_info(p_section->section_id,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx flag++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (j == N_GS_FUNC) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("wificonifg: unrecognized parameter: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s\n"), argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = plist->ael_head;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while ((pae != NULL) && (!flag)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((pae->ae_arg != NULL) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strncmp(pae->ae_arg, argv[i],
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx strlen(argv[i])) == 0)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("\t%s\n", pae->ae_arg);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx flag++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pae = pae->ae_next;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!flag) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "parameter '%s' has not been set in profile %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[i], pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(pbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Verify whether the value in the parameter=value pair is valid or not.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * For the channel, since we donot know what kind of wifi card(a,b,or g)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * is in the system, so we just leave to verify the validity of the value
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * when the value is set to the card.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The same goes for the rates.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxvalue_is_valid(config_item_t item, const char *value)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint32_t num = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx uint8_t *rates;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t ret;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(value != NULL);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (item) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case ESSID:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strlen(value) > 32)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case BSSTYPE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((strcasecmp(value, "bss") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "ap") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "infrastructure") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "ibss") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "ad-hoc") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "auto") == 0))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case CREATEIBSS:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((strcasecmp(value, "yes") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "no") == 0))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case AUTHMODE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((strcasecmp(value, "opensystem") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "shared_key") == 0))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case POWERMODE:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((strcasecmp(value, "off") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "mps") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "fast") == 0))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case ENCRYPTION:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((strcasecmp(value, "wep") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "none") == 0))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case RADIOON:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((strcasecmp(value, "on") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcasecmp(value, "off") == 0))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WEPKEYID:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = is_wepkeyindex_valid(value);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case WEPKEY:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = is_wepkey_valid(value, strlen(value));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case CHANNEL:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = is_channel_valid(value);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case RATES:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rates = get_rates(value, &num);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (rates == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(rates);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * do_set: Called when set a parameter, the format should be
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * parameter=value.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_set(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, j = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *param;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *pequal;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *value;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t ret;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc <= 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) do_print_support_params(fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Set each parameters, if one failed, others behind it will
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * not be set
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Separate param and its value, if the user types "param=",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * then value will be set to "";if the user types "param",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * it is an error.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param = safe_strdup(argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx pequal = strchr(param, '=');
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx value = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (pequal != NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *pequal = '\0';
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx value = pequal + 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: invalid setparam argument "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "'%s', use 'parameter=value'\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_set: param = \"%s\", value = \"%s\"\n",
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx param, value));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (j = 0; j < N_GS_FUNC; j++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Match each parameters with do_gs_func table,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(param, do_gs_func[j].cmd) == 0)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (param_is_wepkey(param, B_FALSE) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx value = argv[i];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx j = WEPKEY;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (j == N_GS_FUNC) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: unrecognized parameter: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s\n"), gExecName, param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_gs_func[j].p_do_set_func == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: parameter '%s' is read-only\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, do_gs_func[j].cmd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_gs_func[j].p_do_set_func(fd, value)
0d2f4bc964616a7fec76406480264fcaa2cfbc14ff == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (gbuf->wldp_result != WL_SUCCESS) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "failed to set '%s' for "),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_error(gbuf->wldp_result);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(param);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic boolean_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxdo_get(int fd, int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i = 0, j = 0, n = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx boolean_t ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("do_get(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx assert(fd > 0);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * If no specific parameter typed, we print out all parameters
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc <= 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < N_GS_FUNC; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((do_gs_func[i].p_do_get_func != NULL) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (do_gs_func[i].p_do_get_func(fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx == B_TRUE)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_gbuf(do_gs_func[i].index);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx n++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = n ? B_TRUE:B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Match function with do_gs_func[] table, and print its result
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (j = 0; j < N_GS_FUNC; j++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(argv[i], do_gs_func[j].cmd) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (param_is_wepkey(argv[i], B_FALSE) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx j = WEPKEY;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (j == N_GS_FUNC) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("wificonifg: unrecognized parameter: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s\n"), argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_gs_func[j].p_do_get_func == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: parameter '%s' is write-only\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, do_gs_func[j].cmd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_gs_func[j].p_do_get_func(fd) == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_gbuf(do_gs_func[j].index);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_TRUE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "failed to read parameter '%s' : "),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, argv[i]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx print_error(gbuf->wldp_result);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = B_FALSE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx/*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * Only one wificonfig is running at one time.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * The following wificonfig which tries to be run will return error,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * and the pid of the process will own the filelock will be printed out.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic pid_t
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxenter_wifi_lock(int *fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int fd0 = -1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct flock lock;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx fd0 = open(WIFI_LOCKF, O_CREAT|O_WRONLY, 0600);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (fd0 < 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to open lockfile"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " '"WIFI_LOCKF"': %s\n"), gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx *fd = fd0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx lock.l_type = F_WRLCK;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx lock.l_whence = SEEK_SET;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx lock.l_start = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx lock.l_len = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((fcntl(fd0, F_SETLK, &lock) == -1) &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (errno == EAGAIN || errno == EDEADLK)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (fcntl(fd0, F_GETLK, &lock) == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gettext("%s: enter_filelock"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit(WIFI_FATAL_ERR);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s:"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "enter_filelock:filelock is owned "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "by 'process %d'\n"), gExecName, lock.l_pid);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (lock.l_pid);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (getpid());
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit_wifi_lock(int fd)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx struct flock lock;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx lock.l_type = F_UNLCK;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx lock.l_whence = SEEK_SET;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx lock.l_start = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx lock.l_len = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (fcntl(fd, F_SETLK, &lock) == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: failed to"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " exit_filelock: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) close(fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxint
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxmain(int argc, char **argv)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int i, ret;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int fddev = -1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int c, iflag = 0, rflag = 0, fileonly = 0, readonly = 0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx int fd;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *iname = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char *path = NULL;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx extern char *optarg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx extern int optind;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char interface[LIFNAMSIZ];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char file_wifi[MAX_CONFIG_FILE_LENGTH];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx char file_wifiwepkey[MAX_CONFIG_FILE_LENGTH];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx priv_set_t *ppriv;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx wifi_auth_t autht;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("main(%d, 0x%x)\n", argc, argv));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("uid=%d\n", getuid()));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("euid=%d\n", geteuid()));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#ifdef DEBUG
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (wifi_debug == 1) { /* for debuf purpose only */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) printf("Press RETURN to continue...\n");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) getchar();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#endif
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_EXIT_DEF;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) setlocale(LC_ALL, "");
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) textdomain(TEXT_DOMAIN);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName = argv[0];
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gbuf = safe_malloc(MAX_BUF_LEN);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((ppriv = priv_str_to_set("basic", ",", NULL)) == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("main: priviledge init error\n"));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "set priviledge to 'basic' error\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) priv_addset(ppriv, PRIV_NET_RAWACCESS);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) priv_addset(ppriv, PRIV_SYS_NET_CONFIG);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (setppriv(PRIV_SET, PRIV_PERMITTED, ppriv) == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "set permitted priviledge: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (setppriv(PRIV_SET, PRIV_LIMIT, ppriv) == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "set limit priviledge: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (setppriv(PRIV_SET, PRIV_INHERITABLE, ppriv) == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "set inherit priviledge: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (setppriv(PRIV_SET, PRIV_EFFECTIVE, ppriv) == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "set effective priviledge: %s\n"),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gExecName, strerror(errno));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx priv_freeset(ppriv);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < argc; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("%d\t\t\"%s\"\n", i, argv[i]));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx while ((c = getopt(argc, argv, "i:R:")) != EOF) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx switch (c) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 'i':
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (iflag) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_IMPROPER_USE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx iflag = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx iname = optarg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case 'R':
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (rflag) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_IMPROPER_USE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx rflag = 1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx path = optarg;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx case '?':
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx default:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_IMPROPER_USE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argc -= optind;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx argv += optind;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (argc <= 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (iname) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((fddev = open_dev(iname)) == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_print_support_params(fddev) ==
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx B_TRUE)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_EXIT_DEF;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_IMPROPER_USE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx for (i = 0; i < N_FUNC; i++) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (strcmp(argv[0], do_func[i].cmd) == 0) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx autht = ((strcmp(argv[0], "setwepkey") == 0) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (strcmp(argv[0], "setprofwepkey") == 0)) ?
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx AUTH_WEP:AUTH_OTHER;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_func[i].b_auth &&
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx !check_authority(autht)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_func[i].b_fileonly)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx fileonly++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_func[i].b_readonly)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx readonly++;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx break;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (i == N_FUNC) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: unrecognized "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "subcommand: %s\n"), gExecName, argv[0]);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_IMPROPER_USE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((fileonly) && (iname)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx do_print_usage();
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_IMPROPER_USE;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((!fileonly) && (!iname)) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (search_interface(interface) != B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) fprintf(stderr, gettext("%s: "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "failed to find the default wifi interface;"
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx " -i option should be used to specify the "
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "wifi interface\n"), gExecName);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx iname = interface;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (iname) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((fddev = open_dev(iname)) == -1) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit0;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (rflag) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(file_wifi, sizeof (file_wifi),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s%s", path, p_file_wifi);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(file_wifiwepkey, sizeof (file_wifiwepkey),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s%s", path, p_file_wifiwepkey);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(file_wifi, sizeof (file_wifi),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s", p_file_wifi);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx safe_snprintf(file_wifiwepkey, sizeof (file_wifiwepkey),
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx "%s", p_file_wifiwepkey);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * There is an occasion when more than one wificonfig processes
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * which attempt to write the <wifi> and <wifiwepkey> files are
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * running. We must be able to avoid this.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * We use file lock here to implement this.
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if ((!readonly) && (enter_wifi_lock(&fd) != getpid())) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit1;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gp_config_file = parse_file(file_wifi);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (gp_config_file == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx gp_wepkey_file = parse_file(file_wifiwepkey);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (gp_wepkey_file == NULL) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx destroy_config(gp_config_file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx goto exit2;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_func[i].p_do_func(fddev, argc-1, argv+1)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx == B_TRUE) {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx /*
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * can not write file when startconfing
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx * during boot
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx */
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (do_func[i].b_readonly)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_EXIT_DEF;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else if ((fprint_config_file(gp_config_file,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx file_wifi) != B_TRUE) ||
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (fprint_config_file(gp_wepkey_file,
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx file_wifiwepkey) != B_TRUE))
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx else
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_EXIT_DEF;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx } else {
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx PRTDBG(("Command %s failed\n", argv[0]));
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx ret = WIFI_FATAL_ERR;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx }
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx destroy_config(gp_wepkey_file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx destroy_config(gp_config_file);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit2:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (!readonly)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx exit_wifi_lock(fd);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit1:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx if (iname)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) close(fddev);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxexit0:
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx free(gbuf);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx return (ret);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#ifdef DEBUG
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxstatic void
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhxwifi_dbgprintf(char *fmt, ...)
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx{
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx va_list ap;
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx va_start(ap, fmt);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx (void) vfprintf(stdout, fmt, ap);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx va_end(ap);
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx}
516fc7f3e48e25d0375ea3f93ead33ec38bc597bhx#endif