Exemple #1
0
static void safe_leave(int signo){
	csprintf("\n## wanduck.safeexit ##\n");
	FD_ZERO(&allset);
	close(http_sock);
	close(dns_sock);
	
	int i;
	for(i = 0; i < maxfd; ++i)
		close(i);
	
	sleep(1);
	
	if(rule_setup == 1){
		csprintf("\n# Disable direct rule(exit wanduck)\n");
		
		if(sw_mode == 2 )
			system("iptables-restore /tmp/fake_nat_rules");
		else
			_eval(del_command, NULL, 0, NULL);
		
		change_redirect_rules(2, 0);
	}
	
// 2007.11 James {
	char *rm_pid[] = {"rm", "-f", "/var/run/wanduck.pid", NULL};
	
	_eval(rm_pid, NULL, 0, NULL);
// 2007.11 James }
	
csprintf("\n# return(exit wanduck)\n");
	exit(0);
}
Exemple #2
0
static int start_wpa_supplicant(const char *prefix, int restart)
{
	FILE *fp;
	char tmp[100];
	const char *options = "/etc/wpa_supplicant.conf";
	char *wpa_argv[] = {"/usr/sbin/wpa_supplicant",
		"-B", "-W",
		"-D", "roboswitch",
		"-i", nvram_safe_get(strcat_r(prefix, "ifname", tmp)),
		"-c", (char *)options,
		NULL
	};
	char *cli_argv[] = {"/usr/sbin/wpa_cli",
		"-B",
		"-a", "/tmp/wpa_cli.script",
		NULL
	};
	int ret;

	if (restart)
		stop_wpa_supplicant(1);

	/* Select supplicant drivers here */
	if (router_model == MDL_RTN16 ||
	    router_model == MDL_RTN15U ||
	    router_model == MDL_WL500W)
		wpa_argv[4] = "wired";

	/* Generate options file */
	if ((fp = fopen(options, "w")) == NULL) {
		perror(options);
		return -1;
	}
	fprintf(fp,
		"ctrl_interface=/var/run/wpa_supplicant\n"
		"ap_scan=0\n"
		"fast_reauth=1\n"
		"network={\n"
		"	key_mgmt=IEEE8021X\n"
		"	eap=MD5\n"
		"	identity=\"%s\"\n"
		"	password=\"%s\"\n"
		"	eapol_flags=0\n"
		"}\n",
		nvram_safe_get(strcat_r(prefix, "auth_username", tmp)),
		nvram_safe_get(strcat_r(prefix, "auth_passwd", tmp)));
	fclose(fp);

	/* Start wpa_supplicant */
	ret = _eval(wpa_argv, NULL, 0, NULL);
	if (ret == 0)
		_eval(cli_argv, NULL, 0, NULL);

	return ret;
}
Exemple #3
0
int start_auth_eapol(const char *ifname)
{
	FILE *fp;
	int ret;
	const char *wpa_conf = "/etc/wpa_supplicant.conf";
	char *wpa_argv[] = {"/usr/sbin/wpa_supplicant",
		"-B", "-W",
		"-D", "wired",
		"-i", (char *)ifname,
		"-c", (char *)wpa_conf,
		NULL
	};
	
	char *cli_argv[] = {"/usr/sbin/wpa_cli",
		"-B",
		"-i", (char *)ifname,
		"-a", SCRIPT_WPACLI_WAN,
		NULL
	};
	
	stop_auth_eapol();
	
	/* Generate options file */
	if ((fp = fopen(wpa_conf, "w")) == NULL) {
		perror(wpa_conf);
		return -1;
	}
	fprintf(fp,
		"ctrl_interface=/var/run/wpa_supplicant\n"
		"ap_scan=0\n"
		"fast_reauth=1\n"
		"network={\n"
		"	key_mgmt=IEEE8021X\n"
		"	eap=MD5\n"
		"	identity=\"%s\"\n"
		"	password=\"%s\"\n"
		"	eapol_flags=0\n"
		"}\n",
		nvram_safe_get("wan_auth_user"),
		nvram_safe_get("wan_auth_pass"));
	
	fclose(fp);
	
	/* Start wpa_supplicant */
	ret = _eval(wpa_argv, NULL, 0, NULL);
	if (ret == 0)
	{
		logmessage("eapol-md5", "start authentication...");
		
		_eval(cli_argv, NULL, 0, NULL);
	}
	
	return ret;
}
Exemple #4
0
static int start_authcli(const char *prefix, int restart)
{
	FILE *fp;
	char tmp[100];
	const char *options = "/etc/authcliw.conf";
	char *authcli_argv[] = {
		"/usr/sbin/authcli",
		"-c", (char *)options,
	    /*	"-p", pid_file,    */
	    /*	"-c", info_name,   */
	    	"-u", "nobody",
   		NULL
	};

	if (restart)
		stop_authcli(1);

	/* Generate options file */
	if ((fp = fopen(options, "w")) == NULL) {
		perror(options);
		return -1;
	}
	fprintf(fp,
		"area=%s\r\n"
		"user=%s\r\n"
		"key=%s\r\n",
		nvram_invmatch("wan_heartbeat_x", "") ?
		    nvram_safe_get("wan_heartbeat_x") : "convex",
		nvram_safe_get(strcat_r(prefix, "auth_username", tmp)),
		nvram_safe_get(strcat_r(prefix, "auth_passwd", tmp)));
	fclose(fp);

	/* Start authcli */
	return _eval(authcli_argv, NULL, 0, NULL);
}
Exemple #5
0
static int safe_leave() {
	char *argv[] = {"rm", "-f", "/var/run/wanduckmain.pid", NULL};
	int ret;
printf("--- get signal to leave wanduckmain. ---\n");
	ret = _eval(argv, NULL, 0, NULL);
	exit(0);
}
Exemple #6
0
void start_bwdpi_check()
{
	char *bwdpi_check_argv[] = {"bwdpi_check", NULL};
	pid_t pid;

	_eval(bwdpi_check_argv, NULL, 0, &pid);
}
Exemple #7
0
void new_arpbind_stop(void)
{
  FILE *f;
  char *s = "/tmp/new_arpbind_stop.sh";
  char *argv[3];
  int pid;

  if (nvram_get_int("new_arpbind_enable")) return;

  if ((f = fopen(s, "w")) == NULL) return;

  fprintf(f,
    "#!/bin/sh\n"
    "for HOST in `awk '{if($1!=\"IP\")print $1}' /proc/net/arp`; do arp -d $HOST; done\n"
    );

  fclose(f);
  chmod(s, 0700);
  chdir("/tmp");
  
  argv[0] = s;
  argv[1] = NULL;
  argv[2] = NULL;
  if (_eval(argv, NULL, 0, &pid) != 0) {
    pid = -1;
  }
  else {
    kill(pid, 0);
  }
      
  chdir("/");
}
Exemple #8
0
int
start_syslogd(void)
{
	char *log_ipaddr, log_rot[8], host_dst[32];
	char *syslogd_argv[] = {
		"/sbin/syslogd",
		log_rot,			/* max size before rotation */
		"-b0",				/* purge on rotate */
		"-S",				/* smaller output */
		"-D",				/* drop duplicates */
		"-O", "/tmp/syslog.log",	/* syslog file */
		NULL,				/* -L */
		NULL, NULL,			/* -R host:port */
		NULL
	};

	snprintf(log_rot, sizeof(log_rot), "-s%d", LOG_ROTATE_SIZE_MAX);

	log_ipaddr = nvram_safe_get("log_ipaddr");
	if (is_valid_ipv4(log_ipaddr)) {
		int log_port = nvram_safe_get_int("log_port", 514, 1, 65535);
		snprintf(host_dst, sizeof(host_dst), "%s:%d", log_ipaddr, log_port);
		syslogd_argv[7] = "-L";		/* local & remote */
		syslogd_argv[8] = "-R";
		syslogd_argv[9] = host_dst;
	}

	setenv_tz();

	return _eval(syslogd_argv, NULL, 0, NULL);
}
Exemple #9
0
// Load sid file and setup default rule ids
bool Rule::load (const char *filename, int repeats, bool usage)
{
    SidTuneMod tune(0);
    if (!tune.load(filename))
    {
        m_status = false;
        return false;
    }

    strcpy (m_md5, tune.createMD5 ());
    if (md5_used ())
	    return false;

    for (int i = 0; i < 0x10000; i++)
        m_flags[i] = IGNORED;
    tune.placeSidTuneInC64mem (m_memory);
    { // Setup load image
        const SidTuneInfo &info = tune.getInfo ();
        _image (info.loadAddr, info.c64dataLen, repeats);
    }
    if (usage)
	    _usage (filename, m_md5);

    _eval  ();
    m_status   = true;
    strcpy (m_filename, filename);
    return true;
}
Exemple #10
0
void change_redirect_rules(int num, int force_link_down_up){
	return;
#if 0
	int i;
	char *clean_ip_conntrack[] = {"cat", "/proc/net/nf_conntrack", NULL};
	
	num = 1;	// tmp test
	//nvram_set("wan_state_changed", "1");
	track_set("101");
	// In experience, need to clean the ip_conntrack up in three times for a clean ip_conntrack.
	if (nvram_match("asus_mfg", "0"))
	for(i = 0; i < num; ++i){
csprintf("**** clean ip_conntrack %d time. ****\n", i+1);
		_eval(clean_ip_conntrack, ">/dev/null", 0, NULL);
		
		if(i != num-1)
			sleep(1);
	}
	
	//nvram_set("wan_state_changed", "0");
	track_set("100");
#endif
//	system("killall dproxy");
	system("rm -f /tmp/dproxy.cache");
//	system("dproxy -c /tmp/dproxy.conf &");
}
Exemple #11
0
// Evaluate
const Box *VSLNode::eval(ListBox *arglist) const
{
    if (VSEFlags::show_tiny_eval)
    {
	std::clog << *this;
	if (arglist)
	    std::clog << " " << *arglist;

	std::clog << "...";
    }

    const Box *box = _eval(arglist);

    if (VSEFlags::show_tiny_eval)
    {
	std::clog << *this;
	if (arglist)
	    std::cout << " " << *arglist;

	if (box == 0)
	    std::clog << " FAILS";
	else
	    std::clog << " = " << *box;

	std::clog << "\n";
    }

    return box;
}
Exemple #12
0
// 2010.09 James. {
static void rebuild_rule(int signo){
	if(rule_setup == 1){
csprintf("\n# Rebuild rules by SIGUSR2\n");
		_eval(add_command, NULL, 0, NULL);
		
		change_redirect_rules(1, 0);
	}
}
//! (static)
std::pair<bool, ObjRef> eval(Runtime & runtime, const StringData & code,const StringId & fileId) {
	try {
		ObjRef result = _eval(runtime,CodeFragment( (fileId.empty() ? Consts::FILENAME_INLINE : fileId), code));
		return std::make_pair(true,std::move(result));
	} catch (Object * error) {
		std::ostringstream os;
		os << "Error occurred while evaluating '" << code.str() << "':\n" << error->toString();
		runtime.log(Logger::LOG_ERROR,os.str());
		return std::make_pair(false, error);
	}
}
Exemple #14
0
void start_pppoe_relay(char *wan_if)
{
	if (nvram_match("fw_pt_pppoerelay", "1"))
	{
		char *pppoerelay_argv[] = {"/usr/sbin/pppoe-relay", "-C", "br0", "-S", wan_if, "-F", NULL};
		int ret;
		pid_t pid;

		killall_tk("pppoe-relay");
		ret = _eval(pppoerelay_argv, NULL, 0, &pid);
	}
}
Exemple #15
0
void run_dms(int force_rescan)
{
	int db_rescan_mode;
	unsigned char mac_bin[ETHER_ADDR_LEN] = {0};
	char mac_str[16];
	char *apps_name = "Media Server";
	char *link_path = "/mnt/minidlna";
	char *conf_path = "/etc/minidlna.conf";
	char *dest_dir = ".dms";
	char *minidlna_argv[] = {
		"/usr/bin/minidlnad",
		"-f", conf_path,
		"-s", NULL,
		NULL,	/* -U */
		NULL
	};

	if (!nvram_match("apps_dms", "1"))
		return;

	if (!is_dms_support())
		return;

	if (is_dms_run())
		return;

	unlink(link_path);
	if (!create_mp_link(dest_dir, link_path, 0))
	{
		if (!create_mp_link(dest_dir, link_path, 1))
		{
			logmessage(apps_name, "Cannot start: unable to create DB dir (/%s) on any volumes!", dest_dir);
			return;
		}
	}

	update_minidlna_conf(link_path, conf_path);

	ether_atoe(nvram_safe_get("il0macaddr"), mac_bin);
	minidlna_argv[4] = ether_etoa3(mac_bin, mac_str);

	db_rescan_mode = nvram_get_int("dlna_rescan");
	if (force_rescan || db_rescan_mode == 2)
		minidlna_argv[5] = "-R";
	else if (db_rescan_mode == 1)
		minidlna_argv[5] = "-U";

	_eval(minidlna_argv, NULL, 0, NULL);

	if (is_dms_run())
		logmessage(apps_name, "daemon is started");
}
Exemple #16
0
int
start_dhcpd(void)
{
	if (nvram_match("router_disable", "1") || !nvram_match("lan_proto", "dhcp"))
		return 0;

	FILE *fp;
	char name[100];
	int dhcp_lease_time;


	/* Touch leases file */
	if (!(fp = fopen("/tmp/udhcpd.leases", "a"))) {
		perror("/tmp/udhcpd.leases");
		return errno;
	}
	fclose(fp);

	/* Write configuration file based on current information */
	if (!(fp = fopen("/tmp/udhcpd.conf", "w"))) {
		perror("/tmp/udhcpd.conf");
		return errno;
	}
	fprintf(fp, "pidfile /var/run/udhcpd.pid\n");
	fprintf(fp, "start %s\n", nvram_safe_get("dhcp_start"));
	fprintf(fp, "end %s\n", nvram_safe_get("dhcp_end"));
	fprintf(fp, "interface %s\n", nvram_safe_get("lan_ifname"));
	fprintf(fp, "remaining yes\n");
	fprintf(fp, "lease_file /tmp/udhcpd.leases\n");
	fprintf(fp, "option subnet %s\n", nvram_safe_get("lan_netmask"));
	fprintf(fp, "option router %s\n", nvram_safe_get("lan_ipaddr"));
	fprintf(fp, "option dns %s\n", nvram_safe_get("lan_ipaddr"));
	dhcp_lease_time = atoi(nvram_safe_get(dhcp_lease));
	if (dhcp_lease_time <= 3)
		dhcp_lease_time = 86400;
	fprintf(fp, "option lease %d\n", dhcp_lease_time);
	snprintf(name, sizeof(name), "%s_wins", nvram_safe_get("dhcp_wins"));
	if (!nvram_match(name, ""))
		fprintf(fp, "option wins %s\n", nvram_safe_get(name));
	snprintf(name, sizeof(name), "%s_domain", nvram_safe_get("dhcp_domain"));
	if (!nvram_match(name, ""))
		fprintf(fp, "option domain %s\n", nvram_safe_get(name));
	fclose(fp);

	char *dhcpd_argv[] = {"udhcpd", "/tmp/udhcpd.conf", NULL};
	int upid;
	_eval(dhcpd_argv, NULL, 0, &upid);

	return 0;
}
Exemple #17
0
void start_sshd(void)
{
	int dirty = 0;
	FILE *fp;

	mkdir("/etc/dropbear", 0700);
	mkdir("/root/.ssh", 0700);

	f_write_string("/root/.ssh/authorized_keys", nvram_safe_get("sshd_authkeys"), 0, 0700);

	dirty |= check_host_key("rsa", "sshd_hostkey", "/etc/dropbear/dropbear_rsa_host_key");
	dirty |= check_host_key("dss", "sshd_dsskey",  "/etc/dropbear/dropbear_dss_host_key");
	if (dirty)
		nvram_commit_x();

/*
	xstart("dropbear", "-a", "-p", nvram_safe_get("sshd_port"), nvram_get_int("sshd_pass") ? "" : "-s");
*/

	char *argv[9];
	int argc;
	char *p;

	argv[0] = "dropbear";
	argv[1] = "-p";
	argv[2] = nvram_safe_get("sshd_port");
	argc = 3;

	if (!nvram_get_int("sshd_pass")) argv[argc++] = "-s";

	if (nvram_get_int("sshd_forwarding")) argv[argc++] = "-a";

	if (((p = nvram_get("sshd_rwb")) != NULL) && (*p)) {
		argv[argc++] = "-W";
		argv[argc++] = p;
	}

	argv[argc] = NULL;
	_eval(argv, NULL, 0, NULL);

	if (get_productid())
	{
		if ((fp=fopen("/proc/sys/kernel/hostname", "w+")))
		{
			fputs(get_productid(), fp);
			fclose(fp);
		}
	}
}
Exemple #18
0
        //
        // TODO add check for dirty expression string
        //
    double Expr::eval() {
        string tempstr = removeUnwanted(str);

        try {
            double fval = 0.0;
            fval   = _eval(tempstr);
            value  = fval;
        }
        catch (mu::Parser::exception_type &e)
        {
            std::cout << e.GetMsg() << std::endl;
        }

        return value;
    }
