quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

lib677.c (3933B)


      1 /***************************************************************************
      2  *                                  _   _ ____  _
      3  *  Project                     ___| | | |  _ \| |
      4  *                             / __| | | | |_) | |
      5  *                            | (__| |_| |  _ <| |___
      6  *                             \___|\___/|_| \_\_____|
      7  *
      8  * Copyright (C) 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 #include "first.h"
     25 
     26 #include "memdebug.h"
     27 
     28 static CURLcode test_lib677(char *URL)
     29 {
     30   static const char testcmd[] = "A1 IDLE\r\n";
     31   static char testbuf[1024];
     32 
     33   CURLM *mcurl;
     34   CURL *curl = NULL;
     35   int mrun;
     36   curl_socket_t sock = CURL_SOCKET_BAD;
     37   time_t start = time(NULL);
     38   int state = 0;
     39   ssize_t pos = 0;
     40   CURLcode res = CURLE_OK;
     41 
     42   global_init(CURL_GLOBAL_DEFAULT);
     43   multi_init(mcurl);
     44   easy_init(curl);
     45 
     46   easy_setopt(curl, CURLOPT_VERBOSE, 1L);
     47   easy_setopt(curl, CURLOPT_URL, URL);
     48   easy_setopt(curl, CURLOPT_CONNECT_ONLY, 1L);
     49   if(curl_multi_add_handle(mcurl, curl))
     50     goto test_cleanup;
     51 
     52   while(time(NULL) - start < 5) {
     53     struct curl_waitfd waitfd;
     54 
     55     multi_perform(mcurl, &mrun);
     56     for(;;) {
     57       int i;
     58       struct CURLMsg *m = curl_multi_info_read(mcurl, &i);
     59 
     60       if(!m)
     61         break;
     62       if(m->msg == CURLMSG_DONE && m->easy_handle == curl) {
     63         curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &sock);
     64         if(sock == CURL_SOCKET_BAD)
     65           goto test_cleanup;
     66         curl_mprintf("Connected fine, extracted socket. Moving on\n");
     67       }
     68     }
     69 
     70     if(sock != CURL_SOCKET_BAD) {
     71       waitfd.events = state ? CURL_WAIT_POLLIN : CURL_WAIT_POLLOUT;
     72       waitfd.revents = 0;
     73       curl_easy_getinfo(curl, CURLINFO_ACTIVESOCKET, &sock);
     74       waitfd.fd = sock;
     75     }
     76     curl_multi_wait(mcurl, &waitfd, sock == CURL_SOCKET_BAD ? 0 : 1, 50,
     77                     &mrun);
     78     if((sock != CURL_SOCKET_BAD) && (waitfd.revents & waitfd.events)) {
     79       size_t len = 0;
     80 
     81       if(!state) {
     82         CURLcode ec;
     83         ec = curl_easy_send(curl, testcmd + pos,
     84                             sizeof(testcmd) - 1 - pos, &len);
     85         if(ec == CURLE_AGAIN) {
     86           continue;
     87         }
     88         else if(ec) {
     89           curl_mfprintf(stderr, "curl_easy_send() failed, with code %d (%s)\n",
     90                         (int)ec, curl_easy_strerror(ec));
     91           res = ec;
     92           goto test_cleanup;
     93         }
     94         if(len > 0)
     95           pos += len;
     96         else
     97           pos = 0;
     98         if(pos == sizeof(testcmd) - 1) {
     99           state++;
    100           pos = 0;
    101         }
    102       }
    103       else if(pos < (ssize_t)sizeof(testbuf)) {
    104         CURLcode ec;
    105         ec = curl_easy_recv(curl, testbuf + pos, sizeof(testbuf) - pos, &len);
    106         if(ec == CURLE_AGAIN) {
    107           continue;
    108         }
    109         else if(ec) {
    110           curl_mfprintf(stderr, "curl_easy_recv() failed, with code %d (%s)\n",
    111                         (int)ec, curl_easy_strerror(ec));
    112           res = ec;
    113           goto test_cleanup;
    114         }
    115         if(len > 0)
    116           pos += len;
    117       }
    118       if(len <= 0)
    119         sock = CURL_SOCKET_BAD;
    120     }
    121   }
    122 
    123   if(state) {
    124     fwrite(testbuf, pos, 1, stdout);
    125     putchar('\n');
    126   }
    127 
    128   curl_multi_remove_handle(mcurl, curl);
    129 test_cleanup:
    130   curl_easy_cleanup(curl);
    131   curl_multi_cleanup(mcurl);
    132 
    133   curl_global_cleanup();
    134   return res;
    135 }