Esempio n. 1
0
/* get IP address and create socket */
void get_ip(GtkWidget *button,gpointer ip_text)
{
gchar *serv_ip;
int res;
serv_ip=(gchar *)gtk_entry_get_text(GTK_ENTRY((GtkWidget *)ip_text));
res=build_socket(serv_ip);

if(res==1)
show_err("IP Address is  Invalid...\n");
else if(res==-1)
show_err("Connect Failure... \n");/*插入文本到缓冲区*/
else{
show_err("Connect Successful... \n");
issucceed=0;
}
}
Esempio n. 2
0
void accept_client(int fin, int fout)
{
    char addr_str[20];
    int fd, clientaddrlen, res;
    struct sockaddr_in clientaddr;
    
    fd = build_socket();
    
    clientaddrlen = sizeof(struct sockaddr_in);
    while (1) {
        res = accept(fd, (struct sockaddr*)&clientaddr, &clientaddrlen);
        if (res == -1) {
            perror("accept error");
        }
          
        write(fout, &clientaddr.sin_addr.s_addr, sizeof(clientaddr.sin_addr.s_addr));
    }   
}
Esempio n. 3
0
int wanduck_main(int argc, char **argv){
	char *http_servport, *dns_servport;
	socklen_t clilen;
	struct sockaddr_in cliaddr;
	struct timeval  tval;
	int nready, maxi, sockfd, conn_state;
#ifdef RTCONFIG_USB_MODEM
	int modem_ready_count = MODEM_IDLE;
#endif
	/*int pid;
	
	// daemonize
	if((pid = fork()) != 0)
		exit(0);
	
	umask(0);
	
	setsid();
	
	chdir("/");
	
	close(STDIN_FILENO);
	//close(STDOUT_FILENO);
	//close(STDERR_FILENO);
	
	struct stat fstatus;
	int fd;
	int max_tbl_sz = getdtablesize();
	for(fd = (STDERR_FILENO+1); fd <= max_tbl_sz; ++fd){
		if(fstat(fd, &fstatus) == 0){
			fprintf(stdout, "The inherited fd(%d) is closed.\n", fd);
			close(fd);
		}
	}//*/
	
	signal(SIGHUP, SIG_IGN);
	signal(SIGTERM, safe_leave);
	signal(SIGUSR1, get_related_nvram2); // 2010.09 James.
	signal(SIGUSR2, rebuild_rule); // 2010.09 James.
	
	if(argc < 3){
		http_servport = DFL_HTTP_SERV_PORT;
		dns_servport = DFL_DNS_SERV_PORT;
	}
	else{
// 2007.10 James {
		if(atoi(argv[1]) <= 0)
			http_servport = DFL_HTTP_SERV_PORT;
		else
			http_servport = argv[1];
		
		if(atoi(argv[2]) <= 0)
			dns_servport = DFL_DNS_SERV_PORT;
		else
			dns_servport = argv[2];
// 2007.10 James }
	}
	
// 2007.10 James {
	if(build_socket(http_servport, dns_servport, &http_sock, &dns_sock) < 0){
		csprintf("\n*** Fail to build socket! ***\n");
		exit(0);
	}
	
	FILE *fp = fopen("/var/run/wanduck.pid", "w");
	
	if(fp != NULL){
		fprintf(fp, "%d", getpid());
		fclose(fp);
	}
// 2007.10 James }
	
	maxfd = (http_sock > dns_sock)?http_sock:dns_sock;
	maxi = -1;
	
	FD_ZERO(&allset);
	FD_SET(http_sock, &allset);
	FD_SET(dns_sock, &allset);
	
	for(fd_i = 0; fd_i < MAX_USER; ++fd_i){
		client[fd_i].sfd = -1;
		client[fd_i].type = 0;
	}
	
	rule_setup = 0;
	disconn_case = 0;
	clilen = sizeof(cliaddr);
	
	sleep(3);
	
// 2008.03 James. {
	if(nvram_match("x_Setting", "1"))
		isFirstUse = FALSE;
	else
		isFirstUse = TRUE;
	
	get_related_nvram();
	
	if(!strcmp(nvram_safe_get("wan_ready"), "1")){
		wan_ready = 1;

		get_related_nvram2();
	}
// 2008.03 James. }
	
	err_state = if_wan_phyconnected();
	
	record_conn_status();	// 2008.02 James.
	
	if(err_state == DISCONN){
		if(nat_enable == 1 || (fer < HAD_SET)){
csprintf("\n# Enable direct rule\n");
			rule_setup = 1;
			
			_eval(add_command, NULL, 0, NULL);
			
			change_redirect_rules(2, 0);
		}
	}
	else if(err_state == CONNED && isFirstUse){
		if((nat_enable == 1) || (fer < HAD_SET)){
csprintf("\n#CONNED : Enable direct rule\n");
			rule_setup = 1;
			
			_eval(add_command, NULL, 0, NULL);
			
			change_redirect_rules(2, 0);
		}
	}
	
	for(;;){
		rset = allset;
		tval.tv_sec = SCAN_INTERVAL;
		tval.tv_usec = 0;

// 2008.03 James. {
		if(nvram_match("x_Setting", "1"))
			isFirstUse = FALSE;
		else
			isFirstUse = TRUE;

		if(wan_ready == 0 && !strcmp(nvram_safe_get("wan_ready"), "1")){
			wan_ready = 1;

			get_related_nvram2();

			if(isFirstUse == TRUE)	// 0608 add
			{
csprintf("\n# Rebuild rules\n");
				_eval(add_command, NULL, 0, NULL);
				change_redirect_rules(1, 0);
			}
		}
// 2008.03 James. }

		if((nat_enable == 1) || (fer < HAD_SET)){
			conn_state = if_wan_phyconnected();
			
			if(conn_state == CONNED){
				if(err_state == DISCONN)
					err_state = D2C;
				else
					err_state = CONNED;
					
#ifdef RTCONFIG_USB_MODEM
				modem_ready_count = MODEM_IDLE;
#endif
			}
			else if(conn_state == DISCONN){
				if(err_state == CONNED)
					err_state = C2D;
				else
					err_state = DISCONN;

#ifdef RTCONFIG_USB_MODEM
			if(disconn_case == CASE_THESAMESUBNET)
				modem_ready_count = MODEM_IDLE;
			else if(!strcmp(nvram_safe_get("manually_disconnect_wan"), "1"))
				modem_ready_count = MODEM_IDLE;
			else if(!link_modem)
				modem_ready_count = MODEM_IDLE;
			else if(modem_ready_count == MODEM_IDLE)
				modem_ready_count = MODEM_READY;
#endif
			}

#ifdef RTCONFIG_USB_MODEM
		if(modem_ready_count != MODEM_IDLE){
			if(modem_ready_count < MAX_WAIT_COUNT){
				++modem_ready_count;
csprintf("# wanduck: wait time for switching: %d/%d.\n", modem_ready_count*SCAN_INTERVAL, MAX_WAIT_TIME_OF_MODEM);
			}
			else{
				modem_ready_count = MODEM_READY;
			}
		}
#endif

			record_conn_status();	// 2008.02 James.
			
			if(err_state == C2D || (err_state == CONNED && isFirstUse)){
				if(rule_setup == 0){	// 2007.10 James
csprintf("\n# Enable direct rule(C2D)\n");
					rule_setup = 1;
					
					_eval(add_command, NULL, 0, NULL);
					
					change_redirect_rules(2, 1);
					update_wan(0);

#ifdef RTCONFIG_USB_MODEM
					if(err_state == C2D && !link_modem && modem_running){ // plug-off the Modem.
csprintf("\n# wanduck(C2D): Try to Switch the WAN line.(link_modem=%d).\n", link_modem);
						switch_usb_modem(link_modem);
					}
#endif
				}
			}
			else if(err_state == D2C || err_state == CONNED){
				if(rule_setup == 1 && !isFirstUse){
csprintf("\n#w Disable direct rule(D2C)\n");
					rule_setup = 0;
					
                			if(sw_mode == 2 )
                        			system("iptables-restore /tmp/fake_nat_rules");
                			else
					{
						_eval(del_command, NULL, 0, NULL);
					}
					change_redirect_rules(2, 0);
					update_wan(1);
				}
			}
#ifdef RTCONFIG_USB_MODEM
			// After boot, wait the WAN port to connect.
			else if(err_state == DISCONN){
				if((link_modem && modem_ready_count >= MAX_WAIT_COUNT)
						|| (!link_modem && modem_running)
						)
				{
if(modem_running)
	csprintf("# Switching the connect to WAN port...\n");
else
	csprintf("# Switching the connect to USB Modem...\n");
					switch_usb_modem(!modem_running);
				}
			}
#endif
		}
		else{	// ap mode
			nat_enable = 0;
			
			if(rule_setup == 1){
csprintf("\n#AP Disable direct rule(D2C)\n");
				rule_setup = 0;
				
                		if(sw_mode == 2 )
                        		system("iptables-restore /tmp/fake_nat_rules");
                		else
				{
					_eval(del_command, NULL, 0, NULL);
				}

				change_redirect_rules(2, 0);
				update_wan(1);
			}
		}
		
		if((nready = select(maxfd+1, &rset, NULL, NULL, &tval)) <= 0)
			continue;
		
		if(FD_ISSET(dns_sock, &rset)){
			//printf("# run fake dns service\n");	// tmp test
			run_dns_serv(dns_sock);
			if(--nready <= 0)
				continue;
		}
		else if(FD_ISSET(http_sock, &rset)){
			//printf("# run fake httpd service\n");	// tmp test
			if((connfd = accept(http_sock, (struct sockaddr *)&cliaddr, &clilen)) <= 0){
				perror("http accept");
				continue;
			}
			cur_sockfd = connfd;
			
			for(fd_i = 0; fd_i < MAX_USER; ++fd_i){
				if(client[fd_i].sfd < 0){
					client[fd_i].sfd = cur_sockfd;
					client[fd_i].type = T_HTTP;
					break;
				}
			}
			
			if(fd_i == MAX_USER){
csprintf("wanduck servs full\n");
				close(cur_sockfd);
				
				continue;
			}
			
			FD_SET(cur_sockfd, &allset);
			if(cur_sockfd > maxfd)
				maxfd = cur_sockfd;
			if(fd_i > maxi)
				maxi = fd_i;
			
			if(--nready <= 0)
				continue;	// no more readable descriptors
		}
		
		// polling
		for(fd_i = 0; fd_i <= maxi; ++fd_i){
			if((sockfd = client[fd_i].sfd) < 0)
				continue;
			
			if(FD_ISSET(sockfd, &rset)){
// 2007.10 James {
				int nread;
				ioctl(sockfd, FIONREAD, &nread);
				if(nread == 0){
					close_socket(sockfd, T_HTTP);
					continue;
				}
// 2007.10 James }
				
				cur_sockfd = sockfd;
				
				run_http_serv(sockfd);
				
				if(--nready <= 0)
					break;
			}
		}
	}
	
csprintf("wanduck exit error\n");
	exit(1);
}
Esempio n. 4
0
/* --------------UDP_Socket -------------*/
UDP_csocket::UDP_csocket(){
    build_socket(UDP);
    DestAddr.sin_family = AF_INET;
}
Esempio n. 5
0
/* -------------TCP_Socket ------------ */
TCP_csocket::TCP_csocket(){
    build_socket(TCP);
}