/** If it actually changed the directory it returns true */ void do_subshell_chdir (const vfs_path_t * vpath, gboolean update_prompt) { char *pcwd; pcwd = vfs_path_to_str_flags (current_panel->cwd_vpath, 0, VPF_RECODE); if (!(subshell_state == INACTIVE && strcmp (subshell_cwd, pcwd) != 0)) { /* We have to repaint the subshell prompt if we read it from * the main program. Please note that in the code after this * if, the cd command that is sent will make the subshell * repaint the prompt, so we don't have to paint it. */ if (update_prompt) do_update_prompt (); g_free (pcwd); return; } /* The initial space keeps this out of the command history (in bash because we set "HISTCONTROL=ignorespace") */ write_all (mc_global.tty.subshell_pty, " cd ", 4); if (vpath != NULL) { char *translate; translate = vfs_translate_path_n (vfs_path_as_str (vpath)); if (translate != NULL) { GString *temp; temp = subshell_name_quote (translate); write_all (mc_global.tty.subshell_pty, temp->str, temp->len); g_string_free (temp, TRUE); g_free (translate); } else { write_all (mc_global.tty.subshell_pty, ".", 1); } } else { write_all (mc_global.tty.subshell_pty, "/", 1); } write_all (mc_global.tty.subshell_pty, "\n", 1); subshell_state = RUNNING_COMMAND; feed_subshell (QUIETLY, FALSE); if (subshell_alive) { int bPathNotEq = strcmp (subshell_cwd, pcwd); if (bPathNotEq && subshell_type == TCSH) { char rp_subshell_cwd[PATH_MAX]; char rp_current_panel_cwd[PATH_MAX]; char *p_subshell_cwd = mc_realpath (subshell_cwd, rp_subshell_cwd); char *p_current_panel_cwd = mc_realpath (pcwd, rp_current_panel_cwd); if (p_subshell_cwd == NULL) p_subshell_cwd = subshell_cwd; if (p_current_panel_cwd == NULL) p_current_panel_cwd = pcwd; bPathNotEq = strcmp (p_subshell_cwd, p_current_panel_cwd); } if (bPathNotEq && !DIR_IS_DOT (pcwd)) { char *cwd; cwd = vfs_path_to_str_flags (current_panel->cwd_vpath, 0, VPF_STRIP_PASSWORD); vfs_print_message (_("Warning: Cannot change to %s.\n"), cwd); g_free (cwd); } } update_subshell_prompt = FALSE; g_free (pcwd); /* Make sure that MC never stores the CWD in a silly format */ /* like /usr////lib/../bin, or the strcmp() above will fail */ }
static int sftpfs_open_socket (struct vfs_s_super *super, GError ** error) { struct addrinfo hints, *res = NULL, *curr_res; int my_socket = 0; char port[BUF_TINY]; int e; if (super->path_element->host == NULL || *super->path_element->host == '\0') { g_set_error (error, MC_ERROR, -1, _("sftp: Invalid host name.")); return -1; } sprintf (port, "%hu", (unsigned short) super->path_element->port); if (port == NULL) { g_set_error (error, MC_ERROR, -1, _("sftp: Invalid port value.")); return -1; } tty_enable_interrupt_key (); /* clear the interrupt flag */ memset (&hints, 0, sizeof (struct addrinfo)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; #ifdef AI_ADDRCONFIG /* By default, only look up addresses using address types for * which a local interface is configured (i.e. no IPv6 if no IPv6 * interfaces, likewise for IPv4 (see RFC 3493 for details). */ hints.ai_flags = AI_ADDRCONFIG; #endif e = getaddrinfo (super->path_element->host, port, &hints, &res); #ifdef AI_ADDRCONFIG if (e == EAI_BADFLAGS) { /* Retry with no flags if AI_ADDRCONFIG was rejected. */ hints.ai_flags = 0; e = getaddrinfo (super->path_element->host, port, &hints, &res); } #endif if (e != 0) { g_set_error (error, MC_ERROR, -1, _("sftp: %s"), gai_strerror (e)); my_socket = -1; goto ret; } for (curr_res = res; curr_res != NULL; curr_res = curr_res->ai_next) { my_socket = socket (curr_res->ai_family, curr_res->ai_socktype, curr_res->ai_protocol); if (my_socket < 0) { if (curr_res->ai_next != NULL) continue; vfs_print_message (_("sftp: %s"), unix_error_string (errno)); my_socket = -1; goto ret; } vfs_print_message (_("sftp: making connection to %s"), super->path_element->host); if (connect (my_socket, curr_res->ai_addr, curr_res->ai_addrlen) >= 0) break; close (my_socket); if (errno == EINTR && tty_got_interrupt ()) g_set_error (error, MC_ERROR, -1, _("sftp: connection interrupted by user")); else if (res->ai_next == NULL) g_set_error (error, MC_ERROR, -1, _("sftp: connection to server failed: %s"), unix_error_string (errno)); else continue; my_socket = -1; break; } ret: if (res != NULL) freeaddrinfo (res); tty_disable_interrupt_key (); return my_socket; }