1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*************************************************************************** 2e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * _ _ ____ _ 3e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * Project ___| | | | _ \| | 4e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * / __| | | | |_) | | 5e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * | (__| |_| | _ <| |___ 6e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * \___|\___/|_| \_\_____| 7e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 8d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo * Copyright (C) 1998 - 2016, Daniel Stenberg, <daniel@haxx.se>, et al. 9e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 10e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is licensed as described in the file COPYING, which 11e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * you should have received as part of this distribution. The terms 12d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo * are also available at https://curl.haxx.se/docs/copyright.html. 13e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 14e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * You may opt to use, copy, modify, merge, publish, distribute and/or sell 15e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * copies of the Software, and permit persons to whom the Software is 16e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * furnished to do so, under the terms of the COPYING file. 17e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 18e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 19e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * KIND, either express or implied. 20e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET * 21e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET ***************************************************************************/ 229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "test.h" 239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "memdebug.h" 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint test(char *URL) 279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURLcode res; 299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURL *curl; 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels char *newURL = NULL; 319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct curl_slist *slist = NULL; 329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 33d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { 349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_global_init() failed\n"); 359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 38d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo if((curl = curl_easy_init()) == NULL) { 399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_easy_init() failed\n"); 409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Begin with cURL set to use a single CWD to the URL's directory. 469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_URL, URL); 489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_VERBOSE, 1L); 499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_SINGLECWD); 509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_perform(curl); 529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* 549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Change the FTP_FILEMETHOD option to use full paths rather than a CWD 559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * command. Alter the URL's path a bit, appending a "./". Use an innocuous 569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * QUOTE command, after which cURL will CWD to ftp_conn->entrypath and then 579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * (on the next call to ftp_statemach_act) find a non-zero ftpconn->dirdepth 589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * even though no directories are stored in the ftpconn->dirs array (after a 599bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * call to freedirs). 609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 61d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo newURL = aprintf("%s./", URL); 62d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo if(newURL == NULL) { 639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_cleanup(curl); 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels slist = curl_slist_append (NULL, "SYST"); 69d15eaac64ca1a7244824d660ea84e8815a23d058Alex Deymo if(slist == NULL) { 709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels free(newURL); 719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_cleanup(curl); 729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 749bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_URL, newURL); 779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_FTP_FILEMETHOD, (long) CURLFTPMETHOD_NOCWD); 789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_QUOTE, slist); 799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 809bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_perform(curl); 819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelstest_cleanup: 839bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_slist_free_all(slist); 85e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET free(newURL); 869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_cleanup(curl); 879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return (int)res; 909bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 91