blob: be32b67aa7b01c4755e8139bf4e4c6f3b8a99938 [file] [log] [blame]
xf.li6c8fc1e2023-08-12 00:11:09 -07001/***************************************************************************
2 * _ _ ____ _
3 * Project ___| | | | _ \| |
4 * / __| | | | |_) | |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
7 *
8 * Copyright (C) 1998 - 2022, 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.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 * SPDX-License-Identifier: curl
22 *
23 ***************************************************************************/
24/* <DESC>
25 * Use the progress callbacks, old and/or new one depending on available
26 * libcurl version.
27 * </DESC>
28 */
29#include <stdio.h>
30#include <curl/curl.h>
31
32#define MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL 3000000
33#define STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES 6000
34
35struct myprogress {
36 curl_off_t lastruntime; /* type depends on version, see above */
37 CURL *curl;
38};
39
40/* this is how the CURLOPT_XFERINFOFUNCTION callback works */
41static int xferinfo(void *p,
42 curl_off_t dltotal, curl_off_t dlnow,
43 curl_off_t ultotal, curl_off_t ulnow)
44{
45 struct myprogress *myp = (struct myprogress *)p;
46 CURL *curl = myp->curl;
47 curl_off_t curtime = 0;
48
49 curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME_T, &curtime);
50
51 /* under certain circumstances it may be desirable for certain functionality
52 to only run every N seconds, in order to do this the transaction time can
53 be used */
54 if((curtime - myp->lastruntime) >= MINIMAL_PROGRESS_FUNCTIONALITY_INTERVAL) {
55 myp->lastruntime = curtime;
56 fprintf(stderr, "TOTAL TIME: %lu.%06lu\r\n",
57 (unsigned long)(curtime / 1000000),
58 (unsigned long)(curtime % 1000000));
59 }
60
61 fprintf(stderr, "UP: %lu of %lu DOWN: %lu of %lu\r\n",
62 (unsigned long)ulnow, (unsigned long)ultotal,
63 (unsigned long)dlnow, (unsigned long)dltotal);
64
65 if(dlnow > STOP_DOWNLOAD_AFTER_THIS_MANY_BYTES)
66 return 1;
67 return 0;
68}
69
70int main(void)
71{
72 CURL *curl;
73 CURLcode res = CURLE_OK;
74 struct myprogress prog;
75
76 curl = curl_easy_init();
77 if(curl) {
78 prog.lastruntime = 0;
79 prog.curl = curl;
80
81 curl_easy_setopt(curl, CURLOPT_URL, "https://example.com/");
82
83 curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, xferinfo);
84 /* pass the struct pointer into the xferinfo function */
85 curl_easy_setopt(curl, CURLOPT_XFERINFODATA, &prog);
86
87 curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
88 res = curl_easy_perform(curl);
89
90 if(res != CURLE_OK)
91 fprintf(stderr, "%s\n", curl_easy_strerror(res));
92
93 /* always cleanup */
94 curl_easy_cleanup(curl);
95 }
96 return (int)res;
97}