// Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef OPENSSL_HEADER_CRYPTO_BIO_INTERNAL_H
#define OPENSSL_HEADER_CRYPTO_BIO_INTERNAL_H

#include <openssl/bio.h>

#include <openssl/ex_data.h>

#include "../internal.h"
#include "../mem_internal.h"

#if !defined(OPENSSL_NO_SOCK)
#if !defined(OPENSSL_WINDOWS)
#if defined(OPENSSL_PNACL)
// newlib uses u_short in socket.h without defining it.
typedef unsigned short u_short;
#endif
#include <sys/socket.h>
#include <sys/types.h>
#else
#include <winsock2.h>
typedef int socklen_t;
#endif
#endif  // !OPENSSL_NO_SOCK


DECLARE_OPAQUE_STRUCT(bio_st, Bio)

struct bio_method_st {
  int type;
  const char *name;
  int (*bwrite)(BIO *, const char *, int);
  int (*bwrite_ex)(BIO *, const char *, size_t, size_t *);
  int (*bread)(BIO *, char *, int);
  int (*bgets)(BIO *, char *, int);
  long (*ctrl)(BIO *, int, long, void *);
  int (*create)(BIO *);
  int (*destroy)(BIO *);
  long (*callback_ctrl)(BIO *, int, BIO_info_cb *);
};

BSSL_NAMESPACE_BEGIN

class Bio : public bio_st, public RefCounted<Bio> {
 public:
  explicit Bio(const BIO_METHOD *m);

  const BIO_METHOD *method;
  CRYPTO_EX_DATA ex_data;

  // TODO(crbug.com/412269080): `init` and `shutdown` could be bitfields, or
  // integrated into `flags`, to save memory.

  // init is non-zero if this `BIO` has been initialised.
  int init = 0;
  // shutdown is often used by specific `BIO_METHOD`s to determine whether
  // they own some underlying resource. This flag can often be controlled by
  // `BIO_set_close`. For example, whether an fd BIO closes the underlying fd
  // when it, itself, is closed.
  int shutdown = 1;
  int flags = 0;
  int retry_reason = 0;
  // num is a BIO-specific value. For example, in fd BIOs it's used to store a
  // file descriptor.
  int num = 0;
  void *ptr = nullptr;
  // next_bio points to the next `BIO` in a chain. This `BIO` owns a reference
  // to `next_bio`.
  Bio *next_bio = nullptr;  // used by filter BIOs
  uint64_t num_read = 0, num_write = 0;

 private:
  friend RefCounted;
  ~Bio();
};

#if !defined(OPENSSL_NO_SOCK)

// bio_ip_and_port_to_socket_and_addr creates a socket and fills in `*out_addr`
// and `*out_addr_length` with the correct values for connecting to `hostname`
// on `port_str`. It returns one on success or zero on error.
int bio_ip_and_port_to_socket_and_addr(int *out_sock,
                                       struct sockaddr_storage *out_addr,
                                       socklen_t *out_addr_length,
                                       const char *hostname,
                                       const char *port_str);

// bio_socket_nbio sets whether `sock` is non-blocking. It returns one on
// success and zero otherwise.
int bio_socket_nbio(int sock, int on);

// bio_clear_socket_error clears the last system socket error.
//
// TODO(fork): remove all callers of this.
void bio_clear_socket_error();

// bio_socket_finish_connect attempts to complete an in-progress, non-blocking
// connect operation on `sock`. It returns one if the connect operation
// succeeded. Otherwise, it returns zero and sets the last socket error to the
// reason it failed.
int bio_socket_finish_connect(int sock);

// bio_socket_should_retry returns non-zero if `return_value` indicates an error
// and the last socket error indicates that it's non-fatal.
int bio_socket_should_retry(int return_value);

#endif  // !OPENSSL_NO_SOCK

// bio_errno_should_retry returns non-zero if `return_value` indicates an error
// and `errno` indicates that it's non-fatal.
int bio_errno_should_retry(int return_value);

BSSL_NAMESPACE_END


#endif  // OPENSSL_HEADER_CRYPTO_BIO_INTERNAL_H