static void
_changed(Evas_Object *obj)
{
   Widget_Data *wd = elm_widget_data_get(obj);
   if (!wd) return;
   if (wd->eval)
     {
        _eval(obj);
        wd->eval = EINA_FALSE;
     }
   if (wd->szeval)
     {
        _sizing_eval(obj);
        wd->szeval = EINA_FALSE;
     }
}
Exemple #20
0
void start_sshd(void)
{
	int dirty = 0;
	char buf[2048];

	mkdir("/etc/dropbear", 0700);
	mkdir("/root/.ssh", 0700);

	f_write_string("/root/.ssh/authorized_keys", get_parsed_crt("sshd_authkeys", buf), 0, 0700);

	dirty |= check_host_key("rsa", "sshd_hostkey", "/etc/dropbear/dropbear_rsa_host_key");
	dirty |= check_host_key("dss", "sshd_dsskey",  "/etc/dropbear/dropbear_dss_host_key");
	if (dirty)
		nvram_commit_x();

/*
	xstart("dropbear", "-a", "-p", nvram_safe_get("sshd_port"), nvram_get_int("sshd_pass") ? "" : "-s");
*/

	char *argv[9];
	int argc;
	char *p;

	argv[0] = "dropbear";
	argv[1] = "-p";
	argv[2] = nvram_safe_get("sshd_port");
	argc = 3;

	if (!nvram_get_int("sshd_pass")) argv[argc++] = "-s";

	if (nvram_get_int("sshd_forwarding")) {
		argv[argc++] = "-a";
	} else {
		argv[argc++] = "-j";
		argv[argc++] = "-k";
	}

	if (((p = nvram_get("sshd_rwb")) != NULL) && (*p)) {
		argv[argc++] = "-W";
		argv[argc++] = p;
	}

	argv[argc] = NULL;
	_eval(argv, NULL, 0, NULL);

}
Exemple #21
0
int _xstart(const char *cmd, ...)
{
	va_list ap;
	char *argv[16];
	int argc;
	int pid;

	argv[0] = (char *)cmd;
	argc = 1;
	va_start(ap, cmd);
	while ((argv[argc++] = va_arg(ap, char *)) != NULL) {
		//
	}
	va_end(ap);

	return _eval(argv, NULL, 0, &pid);
}
Exemple #22
0
static int start_lanauth(const char *prefix, int restart)
{
	char tmp[100];
	char *lanauth_argv[] = {
		"/usr/sbin/lanauth",
	    /*	"-v", protocol,	   */
	    /*	"-l", acces level, */
		"-p", nvram_safe_get(strcat_r(prefix, "auth_passwd", tmp)),
		nvram_invmatch("wan_heartbeat_x", "") ? "-s" : NULL,
		nvram_safe_get("wan_heartbeat_x"),
   		NULL
	};

	if (restart)
		stop_lanauth(1);

	/* Start lanauth */
	return _eval(lanauth_argv, NULL, 0, NULL);
}
Exemple #23
0
void sta_start_being_ap()
{
	PROFILES profile;
	pid_t pid;
	char *nas_cmd[]={"nas", "/tmp/nas.conf", NULL};

	//printf("set as a AP");
	/* Become an AP with SSID = Shared Name */
	memset(&profile, 0, sizeof(profile));
	profile.mode = STATION_MODE_AP;
	strcpy(profile.ssid, nvram_safe_get("wl0_ssid")); 

	//printf("ssid: %s\n", profile->ssid);
     	stainfo_g.mode = profile.mode;
	stainfo_g.chan = profile.chan;
	strncpy(stainfo_g.ssid, profile.ssid, 32);
	stainfo_g.rate = profile.rate;
	stainfo_g.wep = profile.wep;
	stainfo_g.wepkeylen = profile.wepkeylen;
	stainfo_g.wepkeyactive = profile.wepkeyactive;
	stainfo_g.sharedkeyauth = profile.sharedkeyauth;
	stainfo_g.brgmacclone = profile.brgmacclone;
	stainfo_g.preamble = profile.preamble;	

	if (nvram_match("wl_wdsmode_x", "1")) nvram_set("wl0_mode", "wds");
	else nvram_set("wl0_mode", "ap");
	//eval("wlconf", "eth2", "up");
	eval("wlconfig", "eth2");
	eval("killall", "nas");
	_eval(nas_cmd, NULL, 0, &pid);

	stop_dhcpd();

	if (!is_dhcpd_exist()) 
	{
		printf("start your own dhcp server\n");
		start_dhcpd();
	}
	sta_state = STA_STATE_BEING_AP;
	sta_status_report(sta_state, 0);
}
Exemple #24
0
void
do_export(char *path, webs_t stream, ...)
{
    FILE *ifp, *ofp;
    int c;
    char cfg_file[] = "/tmp/export.cfg";
    char encoded_file[] = "/tmp/encoded.cfg";
    char *write_argv[4];

    write_argv[0] = "/usr/sbin/nvram";
    write_argv[1] = "export";
    write_argv[2] = cfg_file;
    write_argv[3] = NULL;

    _eval(write_argv, NULL, 10, NULL) ;

    if (!(ifp = fopen(cfg_file, "r"))) {
        return;
    }
    if (!(ofp = fopen(encoded_file, "w"))) {
        fclose(ifp);
        unlink(cfg_file);
        return;
    }

    /* Encode. */
    /* Note: c must be an integer to compare with EOF. */
    while ((c = fgetc(ifp)) != EOF) {
        encode((char *)&c, 1);
        fputc(c, ofp);
    }
    fclose(ifp);
    fclose(ofp);

    /* Export the file itself. */
    do_file(encoded_file, stream, NULL);

    unlink(cfg_file);
    unlink(encoded_file);
}
Exemple #25
0
int
start_openvpn_server(void)
{
	int i_mode_tun;
	char vpns_cfg[64], vpns_scr[64];
	char *server_conf = "server.conf";
	char *openvpn_argv[] = {
		OPENVPN_EXE,
		"--daemon", "openvpn-srv",
		"--cd", SERVER_ROOT_DIR,
		"--config", server_conf,
		NULL
	};

	sprintf(vpns_cfg, "%s/%s", SERVER_ROOT_DIR, server_conf);
	sprintf(vpns_scr, "%s/%s", SERVER_ROOT_DIR, SCRIPT_OVPN_SERVER);

	doSystem("mkdir -p -m %s %s", "755", SERVER_ROOT_DIR);
	doSystem("mkdir -p -m %s %s", "777", COMMON_TEMP_DIR);

	i_mode_tun = (nvram_get_int("vpns_ov_mode") == 1) ? 1 : 0;

	/* create conf file */
	if (openvpn_create_server_conf(vpns_cfg, i_mode_tun))
		return 1;

	/* create tun or tap device (and add tap to bridge) */
	if (i_mode_tun)
		openvpn_tunif_start(IFNAME_SERVER_TUN);
	else
		openvpn_tapif_start(IFNAME_SERVER_TAP, 1);

	/* create script symlink */
	symlink("/sbin/rc", vpns_scr);

	logmessage(LOGNAME, "starting %s...", SERVER_LOG_NAME);

	return _eval(openvpn_argv, NULL, 0, NULL);
}
Exemple #26
0
int
start_openvpn_client(void)
{
	int i_mode_tun;
	char vpnc_cfg[64], vpnc_scr[64];
	char *client_conf = "client.conf";
	char *openvpn_argv[] = {
		OPENVPN_EXE,
		"--daemon", "openvpn-cli",
		"--cd", CLIENT_ROOT_DIR,
		"--config", client_conf,
		NULL
	};

	sprintf(vpnc_cfg, "%s/%s", CLIENT_ROOT_DIR, client_conf);
	sprintf(vpnc_scr, "%s/%s", CLIENT_ROOT_DIR, SCRIPT_OVPN_CLIENT);

	doSystem("mkdir -p -m %s %s", "755", CLIENT_ROOT_DIR);

	i_mode_tun = (nvram_get_int("vpnc_ov_mode") == 1) ? 1 : 0;

	/* create conf file */
	if (openvpn_create_client_conf(vpnc_cfg, i_mode_tun))
		return 1;

	/* create tun or tap device */
	if (i_mode_tun)
		openvpn_tunif_start(IFNAME_CLIENT_TUN);
	else
		openvpn_tapif_start(IFNAME_CLIENT_TAP, (nvram_get_int("vpnc_ov_cnat") == 1) ? 0 : 1);

	/* create script symlink */
	symlink("/sbin/rc", vpnc_scr);

	logmessage(LOGNAME, "starting %s...", CLIENT_LOG_NAME);

	return _eval(openvpn_argv, NULL, 0, NULL);
}
Exemple #27
0
void run_nvscript(const char *nv, const char *arg1, int wtime)
{
	FILE *f;
	char *script;
	char s[256];
	char *argv[3];
	int pid;

	script = nvram_get(nv);
	if ((script) && (*script != 0)) {
		sprintf(s, "/tmp/%s.sh", nv);
		if ((f = fopen(s, "w")) != NULL) {
			fputs("#!/bin/sh\n", f);
			fputs(script, f);
			fputs("\n", f);
			fclose(f);
			chmod(s, 0700);
			
			chdir("/tmp");

			argv[0] = s;
			argv[1] = (char *)arg1;
			argv[2] = NULL;
			if (_eval(argv, NULL, 0, &pid) != 0) {
				pid = -1;
			}
			else {
				while (wtime-- > 0) {
					if (kill(pid, 0) != 0) break;
					sleep(1);
				}
			}
			
			chdir("/");
		}
	}
}
Exemple #28
0
void start_dsl()
{
	// todo: is it necessary? 
	init_dsl_before_start_wan();
	char *argv_tp_init[] = {"tp_init", NULL};	
	int pid;

	// if setting cfg file is from annex a, annex b will has invalid values
	if(nvram_match("productid", "DSL-N55U-B"))
	{
		if (nvram_get_int("dslx_annex") != 0)
		{
			nvram_set_int("dslx_annex", 0); //Paul add 2012/8/22, for Annex B model should always be 0
			nvram_set_int("dslx_config_num", 0);
		}
	}
	
	eval("mkdir", "/tmp/adsl");

	/* Paul comment 2012/7/25, the "never overcommit" policy would cause Ralink WiFi driver kernel panic when configure DUT through external registrar. *
	 * So let this value be the default which is 0, the kernel will estimate the amount of free memory left when userspace requests more memory. */
	//system("echo 2 > /proc/sys/vm/overcommit_memory");
	

#ifdef RTCONFIG_DUALWAN
	if (get_dualwan_secondary()==WANS_DUALWAN_IF_NONE)
	{
		if (get_dualwan_primary()!=WANS_DUALWAN_IF_DSL)
		{
			// it does not need to start dsl driver when using other modes
			// but it still need to run tp_init to have firmware version info
			printf("get modem info\n");
			eval("tp_init", "eth_wan_mode_only");			
			return;
		}
	}
#endif

	int config_num = nvram_get_int("dslx_config_num");
	_eval(argv_tp_init, NULL, 0, &pid);
	// IPTV
	if (nvram_match("x_Setting", "1") && config_num > 1)
	{
		int x;
		char wan_if[9];
		char wan_num[2];		
		char buf_ip[32];
		eval("brctl", "addbr", "br1");
		for(x=2; x<=config_num; x++) {
			sprintf(wan_if, "eth2.1.%d", x);
			sprintf(wan_num, "%d", x);
			eval("vconfig", "add", "eth2.1", wan_num);
			eval("ifconfig", wan_if, "up");				
			eval("brctl", "addif", "br1", wan_if);
		}	
		eval("brctl", "addif", "br1", "eth2.3");
		// it needs assign a IPv4 address to enable packet forwarding
		pick_a_random_ipv4(buf_ip);
		eval("ifconfig", "br1", "up");
		eval("ifconfig", "br1", buf_ip);		
	}

	// auto detection
	if (nvram_match("x_Setting", "0") && config_num == 0)
	{
		int x;
		char wan_if[9];
		char wan_num[2];		
		char country_value[8];
		char cmd_buf[64];
		char *argv_auto_det[] = {"auto_det", country_value, NULL};		
		int pid;		
		for(x=2; x<=8; x++) {
			sprintf(wan_if, "eth2.1.%d", x);
			sprintf(wan_num, "%d", x);
			eval("vconfig", "add", "eth2.1", wan_num);
			eval("ifconfig", wan_if, "up");				
		}
		//
		nvram_set("dsltmp_autodet_state", "Detecting");
		// call auto detection with country code
		get_country_code_from_rc(country_value);
		_eval(argv_auto_det, NULL, 0, &pid);
	}
}
Exemple #29
0
// read nvram into files
void new_arpbind_start(void)
{
	FILE *f;
	char *buf;
	char *g;
	char *p;
	char *ipaddr;//ip address
  char *macaddr;//mac address
  char *s = "/tmp/new_arpbind_start.sh";
  char *argv[3];
  int pid;
  int i;
  char lan[24];
  const char *router_ip;
  int host[256];

  //arpbind is enable
  if (!nvram_get_int("new_arpbind_enable")) return;

  //read arpbind_list from nvram
  g = buf = strdup(nvram_safe_get("new_arpbind_list"));

  //read arpbind_list into file 
  if ((f = fopen(s, "w")) == NULL) return;
  fprintf(f,
  	"#!/bin/sh\n"
  	"for HOST in `awk '{if($1!=\"IP\")print $1}' /proc/net/arp`; do arp -d $HOST; done\n"
  	);
  memset(host, 0, sizeof(host));

  //get network ip prefix
  router_ip = nvram_safe_get("lan_ipaddr");
  strlcpy(lan, router_ip, sizeof(lan));
  if ((p = strrchr(lan, '.')) != NULL) {
    host[atoi(p+1)] = 1;
    *p = '\0';
  }

  while (g) {
    /*
    macaddr<ipaddr
    */
    if ((p = strsep(&g, ">")) == NULL) break;
    i = vstrsep(p, "<", &macaddr, &ipaddr);
    fprintf(f, "arp -s %s %s\n", ipaddr, macaddr);
    if ((p = strrchr(ipaddr, '.')) != NULL) {
      *p = '\0';
      if (!strcmp(ipaddr, lan)) host[atoi(p+1)] = 1;
    }
  }

  if (nvram_get_int("new_arpbind_only")) {
      for (i = 1; i < 255; i++) {
        if (!host[i]) {
          fprintf(f, "arp -s %s.%d 00:00:00:00:00:00\n", lan, i);
        }
      }
  }

  free(buf);

  fclose(f);
  chmod(s, 0700);
  chdir("/tmp");

  argv[0] = s;
  argv[1] = NULL;
  argv[2] = NULL;
  if (_eval(argv, NULL, 0, &pid) != 0) {
    pid = -1;
  }
  else {
    kill(pid, 0);
  }
      
  chdir("/");
}
Exemple #30
0
char *processPacket(int sockfd, char *pdubuf)
{
    IBOX_COMM_PKT_HDR	*phdr;
    IBOX_COMM_PKT_HDR_EX *phdr_ex;
    IBOX_COMM_PKT_RES_EX *phdr_res;
    PKT_GET_INFO *ginfo;
    PKT_GET_INFO_STA *stainfo;
    PKT_GET_INFO_EX1 *cmd;					
    PKT_GET_INFO_EX1 *res;
    PKT_GET_INFO_SITES *res_sites;
    PKT_GET_INFO_PROFILE *cmd_profiles, *res_profiles;

    int i;

    phdr = (IBOX_COMM_PKT_HDR *)pdubuf;  
    phdr_res = (IBOX_COMM_PKT_RES_EX *)pdubuf_res;
    
    //printf("Get: %x %x %x\n", phdr->ServiceID, phdr->PacketType, phdr->OpCode);
    
    if (phdr->ServiceID==NET_SERVICE_ID_IBOX_INFO &&
        phdr->PacketType==NET_PACKET_TYPE_CMD)
    {	    
	if (phdr->OpCode!=NET_CMD_ID_GETINFO &&
	    phdr_res->OpCode==phdr->OpCode &&
	    phdr_res->Info==phdr->Info)
	{	
		// if transaction id is equal to the transaction id of the last response message, just re-send message again;
		return pdubuf_res;
	}	
	
	phdr_res->ServiceID=NET_SERVICE_ID_IBOX_INFO;
	phdr_res->PacketType=NET_PACKET_TYPE_RES;
	phdr_res->OpCode=phdr->OpCode;

	if (phdr->OpCode!=NET_CMD_ID_GETINFO)
	{
		phdr_ex = (IBOX_COMM_PKT_HDR_EX *)pdubuf;	
		
		// Check Mac Address
		if (memcpy(phdr_ex->MacAddress, mac, 6)==0)
		{
			//printf("Mac Error %2x%2x%2x%2x%2x%2x\n",
			//	(unsigned char)phdr_ex->MacAddress[0],
			//	(unsigned char)phdr_ex->MacAddress[1],
			//	(unsigned char)phdr_ex->MacAddress[2],
			//	(unsigned char)phdr_ex->MacAddress[3],
			//	(unsigned char)phdr_ex->MacAddress[4],
			//	(unsigned char)phdr_ex->MacAddress[5]
			//	);
			return NULL;
		}
		
		// Check Password
		//if (strcmp(phdr_ex->Password, "admin")!=0)
		//{
		//	phdr_res->OpCode = phdr->OpCode | NET_RES_ERR_PASSWORD;
		//	printf("Password Error %s\n", phdr_ex->Password);	
		//	return NULL;
		//}
		phdr_res->Info = phdr_ex->Info;
		memcpy(phdr_res->MacAddress, phdr_ex->MacAddress, 6);
	}

	switch(phdr->OpCode)
	{
		case NET_CMD_ID_GETINFO:		 		  	
		     ginfo=(PKT_GET_INFO *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES));
		     memset(ginfo, 0, sizeof(ginfo));
#ifdef PRNINFO
    		     readPrnID(ginfo->PrinterInfo);
#else
		     memset(ginfo->PrinterInfo, 0, sizeof(ginfo->PrinterInfo));
#endif	
   		     strcpy(ginfo->SSID, ssid_g);
		     strcpy(ginfo->NetMask, netmask_g);
		     strcpy(ginfo->ProductID, productid_g);
		     strcpy(ginfo->FirmwareVersion, firmver_g);
		     memcpy(ginfo->MacAddress, mac, 6);
#ifdef WCLIENT
		     ginfo->OperationMode = OPERATION_MODE_WB;
		     ginfo->Regulation = 0xff;
#endif

		     sendInfo(sockfd, pdubuf_res);
		     return pdubuf_res;		     	
#ifdef WCLIENT	
		case NET_CMD_ID_GETINFO_EX:
		     cmd = (PKT_GET_INFO_EX1 *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX));	
		     res = (PKT_GET_INFO_EX1 *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX));
		     stainfo = (PKT_GET_INFO_STA *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX)+sizeof(PKT_GET_INFO_EX1));
				
		     if (cmd->FieldID!=FIELD_GENERAL_CURRENT_STA) return NULL;
		     res->FieldCount=1;
		     res->FieldID=FIELD_GENERAL_CURRENT_STA;

		     memcpy(stainfo, &stainfo_g, sizeof(stainfo_g));
		     stainfo->connectionStatus = sta_status();
		     //printf("GetSTA: %s\n", stainfo->ssid);
			
		     sendInfo(sockfd, pdubuf_res);
		     return pdubuf_res;
		case NET_CMD_ID_SETINFO:				
		     cmd=(PKT_GET_INFO_EX1 *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX));			
		     stainfo = (PKT_GET_INFO_STA *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX)+sizeof(PKT_GET_INFO_EX1));
		     //printf("SSID: %s\n", stainfo->ssid);
		     sendInfo(sockfd, pdubuf_res);
		     return pdubuf_res;
		case NET_CMD_ID_GETINFO_SITES:				
		     cmd=(PKT_GET_INFO_EX1 *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX));	
		     res_sites = (PKT_GET_INFO_SITES *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX));
		     sta_start_scanning();
		     //sta_count_reset();
		     sleep(2);	
		     wl_scan_results();

		     printf("Get INFO %d\n", sites_g_count);

		     res_sites->Count = sites_g_count;
	
		     for(i=0;i<res_sites->Count&&i<MAX_SITE_NUMBER;i++)
		     {
			 memcpy(&res_sites->Sites[i%8], &sites_g[i], sizeof(SITES));				 
			 if (i%8==0&&i!=0)
			 {
			 	res_sites->Index = i/8;
		     		sendInfo(sockfd, pdubuf_res);
			 } 	
		     }
		     if (i%8!=0)
		     {
			 res_sites->Index = i/8;
		     	 sendInfo(sockfd, pdubuf_res);
			 printf("Send:%d %d\n", res_sites->Index, res_sites->Count);
		     }	
		     return pdubuf_res;
		case NET_CMD_ID_GETINFO_PROF:		     
		     cmd_profiles = (PKT_GET_INFO_PROFILE *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX));	
		     res_profiles = (PKT_GET_INFO_PROFILE *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX));
		     res_profiles->StartIndex = cmd_profiles->StartIndex;
		     res_profiles->Count = cmd_profiles->Count;
		     for(i=0;i<cmd_profiles->Count;i++)
		     {
			 memcpy(&res_profiles->p.Profiles[i], &profiles_g[cmd_profiles->StartIndex+i], sizeof(PROFILES));
		     }
		     sendInfo(sockfd, pdubuf_res);
		     return pdubuf_res;
		case NET_CMD_ID_SETINFO_PROF:
		     cmd_profiles =(PKT_GET_INFO_PROFILE *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX));	
		     res_profiles = (PKT_GET_INFO_SITES *)(pdubuf_res+sizeof(IBOX_COMM_PKT_RES_EX));

		     if (cmd_profiles->Count==0)
		     {
			 if (cmd_profiles->StartIndex == 0xff) // Save to file
			 {
			 }
			 else 
			 {
				 scan_g_type = cmd_profiles->p.ProfileControl.ButtonType;
				 scan_g_mode = cmd_profiles->p.ProfileControl.ButtonMode;
				 stainfo_g.profileCount = cmd_profiles->p.ProfileControl.ProfileCount;

				 sta_start_connecting_one(&profiles_g[cmd_profiles->StartIndex]);
			         //printf("set: %d %d\n", cmd_profiles->StartIndex, stainfo_g.profileCount);
				
				 profiles_g_count = stainfo_g.profileCount;
				 wl_write_profile();				 
			 }
		     }		
		     else
		     {	 	
		     	 for(i=0;i<cmd_profiles->Count;i++)
		     	 {
				memcpy(&profiles_g[cmd_profiles->StartIndex + i], &cmd_profiles->p.Profiles[i], sizeof(PROFILES));
		     	 }
		     }	 	
		     sendInfo(sockfd, pdubuf_res);
		     return pdubuf_res;
