-
-
-static size_t
-ftp_ls_data (void* buffer, size_t size, size_t nmemb, void* data)
-{
- string* s = reinterpret_cast<string *> (data);
- uint8_t* b = reinterpret_cast<uint8_t *> (buffer);
- for (size_t i = 0; i < (size * nmemb); ++i) {
- *s += b[i];
- }
- return nmemb;
-}
-
-list<string>
-ftp_ls (string url)
-{
- CURL* curl = curl_easy_init ();
- if (!curl) {
- return list<string> ();
- }
-
- if (url.substr (url.length() - 1, 1) != "/") {
- url += "/";
- }
- curl_easy_setopt (curl, CURLOPT_URL, url.c_str ());
- /* 20s timeout */
- curl_easy_setopt (curl, CURLOPT_TIMEOUT, 20);
-
- string ls_raw;
- struct curl_slist* commands = 0;
- commands = curl_slist_append (commands, "NLST");
- curl_easy_setopt (curl, CURLOPT_POSTQUOTE, commands);
- curl_easy_setopt (curl, CURLOPT_WRITEDATA, &ls_raw);
- curl_easy_setopt (curl, CURLOPT_WRITEFUNCTION, ftp_ls_data);
- curl_easy_setopt (curl, CURLOPT_FTP_USE_EPSV, 0);
- CURLcode const r = curl_easy_perform (curl);
- if (r != CURLE_OK) {
- return list<string> ();
- }
-
- SafeStringStream s (ls_raw);
- list<string> ls;
- while (s.good ()) {
- string line = s.getline ();
- trim (line);
- if (line.length() > 55) {
- string const file = line.substr (55);
- if (file != "." && file != "..") {
- ls.push_back (file);
- }
- }
- }
-
- curl_easy_cleanup (curl);
-
- return ls;
-}