/*****************************************************************************
 *                                  _   _ ____  _
 *  Project                     ___| | | |  _ \| |
 *                             / __| | | | |_) | |
 *                            | (__| |_| |  _ <| |___
 *                             \___|\___/|_| \_\_____|
 *
 * $Id: httpput.c,v 1.5 2004/01/05 22:29:30 bagder Exp $
 */

#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>

#include <curl/curl.h>

/*
 * This example shows a HTTP PUT operation. PUTs a file given as a command
 * line argument to the URL also given on the command line.
 *
 * This example also uses its own read callback.
 */

size_t read_callback( void *ptr, size_t size, size_t nmemb, void *stream ) {
	size_t retcode;

	/* 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 */
	retcode = fread( ptr, size, nmemb, stream );

	fprintf( stderr, "*** We read %d bytes from file\n", retcode );

	return retcode;
}

int main( int argc, char **argv ) {
	CURL *curl;
	CURLcode res;
	FILE *ftpfile;
	FILE * hd_src ;
	int hd ;
	struct stat file_info;

	char *file;
	char *url;

	if ( argc < 3 ) {
		return 1;
	}

	file = argv[1];
	url = argv[2];

	/* get the file size of the local file */
	hd = open( file, O_RDONLY ) ;
	fstat( hd, &file_info );
	close( hd ) ;

	/* get a FILE * of the same file, could also be made with
	   fdopen() from the previous descriptor, but hey this is just
	   an example! */
	hd_src = fopen( 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 ) {
		/* we want to use our own read function */
		curl_easy_setopt( curl, CURLOPT_READFUNCTION, read_callback );

		/* enable uploading */
		curl_easy_setopt( curl, CURLOPT_UPLOAD, TRUE ) ;

		/* HTTP PUT please */
		curl_easy_setopt( curl, CURLOPT_PUT, TRUE );

		/* specify target URL, and note that this URL should include a file
		   name, not only a directory */
		curl_easy_setopt( curl,CURLOPT_URL, url );

		/* now specify which file to upload */
		curl_easy_setopt( curl, CURLOPT_READDATA, hd_src );

		/* and give the size of the upload */
		curl_easy_setopt( curl, CURLOPT_INFILESIZE_LARGE, file_info.st_size );

		/* Now run off and do what you've been told! */
		res = curl_easy_perform( curl );

		/* always cleanup */
		curl_easy_cleanup( curl );
	}
	fclose( hd_src ); /* close the local file */

	curl_global_cleanup();
	return 0;
}
