Example #1
0
int dataconn()
{
	struct sockaddr foo;
	struct sockaddr_in local;
	size_t namelen = sizeof(foo);
    // brcm int curuid = geteuid();

	memset(&foo, 0, sizeof(foo));
	memset(&local, 0, sizeof(local));

	if (pasv) {
		sock = accept(pasvsock, (struct sockaddr *) &foo, &namelen);
		if (sock == -1) {
            control_printf(SL_FAILURE, "425-Unable to accept data connection.\r\n425 %s.",
                     strerror(errno));
			return 1;
		}
        close(pasvsock);
        prepare_sock(sock);
	} else {
		sock = socket(AF_INET, SOCK_STREAM, 0);
        prepare_sock(sock);
		local.sin_addr.s_addr = name.sin_addr.s_addr;
		local.sin_family = AF_INET;
#if 0 //brcm
        if (!strcasecmp(config_getoption("DATAPORT20"), "yes")) {
            seteuid(0);
            local.sin_port = htons(20);
        }
#endif //brcm
		if (bind(sock, (struct sockaddr *) &local, sizeof(local)) < 0) {
			control_printf(SL_FAILURE, "425-Unable to bind data socket.\r\n425 %s.",
					strerror(errno));
			return 1;
		}
#if 0 //brcm
        if (!strcasecmp(config_getoption("DATAPORT20"), "yes"))
            seteuid(curuid);
#endif //brcm
		sa.sin_family = AF_INET;
		if (connect(sock, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
			control_printf(SL_FAILURE, "425-Unable to establish data connection.\r\n"
                    "425 %s.", strerror(errno));
			return 1;
		}
	}
	control_printf(SL_SUCCESS, "150 %s data connection established.",
	               xfertype == TYPE_BINARY ? "BINARY" : "ASCII");
	return 0;
}
Example #2
0
void command_pasv(char *foo)
{
	int a1, a2, a3, a4;
   socklen_t namelen;
	struct sockaddr_in localsock;
    if (epsvall) {
        control_printf(SL_FAILURE, "500 EPSV ALL has been called.");
        return;
    }
	pasvsock = socket(AF_INET, SOCK_STREAM, 0);
	sa.sin_addr.s_addr = INADDR_ANY;
	sa.sin_family = AF_INET;

    if (!config_getoption("PASSIVE_PORTS") || !strlen(config_getoption("PASSIVE_PORTS"))) {
        /* bind to any port */
        sa.sin_port = 0;
        if (bind(pasvsock, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
            control_printf(SL_FAILURE, "425-Error: Unable to bind data socket.\r\n425 %s", strerror(errno));
            return;
        }
	} else {
        int i = 0, success = 0, port;
        for (;;) {
            port = int_from_list(config_getoption("PASSIVE_PORTS"), i++);
            if (port < 0)
                break;
            sa.sin_port = htons(port);
            if (bind(pasvsock, (struct sockaddr *) &sa, sizeof(sa)) == 0) {
                success = 1;
#ifdef DEBUG
//                bftpd_log("Passive mode: Successfully bound port %d\n", port);
#endif
                break;
            }
        }
        if (!success) {
            control_printf(SL_FAILURE, "425 Error: Unable to bind data socket.");
            return;
        }
        prepare_sock(pasvsock);
    }       

	if (listen(pasvsock, 1)) {
		control_printf(SL_FAILURE, "425-Error: Unable to make socket listen.\r\n425 %s",
				 strerror(errno));
		return;
	}
	namelen = sizeof(localsock);
	getsockname(pasvsock, (struct sockaddr *) &localsock, (int *) &namelen);
	sscanf((char *) inet_ntoa(name.sin_addr), "%i.%i.%i.%i",
		   &a1, &a2, &a3, &a4);
	control_printf(SL_SUCCESS, "227 Entering Passive Mode (%i,%i,%i,%i,%i,%i)", a1, a2, a3, a4,
			 ntohs(localsock.sin_port) >> 8, ntohs(localsock.sin_port) & 0xFF);
	pasv = 1;
}
Example #3
0
int main(int argc, char **argv)
{
	char read_tty[TTY_LEN] = { 0 };
	int ip_version;
	int socket_domain = AF_UNSPEC;
	char cmd[COMMAND_LEN] = { 0 };

	/* Open the error log file */
	error_file = fopen(error_log_file, "a+");
	if (!error_file) {
		printf("Error: Unable to open log file - %m\n");
		return 1;
	}

	/* Register actions upon interrupts */
	register_kill();

	/* Parse the user input */
	if (!parse_user_input(argc, argv, read_tty, sizeof(read_tty), &ip_version)) {
		return 2;
	}

	snprintf(cmd, sizeof(cmd), "%s %s", uS_console, "connect");
	if (system(cmd) == -1) {
		errlog("Error: Unable to connect to the micro-server\n");
		return 3;
	}

	/* Create a socket to communicate with the netcons server */
	socket_domain = (ip_version == IPV4) ? AF_INET : AF_INET6;
	fd_soc = socket(socket_domain, SOCK_DGRAM, 0);
	if (fd_soc == -1) {
		errlog("Error: Socket creation failed -  %m\n");
		return 4;
	}

	if (ip_version == IPV4) {	/* IPv4 */
		struct sockaddr_in tgt_addr;
		if (!prepare_sock(&tgt_addr)) {
			close(fd_soc);
			errlog("Error: Socket not valid\n");
			return 5;
		}

		if (connect(fd_soc, (struct sockaddr *)&tgt_addr, sizeof(tgt_addr)) == -1) {
			close(fd_soc);
			errlog("Error: Socket connection failed - %m\n");
			return 6;
		}

	} else {		/* IPv6 */

		struct sockaddr_in6 tgt_addr6;
		if (!prepare_sock6(&tgt_addr6)) {
			close(fd_soc);
			errlog("Error: Socket not valid\n");
			return 5;
		}

		if (connect(fd_soc, (struct sockaddr *)&tgt_addr6, sizeof(tgt_addr6)) == -1) {
			close(fd_soc);
			errlog("Error: Socket connection failed - %m\n");
			return 6;
		}
	}

	/* TTY Operations */
	if ((fd_tty = open(read_tty, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1) {
		close(fd_soc);
		errlog("Error: Serial Port %s open failed - %m\n", read_tty);
		return 7;
	}

	if (!set_tty(fd_tty)) {
		errlog("Error: tty not set properly\n");
		cleanup();
		return 8;
	}

	/* Read, prepare and send the logs */
	if (!read_send(fd_tty, fd_soc)) {
		errlog("Error: Sending logs failed\n");
		cleanup();
		return 9;
	}

	cleanup();
	return 0;
}