int ftp_chdir(const char *path) { #ifdef HAVE_LIBSSH if (ftp->session) return ssh_chdir(path); #endif ftp_set_tmp_verbosity(vbCommand); ftp_cmd("CWD %s", path); if(ftp->code == ctComplete) { /* Now, try to be smart ;-) * Many ftp servers include the current directory in the CWD reply * try to parse it, so we don't need to issue a PWD command */ if(strncasecmp(ftp->reply, "250 Changed to ", 15) == 0) { /* this is what Troll-ftpd replies: 250 Changed to /foo/bar */ ftp_update_curdir_x(ftp->reply+15); ftp_trace("Parsed cwd '%s' from reply\n", ftp->curdir); } else if(strncasecmp(ftp->reply, "250 OK. Current directory is ", 29) == 0) { /* PureFTPd responds: "250 OK. Current directory is /foo/bar */ ftp_update_curdir_x(ftp->reply+29); ftp_trace("Parsed cwd '%s' from reply\n", ftp->curdir); } else if(strstr(ftp->reply, " is current directory") != 0) { /* WarFTPD answers: 250 "/foo/bar/" is current directory */ char *edq; char *sdq = strchr(ftp->reply, '\"'); if(sdq) { edq = strchr(sdq+1, '\"'); if(edq) { char *e = xstrndup(sdq+1, edq-sdq-1); stripslash(e); ftp_update_curdir_x(e); free(e); ftp_trace("Parsed cwd '%s' from reply\n", ftp->curdir); } } } else if(strncasecmp(ftp->reply, "250 Directory changed to ", 25) == 0) { /* Serv-U FTP Server for WinSock */ ftp_update_curdir_x(ftp->reply + 25); ftp_trace("Parsed cwd '%s' from reply\n", ftp->curdir); } else ftp_update_curdir(); return 0; } return -1; }
int ssh_chdir(const char *path) { char* tmp = ftp_path_absolute(path); char *p = sftp_canonicalize_path(ftp->sftp_session, tmp); free(tmp); if (!p) { ftp_err("%s: %s\n", path, ssh_get_error(ftp->session)); return -1; } bool isdir = false; /* First check if this file is cached and is a directory, else we * need to stat the file to see if it really is a directory */ stripslash(p); isdir = (ftp_cache_get_directory(p) != 0); if(!isdir) { rfile *rf = ftp_cache_get_file(p); isdir = (rf && risdir(rf)); } if (!isdir) { sftp_attributes attrib = sftp_stat(ftp->sftp_session, p); if (!attrib) { ftp_err(_("Couldn't stat directory: %s\n"), ssh_get_error(ftp->session)); free(p); return -1; } if (!S_ISDIR(attrib->permissions)) { ftp_err(_("%s: not a directory\n"), p); sftp_attributes_free(attrib); free(p); return -1; } sftp_attributes_free(attrib); } ftp_update_curdir_x(p); free(p); return 0; }
int ssh_chdir(const char *path) { Attrib *aa; char *p = ftp_path_absolute(path); bool isdir = false; /* First check if this file is cached and is a directory, else we * need to stat the file to see if it really is a directory */ stripslash(p); isdir = (ftp_cache_get_directory(p) != 0); if(!isdir) { rfile *rf = ftp_cache_get_file(p); isdir = (rf && risdir(rf)); } if(!isdir) { if ((aa = ssh_stat(p)) == 0) { free(p); return -1; } if (!(aa->flags & SSH2_FILEXFER_ATTR_PERMISSIONS)) { ftp_err("Can't change directory: Can't check target"); free(p); return -1; } if (!S_ISDIR(aa->perm)) { ftp_err("%s: not a directory\n", p); free(p); return -1; } } ftp_update_curdir_x(p); return 0; }