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; }
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; }
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; }