35
34
/* parse headers for Content-Length */
36
35
size_t getcontentlengthfunc(void *ptr, size_t size, size_t nmemb, void *stream) {
40
/* _snscanf() is Win32 specific */
41
r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len);
43
if (r) /* Microsoft: we don't read the specs */
44
*((long *) stream) = len;
39
/* _snscanf() is Win32 specific */
40
r = _snscanf(ptr, size * nmemb, "Content-Length: %ld\n", &len);
42
if (r) /* Microsoft: we don't read the specs */
43
*((long *) stream) = len;
49
48
/* discard downloaded data */
50
49
size_t discardfunc(void *ptr, size_t size, size_t nmemb, void *stream) {
54
53
/* read data to upload */
55
54
size_t readfunc(void *ptr, size_t size, size_t nmemb, void *stream)
61
return CURL_READFUNC_ABORT;
63
n = fread(ptr, size, nmemb, f) * size;
60
return CURL_READFUNC_ABORT;
62
n = fread(ptr, size, nmemb, f) * size;
69
68
int upload(CURL *curlhandle, const char * remotepath, const char * localpath,
70
69
long timeout, long tries)
73
long uploaded_len = 0;
74
CURLcode r = CURLE_GOT_NOTHING;
77
f = fopen(localpath, "rb");
83
curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
85
curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
88
curl_easy_setopt(curlhandle, CURLOPT_FTP_RESPONSE_TIMEOUT, timeout);
90
curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
91
curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &uploaded_len);
93
curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, discardfunc);
95
curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
96
curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
98
curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-"); /* disable passive mode */
99
curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
101
curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
103
for (c = 0; (r != CURLE_OK) && (c < tries); c++) {
104
/* are we resuming? */
106
/* determine the length of the file already written */
109
* With NOBODY and NOHEADER, libcurl will issue a SIZE
110
* command, but the only way to retrieve the result is
111
* to parse the returned Content-Length header. Thus,
112
* getcontentlengthfunc(). We need discardfunc() above
113
* because HEADER will dump the headers to stdout
116
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 1L);
117
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L);
119
r = curl_easy_perform(curlhandle);
123
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);
124
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0L);
126
fseek(f, uploaded_len, SEEK_SET);
128
curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1L);
131
curl_easy_setopt(curlhandle, CURLOPT_APPEND, 0L);
134
r = curl_easy_perform(curlhandle);
142
fprintf(stderr, "%s\n", curl_easy_strerror(r));
72
long uploaded_len = 0;
73
CURLcode r = CURLE_GOT_NOTHING;
76
f = fopen(localpath, "rb");
82
curl_easy_setopt(curlhandle, CURLOPT_UPLOAD, 1L);
84
curl_easy_setopt(curlhandle, CURLOPT_URL, remotepath);
87
curl_easy_setopt(curlhandle, CURLOPT_FTP_RESPONSE_TIMEOUT, timeout);
89
curl_easy_setopt(curlhandle, CURLOPT_HEADERFUNCTION, getcontentlengthfunc);
90
curl_easy_setopt(curlhandle, CURLOPT_HEADERDATA, &uploaded_len);
92
curl_easy_setopt(curlhandle, CURLOPT_WRITEFUNCTION, discardfunc);
94
curl_easy_setopt(curlhandle, CURLOPT_READFUNCTION, readfunc);
95
curl_easy_setopt(curlhandle, CURLOPT_READDATA, f);
97
curl_easy_setopt(curlhandle, CURLOPT_FTPPORT, "-"); /* disable passive mode */
98
curl_easy_setopt(curlhandle, CURLOPT_FTP_CREATE_MISSING_DIRS, 1L);
100
curl_easy_setopt(curlhandle, CURLOPT_VERBOSE, 1L);
102
for (c = 0; (r != CURLE_OK) && (c < tries); c++) {
103
/* are we resuming? */
105
/* determine the length of the file already written */
108
* With NOBODY and NOHEADER, libcurl will issue a SIZE
109
* command, but the only way to retrieve the result is
110
* to parse the returned Content-Length header. Thus,
111
* getcontentlengthfunc(). We need discardfunc() above
112
* because HEADER will dump the headers to stdout
115
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 1L);
116
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 1L);
118
r = curl_easy_perform(curlhandle);
122
curl_easy_setopt(curlhandle, CURLOPT_NOBODY, 0L);
123
curl_easy_setopt(curlhandle, CURLOPT_HEADER, 0L);
125
fseek(f, uploaded_len, SEEK_SET);
127
curl_easy_setopt(curlhandle, CURLOPT_APPEND, 1L);
130
curl_easy_setopt(curlhandle, CURLOPT_APPEND, 0L);
133
r = curl_easy_perform(curlhandle);
141
fprintf(stderr, "%s\n", curl_easy_strerror(r));
147
146
int main(int c, char **argv) {
148
CURL *curlhandle = NULL;
150
curl_global_init(CURL_GLOBAL_ALL);
151
curlhandle = curl_easy_init();
153
upload(curlhandle, "ftp://user:pass@host/path/file", "C:\\file", 0, 3);
155
curl_easy_cleanup(curlhandle);
156
curl_global_cleanup();
147
CURL *curlhandle = NULL;
149
curl_global_init(CURL_GLOBAL_ALL);
150
curlhandle = curl_easy_init();
152
upload(curlhandle, "ftp://user:pass@host/path/file", "C:\\file", 0, 3);
154
curl_easy_cleanup(curlhandle);
155
curl_global_cleanup();