File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / lib / pingpong.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:15 2020 UTC (5 years ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    1: #ifndef HEADER_CURL_PINGPONG_H
    2: #define HEADER_CURL_PINGPONG_H
    3: /***************************************************************************
    4:  *                                  _   _ ____  _
    5:  *  Project                     ___| | | |  _ \| |
    6:  *                             / __| | | | |_) | |
    7:  *                            | (__| |_| |  _ <| |___
    8:  *                             \___|\___/|_| \_\_____|
    9:  *
   10:  * Copyright (C) 1998 - 2019, Daniel Stenberg, <daniel@haxx.se>, et al.
   11:  *
   12:  * This software is licensed as described in the file COPYING, which
   13:  * you should have received as part of this distribution. The terms
   14:  * are also available at https://curl.haxx.se/docs/copyright.html.
   15:  *
   16:  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
   17:  * copies of the Software, and permit persons to whom the Software is
   18:  * furnished to do so, under the terms of the COPYING file.
   19:  *
   20:  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
   21:  * KIND, either express or implied.
   22:  *
   23:  ***************************************************************************/
   24: 
   25: #include "curl_setup.h"
   26: 
   27: #if !defined(CURL_DISABLE_IMAP) || !defined(CURL_DISABLE_FTP) || \
   28:   !defined(CURL_DISABLE_POP3) || !defined(CURL_DISABLE_SMTP)
   29: #define USE_PINGPONG
   30: #endif
   31: 
   32: /* forward-declaration, this is defined in urldata.h */
   33: struct connectdata;
   34: 
   35: typedef enum {
   36:   FTPTRANSFER_BODY, /* yes do transfer a body */
   37:   FTPTRANSFER_INFO, /* do still go through to get info/headers */
   38:   FTPTRANSFER_NONE, /* don't get anything and don't get info */
   39:   FTPTRANSFER_LAST  /* end of list marker, never used */
   40: } curl_pp_transfer;
   41: 
   42: /*
   43:  * 'pingpong' is the generic struct used for protocols doing server<->client
   44:  * conversations in a back-and-forth style such as FTP, IMAP, POP3, SMTP etc.
   45:  *
   46:  * It holds response cache and non-blocking sending data.
   47:  */
   48: struct pingpong {
   49:   char *cache;     /* data cache between getresponse()-calls */
   50:   size_t cache_size;  /* size of cache in bytes */
   51:   size_t nread_resp;  /* number of bytes currently read of a server response */
   52:   char *linestart_resp; /* line start pointer for the server response
   53:                            reader function */
   54:   bool pending_resp;  /* set TRUE when a server response is pending or in
   55:                          progress, and is cleared once the last response is
   56:                          read */
   57:   char *sendthis; /* allocated pointer to a buffer that is to be sent to the
   58:                      server */
   59:   size_t sendleft; /* number of bytes left to send from the sendthis buffer */
   60:   size_t sendsize; /* total size of the sendthis buffer */
   61:   struct curltime response; /* set to Curl_now() when a command has been sent
   62:                                off, used to time-out response reading */
   63:   long response_time; /* When no timeout is given, this is the amount of
   64:                          milliseconds we await for a server response. */
   65: 
   66:   struct connectdata *conn; /* points to the connectdata struct that this
   67:                                belongs to */
   68: 
   69:   /* Function pointers the protocols MUST implement and provide for the
   70:      pingpong layer to function */
   71: 
   72:   CURLcode (*statemach_act)(struct connectdata *conn);
   73: 
   74:   bool (*endofresp)(struct connectdata *conn, char *ptr, size_t len,
   75:                     int *code);
   76: };
   77: 
   78: /*
   79:  * Curl_pp_statemach()
   80:  *
   81:  * called repeatedly until done. Set 'wait' to make it wait a while on the
   82:  * socket if there's no traffic.
   83:  */
   84: CURLcode Curl_pp_statemach(struct pingpong *pp, bool block,
   85:                            bool disconnecting);
   86: 
   87: /* initialize stuff to prepare for reading a fresh new response */
   88: void Curl_pp_init(struct pingpong *pp);
   89: 
   90: /* Returns timeout in ms. 0 or negative number means the timeout has already
   91:    triggered */
   92: time_t Curl_pp_state_timeout(struct pingpong *pp, bool disconnecting);
   93: 
   94: 
   95: /***********************************************************************
   96:  *
   97:  * Curl_pp_sendf()
   98:  *
   99:  * Send the formatted string as a command to a pingpong server. Note that
  100:  * the string should not have any CRLF appended, as this function will
  101:  * append the necessary things itself.
  102:  *
  103:  * made to never block
  104:  */
  105: CURLcode Curl_pp_sendf(struct pingpong *pp,
  106:                        const char *fmt, ...);
  107: 
  108: /***********************************************************************
  109:  *
  110:  * Curl_pp_vsendf()
  111:  *
  112:  * Send the formatted string as a command to a pingpong server. Note that
  113:  * the string should not have any CRLF appended, as this function will
  114:  * append the necessary things itself.
  115:  *
  116:  * made to never block
  117:  */
  118: CURLcode Curl_pp_vsendf(struct pingpong *pp,
  119:                         const char *fmt,
  120:                         va_list args);
  121: 
  122: /*
  123:  * Curl_pp_readresp()
  124:  *
  125:  * Reads a piece of a server response.
  126:  */
  127: CURLcode Curl_pp_readresp(curl_socket_t sockfd,
  128:                           struct pingpong *pp,
  129:                           int *code, /* return the server code if done */
  130:                           size_t *size); /* size of the response */
  131: 
  132: 
  133: CURLcode Curl_pp_flushsend(struct pingpong *pp);
  134: 
  135: /* call this when a pingpong connection is disconnected */
  136: CURLcode Curl_pp_disconnect(struct pingpong *pp);
  137: 
  138: int Curl_pp_getsock(struct pingpong *pp, curl_socket_t *socks);
  139: 
  140: 
  141: /***********************************************************************
  142:  *
  143:  * Curl_pp_moredata()
  144:  *
  145:  * Returns whether there are still more data in the cache and so a call
  146:  * to Curl_pp_readresp() will not block.
  147:  */
  148: bool Curl_pp_moredata(struct pingpong *pp);
  149: 
  150: #endif /* HEADER_CURL_PINGPONG_H */

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>