1 /*************************************************************************** 2 * _ _ ____ _ 3 * Project ___| | | | _ \| | 4 * / __| | | | |_) | | 5 * | (__| |_| | _ <| |___ 6 * \___|\___/|_| \_\_____| 7 * 8 * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel (at) haxx.se>, et al. 9 * 10 * This software is licensed as described in the file COPYING, which 11 * you should have received as part of this distribution. The terms 12 * are also available at https://curl.haxx.se/docs/copyright.html. 13 * 14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15 * copies of the Software, and permit persons to whom the Software is 16 * furnished to do so, under the terms of the COPYING file. 17 * 18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19 * KIND, either express or implied. 20 * 21 ***************************************************************************/ 22 #include "test.h" 23 24 #include "memdebug.h" 25 26 int test(char *URL) 27 { 28 CURLcode res; 29 CURL *curl; 30 char *newURL = NULL; 31 struct curl_slist *slist = NULL; 32 33 if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { 34 fprintf(stderr, "curl_global_init() failed\n"); 35 return TEST_ERR_MAJOR_BAD; 36 } 37 38 curl = curl_easy_init(); 39 if(!curl) { 40 fprintf(stderr, "curl_easy_init() failed\n"); 41 curl_global_cleanup(); 42 return TEST_ERR_MAJOR_BAD; 43 } 44 45 /* 46 * Begin with curl set to use a single CWD to the URL's directory. 47 */ 48 test_setopt(curl, CURLOPT_URL, URL); 49 test_setopt(curl, CURLOPT_VERBOSE, 1L); 50 test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_SINGLECWD); 51 52 res = curl_easy_perform(curl); 53 54 /* 55 * Change the FTP_FILEMETHOD option to use full paths rather than a CWD 56 * command. Alter the URL's path a bit, appending a "./". Use an innocuous 57 * QUOTE command, after which curl will CWD to ftp_conn->entrypath and then 58 * (on the next call to ftp_statemach_act) find a non-zero ftpconn->dirdepth 59 * even though no directories are stored in the ftpconn->dirs array (after a 60 * call to freedirs). 61 */ 62 newURL = aprintf("%s./", URL); 63 if(newURL == NULL) { 64 curl_easy_cleanup(curl); 65 curl_global_cleanup(); 66 return TEST_ERR_MAJOR_BAD; 67 } 68 69 slist = curl_slist_append(NULL, "SYST"); 70 if(slist == NULL) { 71 free(newURL); 72 curl_easy_cleanup(curl); 73 curl_global_cleanup(); 74 return TEST_ERR_MAJOR_BAD; 75 } 76 77 test_setopt(curl, CURLOPT_URL, newURL); 78 test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD); 79 test_setopt(curl, CURLOPT_QUOTE, slist); 80 81 res = curl_easy_perform(curl); 82 83 test_cleanup: 84 85 curl_slist_free_all(slist); 86 free(newURL); 87 curl_easy_cleanup(curl); 88 curl_global_cleanup(); 89 90 return (int)res; 91 } 92