Server IP : 127.0.0.2 / Your IP : 3.16.50.164 Web Server : Apache/2.4.18 (Ubuntu) System : User : www-data ( ) PHP Version : 7.0.33-0ubuntu0.16.04.16 Disable Function : disk_free_space,disk_total_space,diskfreespace,dl,exec,fpaththru,getmyuid,getmypid,highlight_file,ignore_user_abord,leak,listen,link,opcache_get_configuration,opcache_get_status,passthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,php_uname,phpinfo,posix_ctermid,posix_getcwd,posix_getegid,posix_geteuid,posix_getgid,posix_getgrgid,posix_getgrnam,posix_getgroups,posix_getlogin,posix_getpgid,posix_getpgrp,posix_getpid,posix,_getppid,posix_getpwnam,posix_getpwuid,posix_getrlimit,posix_getsid,posix_getuid,posix_isatty,posix_kill,posix_mkfifo,posix_setegid,posix_seteuid,posix_setgid,posix_setpgid,posix_setsid,posix_setuid,posix_times,posix_ttyname,posix_uname,pclose,popen,proc_open,proc_close,proc_get_status,proc_nice,proc_terminate,shell_exec,source,show_source,system,virtual MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /usr/include/nodejs/src/ |
Upload File : |
#ifndef SRC_NODE_CRYPTO_BIO_H_ #define SRC_NODE_CRYPTO_BIO_H_ #include "openssl/bio.h" #include "env.h" #include "env-inl.h" #include "util.h" #include "util-inl.h" #include "v8.h" namespace node { class NodeBIO { public: NodeBIO() : env_(nullptr), initial_(kInitialBufferLength), length_(0), read_head_(nullptr), write_head_(nullptr) { } ~NodeBIO(); static BIO* New(); void AssignEnvironment(Environment* env); // Move read head to next buffer if needed void TryMoveReadHead(); // Allocate new buffer for write if needed void TryAllocateForWrite(size_t hint); // Read `len` bytes maximum into `out`, return actual number of read bytes size_t Read(char* out, size_t size); // Memory optimization: // Deallocate children of write head's child if they're empty void FreeEmpty(); // Return pointer to internal data and amount of // contiguous data available to read char* Peek(size_t* size); // Return pointers and sizes of multiple internal data chunks available for // reading size_t PeekMultiple(char** out, size_t* size, size_t* count); // Find first appearance of `delim` in buffer or `limit` if `delim` // wasn't found. size_t IndexOf(char delim, size_t limit); // Discard all available data void Reset(); // Put `len` bytes from `data` into buffer void Write(const char* data, size_t size); // Return pointer to internal data and amount of // contiguous data available for future writes char* PeekWritable(size_t* size); // Commit reserved data void Commit(size_t size); // Return size of buffer in bytes inline size_t Length() const { return length_; } inline void set_initial(size_t initial) { initial_ = initial; } static inline NodeBIO* FromBIO(BIO* bio) { CHECK_NE(bio->ptr, nullptr); return static_cast<NodeBIO*>(bio->ptr); } private: static int New(BIO* bio); static int Free(BIO* bio); static int Read(BIO* bio, char* out, int len); static int Write(BIO* bio, const char* data, int len); static int Puts(BIO* bio, const char* str); static int Gets(BIO* bio, char* out, int size); static long Ctrl(BIO* bio, int cmd, long num, void* ptr); // Enough to handle the most of the client hellos static const size_t kInitialBufferLength = 1024; static const size_t kThroughputBufferLength = 16384; static const BIO_METHOD method; class Buffer { public: Buffer(Environment* env, size_t len) : env_(env), read_pos_(0), write_pos_(0), len_(len), next_(nullptr) { data_ = new char[len]; if (env_ != nullptr) env_->isolate()->AdjustAmountOfExternalAllocatedMemory(len); } ~Buffer() { delete[] data_; if (env_ != nullptr) { const int64_t len = static_cast<int64_t>(len_); env_->isolate()->AdjustAmountOfExternalAllocatedMemory(-len); } } Environment* env_; size_t read_pos_; size_t write_pos_; size_t len_; Buffer* next_; char* data_; }; Environment* env_; size_t initial_; size_t length_; Buffer* read_head_; Buffer* write_head_; }; } // namespace node #endif // SRC_NODE_CRYPTO_BIO_H_