1e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET/*************************************************************************** 29bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * _ _ ____ _ 39bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Project ___| | | | _ \| | 49bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * / __| | | | |_) | | 59bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * | (__| |_| | _ <| |___ 69bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * \___|\___/|_| \_\_____| 79bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 88f1a214b8a21b66f33454790dfba97ae2f818289Alex 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 128f1a214b8a21b66f33454790dfba97ae2f818289Alex 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#ifdef HAVE_FCNTL_H 259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include <fcntl.h> 269bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#endif 279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels#include "memdebug.h" 299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels/* 319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * This example shows an FTP upload, with a rename of the file just after 329bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * a successful upload. 339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * 349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels * Example based on source code provided by Erick Nuwendam. Thanks! 359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels */ 369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelsint test(char *URL) 389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels{ 399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURL *curl; 409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels CURLcode res = CURLE_OK; 418f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo FILE *hd_src; 428f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo int hd; 439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct_stat file_info; 449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct curl_slist *hl; 459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels int error; 469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels struct curl_slist *headerlist=NULL; 489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels const char *buf_1 = "RNFR 505"; 499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels const char *buf_2 = "RNTO 505-forreal"; 509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 518f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo if(!libtest_arg2) { 529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Usage: <url> <file-to-upload>\n"); 53e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return TEST_ERR_USAGE; 549bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 559bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 569bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels hd_src = fopen(libtest_arg2, "rb"); 579bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(NULL == hd_src) { 589bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels error = ERRNO; 598f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo fprintf(stderr, "fopen failed with error: %d %s\n", 609bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels error, strerror(error)); 619bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "Error opening file: %s\n", libtest_arg2); 62e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return TEST_ERR_MAJOR_BAD; /* if this happens things are major weird */ 639bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 649bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 659bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* get the file size of the local file */ 669bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels hd = fstat(fileno(hd_src), &file_info); 679bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(hd == -1) { 689bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* can't open file, bail out */ 699bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels error = ERRNO; 709bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "fstat() failed with error: %d %s\n", 719bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels error, strerror(error)); 729bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "ERROR: cannot open file %s\n", libtest_arg2); 739bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(hd_src); 74e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return TEST_ERR_MAJOR_BAD; 759bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 769bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 779bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels if(! file_info.st_size) { 789bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "ERROR: file %s has zero size!\n", libtest_arg2); 799bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(hd_src); 80e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET return TEST_ERR_MAJOR_BAD; 819bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 829bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 838f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo if(curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) { 849bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_global_init() failed\n"); 859bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(hd_src); 869bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 879bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 889bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 899bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* get a curl handle */ 908f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo curl = curl_easy_init(); 918f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo if(!curl) { 929bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_easy_init() failed\n"); 939bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 949bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(hd_src); 959bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 969bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 979bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 989bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* build a list of commands to pass to libcurl */ 999bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1008f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo hl = curl_slist_append(headerlist, buf_1); 1018f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo if(!hl) { 1029bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_slist_append() failed\n"); 1039bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_cleanup(curl); 1049bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 1059bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(hd_src); 1069bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 1079bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1088f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo headerlist = curl_slist_append(hl, buf_2); 1098f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo if(!headerlist) { 1109bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fprintf(stderr, "curl_slist_append() failed\n"); 1119bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_slist_free_all(hl); 1129bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_cleanup(curl); 1139bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 1149bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(hd_src); 1159bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return TEST_ERR_MAJOR_BAD; 1169bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels } 1179bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels headerlist = hl; 1189bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1199bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* enable uploading */ 1209bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_UPLOAD, 1L); 1219bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1229bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* enable verbose */ 1239bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_VERBOSE, 1L); 1249bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1259bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* specify target */ 1268f1a214b8a21b66f33454790dfba97ae2f818289Alex Deymo test_setopt(curl, CURLOPT_URL, URL); 1279bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1289bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* pass in that last of FTP commands to run after the transfer */ 1299bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_POSTQUOTE, headerlist); 1309bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1319bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* now specify which file to upload */ 132e6cd738ed3716c02557fb3a47515244e949ade39Bertrand SIMONNET test_setopt(curl, CURLOPT_READDATA, hd_src); 1339bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1349bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* and give the size of the upload (optional) */ 1359bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels test_setopt(curl, CURLOPT_INFILESIZE_LARGE, 1369bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels (curl_off_t)file_info.st_size); 1379bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1389bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* Now run off and do what you've been told! */ 1399bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels res = curl_easy_perform(curl); 1409bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1419bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckelstest_cleanup: 1429bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1439bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* clean up the FTP commands list */ 1449bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_slist_free_all(headerlist); 1459bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1469bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels /* close the local file */ 1479bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels fclose(hd_src); 1489bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1499bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_easy_cleanup(curl); 1509bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels curl_global_cleanup(); 1519bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels 1529bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels return res; 1539bd90e6e25f1e55f50201c87a1b5837de7e5b64aLucas Eckels} 154