Hello there,
I have, using Daniel's tip, used curl from command line of my RaspberryPi. It worked OK. The same URL from ./FTPupload did NOT work, error code file attached. So Daniel can very well be correct: the URL used is not the one I programmed. Any way one can see what the program sends to the network? Debug the outgoing data. My exact version of ftpupload.c is attached. Where is the problem hiding?
Nils

    
Den 2015-08-11 kl. 19:09, skrev Daniel Stenberg:
On Tue, 11 Aug 2015, Nils Söderman wrote:

Can the reason for the  error code for address "ftp://192.168.0.151/backup/ftptest/" be that I am working within my LAN?

No. libcurl doesn't care (and doesn't know) about that. It deals with the given URL and will act on it and if that IP is within your LAN then so be it.

That URL is most probably not the problem. I find it more likely that you accidentally or otherwise send in a URL that isn't exactly that string. That's why I suggest you should just try using curl on the command line with that URL to see if that works.

So my question: how to write REMOTE_URL string when working inside a LAN?

Exactly the way you write it here. There's no problem with this URL.



-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html




#define LOCAL_FILE      "ws_data.txt"
#define UPLOAD_FILE_AS  "ws_data2.txt"
//#define REMOTE_URL      "ftp://192.168.0.151/backup/ftptest/"; 
//#define REMOTE_URL      "ftp://RaidNilsSandra/"; 
#define REMOTE_URL "ftp://192.168.0.151";
#define RENAME_FILE_TO  "ws_data3.txt"
 


pi@VallrunElmeter ~/Counter $ sudo curl ftp://192.168.0.151/backup --ftp-ssl 
--insecure
curl: (78) RETR response: 550
pi@VallrunElmeter ~/Counter $ sudo curl ftp://192.168.0.151 --ftp-ssl --insecure
drwxrwxrwx  51 backup   nogroup     16384 Aug 10 11:09 backup
pi@VallrunElmeter ~/Counter $ sudo curl ftp://192.168.0.151 
drwxrwxrwx  51 backup   nogroup     16384 Aug 10 11:09 backup
pi@VallrunElmeter ~/Counter $ sudo ./ftpupload
Local file size: 99 bytes.
curl_easy_perform() failed: URL using bad/illegal format or missing URL
pi@VallrunElmeter ~/Counter $ sudo ./ftpupload
Local file size: 99 bytes.
curl_easy_perform() failed: URL using bad/illegal format or missing URL
pi@VallrunElmeter ~/Counter $ sudo ./ftpupload
Local file size: 99 bytes.
curl_easy_perform() failed: URL using bad/illegal format or missing URL
pi@VallrunElmeter ~/Counter $ ^C
pi@VallrunElmeter ~/Counter $ 


/***************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * Copyright (C) 1998 - 2015, Daniel Stenberg, <[email protected]>, et al.
 *
 * This software is licensed as described in the file COPYING, which
 * you should have received as part of this distribution. The terms
 * are also available at http://curl.haxx.se/docs/copyright.html.
 *
 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 * copies of the Software, and permit persons to whom the Software is
 * furnished to do so, under the terms of the COPYING file.
 *
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 * KIND, either express or implied.
 *
 ***************************************************************************/
#include <stdio.h>
#include <string.h>
 
#include <curl/curl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#ifdef WIN32
#include <io.h>
#else
#include <unistd.h>
#endif
 
/* <DESC>
 * Performs an FTP upload and renames the file just after a successful
 * transfer.
 * </DESC>
 */ 
 
#define LOCAL_FILE      "ws_data.txt"
#define UPLOAD_FILE_AS  "ws_data2.txt"
//#define REMOTE_URL      "ftp://192.168.0.151/backup/ftptest/"; 
//#define REMOTE_URL      "ftp://RaidNilsSandra/"; 
#define REMOTE_URL "ftp://192.168.0.151";
#define RENAME_FILE_TO  "ws_data3.txt"
 
/* NOTE: if you want this example to work on Windows with libcurl as a
   DLL, you MUST also provide a read callback with CURLOPT_READFUNCTION.
   Failing to do so will give you a crash since a DLL may not use the
   variable's memory when passed in to it from an app like this. */ 
static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
{
  curl_off_t nread;
  /* in real-world cases, this would probably get this data differently
     as this fread() stuff is exactly what the library already would do
     by default internally */ 
  size_t retcode = fread(ptr, size, nmemb, stream);
 
  nread = (curl_off_t)retcode;
 
  fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
          " bytes from file\n", nread);
  return retcode;
}
 
int main(void)
{
  CURL *curl;
  CURLcode res;
  FILE *hd_src;
  struct stat file_info;
  curl_off_t fsize;
 
  struct curl_slist *headerlist=NULL;
  static const char buf_1 [] = "RNFR " UPLOAD_FILE_AS;
//  static const char buf_2 [] = "RNTO " RENAME_FILE_TO;
 
  /* get the file size of the local file */ 
  if(stat(LOCAL_FILE, &file_info)) {
    printf("Couldnt open '%s': %s\n", LOCAL_FILE, strerror(errno));
    return 1;
  }
  fsize = (curl_off_t)file_info.st_size;
 
  printf("Local file size: %" CURL_FORMAT_CURL_OFF_T " bytes.\n", fsize);
 
  /* get a FILE * of the same file */ 
  hd_src = fopen(LOCAL_FILE, "rb");
 
  /* In windows, this will init the winsock stuff */ 
  curl_global_init(CURL_GLOBAL_ALL);
 
  /* get a curl handle */ 
  curl = curl_easy_init();
  if(curl) {
    /* build a list of commands to pass to libcurl */ 
    headerlist = curl_slist_append(headerlist, buf_1);
//    headerlist = curl_slist_append(headerlist, buf_2);
 
    /* we want to use our own read function */ 
    curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
 
    /* enable uploading */ 
    curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
 
    /* specify target */ 
    curl_easy_setopt(curl,CURLOPT_URL, REMOTE_URL);
 
    /* pass in that last of FTP commands to run after the transfer */ 
    curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
 
    /* now specify which file to upload */ 
    curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
 
    /* Set the size of the file to upload (optional).  If you give a *_LARGE
       option you MUST make sure that the type of the passed-in argument is a
       curl_off_t. If you use CURLOPT_INFILESIZE (without _LARGE) you must
       make sure that to pass in a type 'long' argument. */ 
    curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
                     (curl_off_t)fsize);
 
    /* Now run off and do what you've been told! */ 
    res = curl_easy_perform(curl);
    /* Check for errors */ 
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));
 
    /* clean up the FTP commands list */ 
    curl_slist_free_all (headerlist);
 
    /* always cleanup */ 
    curl_easy_cleanup(curl);
  }
  fclose(hd_src); /* close the local file */ 
 
  curl_global_cleanup();
  return 0;
}
-------------------------------------------------------------------
List admin: http://cool.haxx.se/list/listinfo/curl-library
Etiquette:  http://curl.haxx.se/mail/etiquette.html

Reply via email to