Annotation of embedaddon/curl/docs/examples/httpput.c, revision 1.1.1.1
1.1 misho 1: /***************************************************************************
2: * _ _ ____ _
3: * Project ___| | | | _ \| |
4: * / __| | | | |_) | |
5: * | (__| |_| | _ <| |___
6: * \___|\___/|_| \_\_____|
7: *
8: * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
9: *
10: * This software is licensed as described in the file COPYING, which
11: * you should have received as part of this distribution. The terms
12: * are also available at https://curl.haxx.se/docs/copyright.html.
13: *
14: * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15: * copies of the Software, and permit persons to whom the Software is
16: * furnished to do so, under the terms of the COPYING file.
17: *
18: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19: * KIND, either express or implied.
20: *
21: ***************************************************************************/
22: /* <DESC>
23: * HTTP PUT with easy interface and read callback
24: * </DESC>
25: */
26: #include <stdio.h>
27: #include <fcntl.h>
28: #include <sys/stat.h>
29: #include <curl/curl.h>
30:
31: /*
32: * This example shows a HTTP PUT operation. PUTs a file given as a command
33: * line argument to the URL also given on the command line.
34: *
35: * This example also uses its own read callback.
36: *
37: * Here's an article on how to setup a PUT handler for Apache:
38: * http://www.apacheweek.com/features/put
39: */
40:
41: static size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
42: {
43: size_t retcode;
44: curl_off_t nread;
45:
46: /* in real-world cases, this would probably get this data differently
47: as this fread() stuff is exactly what the library already would do
48: by default internally */
49: retcode = fread(ptr, size, nmemb, stream);
50:
51: nread = (curl_off_t)retcode;
52:
53: fprintf(stderr, "*** We read %" CURL_FORMAT_CURL_OFF_T
54: " bytes from file\n", nread);
55:
56: return retcode;
57: }
58:
59: int main(int argc, char **argv)
60: {
61: CURL *curl;
62: CURLcode res;
63: FILE * hd_src;
64: struct stat file_info;
65:
66: char *file;
67: char *url;
68:
69: if(argc < 3)
70: return 1;
71:
72: file = argv[1];
73: url = argv[2];
74:
75: /* get the file size of the local file */
76: stat(file, &file_info);
77:
78: /* get a FILE * of the same file, could also be made with
79: fdopen() from the previous descriptor, but hey this is just
80: an example! */
81: hd_src = fopen(file, "rb");
82:
83: /* In windows, this will init the winsock stuff */
84: curl_global_init(CURL_GLOBAL_ALL);
85:
86: /* get a curl handle */
87: curl = curl_easy_init();
88: if(curl) {
89: /* we want to use our own read function */
90: curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
91:
92: /* enable uploading */
93: curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
94:
95: /* HTTP PUT please */
96: curl_easy_setopt(curl, CURLOPT_PUT, 1L);
97:
98: /* specify target URL, and note that this URL should include a file
99: name, not only a directory */
100: curl_easy_setopt(curl, CURLOPT_URL, url);
101:
102: /* now specify which file to upload */
103: curl_easy_setopt(curl, CURLOPT_READDATA, hd_src);
104:
105: /* provide the size of the upload, we specicially typecast the value
106: to curl_off_t since we must be sure to use the correct data size */
107: curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
108: (curl_off_t)file_info.st_size);
109:
110: /* Now run off and do what you've been told! */
111: res = curl_easy_perform(curl);
112: /* Check for errors */
113: if(res != CURLE_OK)
114: fprintf(stderr, "curl_easy_perform() failed: %s\n",
115: curl_easy_strerror(res));
116:
117: /* always cleanup */
118: curl_easy_cleanup(curl);
119: }
120: fclose(hd_src); /* close the local file */
121:
122: curl_global_cleanup();
123: return 0;
124: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>