#endif
		case NET_CMD_ID_MANU_CMD:
		{
		     #define MAXSYSCMD 64
		     #define MAXPARA 6
		     #define SIZEOFHDR 46
		     #define SIZEOFRES 14
		     char cmdstr[MAXSYSCMD];
		     char *cmdargv[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL};
		     char *cmdptr;
		     int cmdcnt;		 
		     PKT_SYSCMD *syscmd;
		     PKT_SYSCMD_RES *syscmd_res;
		     FILE *fp;

		     syscmd = (PKT_SYSCMD *)(pdubuf+SIZEOFHDR);
		     syscmd_res = (PKT_SYSCMD_RES *)(pdubuf_res+SIZEOFRES);

		     if (syscmd->len>=MAXSYSCMD) syscmd->len=MAXSYSCMD;
		     syscmd->cmd[syscmd->len]=0;
		     syscmd->len=strlen(syscmd->cmd);

		     //printf("system cmd: %d %d %d %d %s\n", sizeof(IBOX_COMM_PKT_RES_EX), sizeof(unsigned short), sizeof(IBOX_COMM_PKT_HDR_EX) + syscmd->len, syscmd->cmd);
		      strcpy(cmdstr, syscmd->cmd);	
		      cmdptr = cmdstr;
		      while (strsep(&cmdptr, " "));

		      cmdcnt=0;
		      /* Set token values */
		      for (cmdptr = cmdstr; cmdptr < &cmdstr[syscmd->len] && *cmdptr && cmdcnt<MAXPARA; cmdptr += strlen(cmdptr) + 1) 
		      {
		           cmdargv[cmdcnt++] = cmdptr;
		      }	 	

		      if (cmdcnt==0) syscmd_res->len=0;
		      else
		      {				
		      	_eval(cmdargv, ">/tmp/syscmd.out", 0, NULL);

		      	fp = fopen("/tmp/syscmd.out", "r");

		      	if (fp!=NULL)
		      	{
			 	syscmd_res->len = fread(syscmd_res->res, 1, sizeof(syscmd_res->res), fp);
			 	fclose(fp);
		      	}
		      	else syscmd_res->len=0;
		      } 	

		      //printf("res : %d %s\n", syscmd_res->len, syscmd_res->res);
		      sendInfo(sockfd, pdubuf_res);
	 	      return pdubuf_res;
		}
		default:
			return NULL;	
	}
    }
    return NULL;
}