Subject: windows: support to bind to a specific IPv6 address
[platform/upstream/libwebsockets.git] / lib / private-libwebsockets.h
index 21fccdc..dcee160 100644 (file)
@@ -574,12 +574,75 @@ enum connection_mode {
        LWSCM_WSCL_WAITING_SERVER_REPLY,
        LWSCM_WSCL_WAITING_EXTENSION_CONNECT,
        LWSCM_WSCL_PENDING_CANDIDATE_CHILD,
+       LWSCM_WSCL_WAITING_SOCKS_GREETING_REPLY,
+       LWSCM_WSCL_WAITING_SOCKS_CONNECT_REPLY,
+       LWSCM_WSCL_WAITING_SOCKS_AUTH_REPLY,
 
        /****** add new things just above ---^ ******/
 
 
 };
 
+/* enums of socks version */
+enum socks_version {
+       SOCKS_VERSION_4 = 4,
+       SOCKS_VERSION_5 = 5
+};
+
+/* enums of subnegotiation version */
+enum socks_subnegotiation_version {
+       SOCKS_SUBNEGOTIATION_VERSION_1 = 1,
+};
+
+/* enums of socks commands */
+enum socks_command {
+       SOCKS_COMMAND_CONNECT = 1,
+       SOCKS_COMMAND_BIND = 2,
+       SOCKS_COMMAND_UDP_ASSOCIATE = 3
+};
+
+/* enums of socks address type */
+enum socks_atyp {
+       SOCKS_ATYP_IPV4 = 1,
+       SOCKS_ATYP_DOMAINNAME = 3,
+       SOCKS_ATYP_IPV6 = 4
+};
+
+/* enums of socks authentication methods */
+enum socks_auth_method {
+       SOCKS_AUTH_NO_AUTH = 0,
+       SOCKS_AUTH_GSSAPI = 1,
+       SOCKS_AUTH_USERNAME_PASSWORD = 2
+};
+
+/* enums of subnegotiation status */
+enum socks_subnegotiation_status {
+       SOCKS_SUBNEGOTIATION_STATUS_SUCCESS = 0,
+};
+
+/* enums of socks request reply */
+enum socks_request_reply {
+       SOCKS_REQUEST_REPLY_SUCCESS = 0,
+       SOCKS_REQUEST_REPLY_FAILURE_GENERAL = 1,
+       SOCKS_REQUEST_REPLY_CONNECTION_NOT_ALLOWED = 2,
+       SOCKS_REQUEST_REPLY_NETWORK_UNREACHABLE = 3,
+       SOCKS_REQUEST_REPLY_HOST_UNREACHABLE = 4,
+       SOCKS_REQUEST_REPLY_CONNECTION_REFUSED = 5,
+       SOCKS_REQUEST_REPLY_TTL_EXPIRED = 6,
+       SOCKS_REQUEST_REPLY_COMMAND_NOT_SUPPORTED = 7,
+       SOCKS_REQUEST_REPLY_ATYP_NOT_SUPPORTED = 8
+};
+
+/* enums used to generate socks messages */
+enum socks_msg_type {
+       /* greeting */
+       SOCKS_MSG_GREETING,
+       /* credential, user name and password */
+       SOCKS_MSG_USERNAME_PASSWORD,
+       /* connect command */
+       SOCKS_MSG_CONNECT
+};
+
 enum {
        LWS_RXFLOW_ALLOW = (1 << 0),
        LWS_RXFLOW_PENDING_CHANGE = (1 << 1),
@@ -774,6 +837,11 @@ struct lws_vhost {
 #if !defined(LWS_WITH_ESP8266)
        char http_proxy_address[128];
        char proxy_basic_auth_token[128];
+#if defined(LWS_WITH_SOCKS5)
+       char socks_proxy_address[128];
+       char socks_user[96];
+       char socks_password[96];
+#endif
 #endif
 #if defined(LWS_WITH_ESP8266)
        /* listen sockets need a place to hang their hat */
@@ -801,6 +869,9 @@ struct lws_vhost {
 
        int listen_port;
        unsigned int http_proxy_port;
+#if defined(LWS_WITH_SOCKS5)
+       unsigned int socks_proxy_port;
+#endif
        unsigned int options;
        int count_protocols;
        int ka_time;
@@ -919,7 +990,7 @@ struct lws_context {
        unsigned int being_destroyed1:1;
        unsigned int requested_kill:1;
        unsigned int protocol_init_done:1;
-
+       unsigned int ssl_gate_accepts:1;
        /*
         * set to the Thread ID that's doing the service loop just before entry
         * to poll indicates service thread likely idling in poll()
@@ -1371,18 +1442,36 @@ struct _lws_websocket_related {
 
 #ifdef LWS_WITH_CGI
 
+enum {
+       SIGNIFICANT_HDR_CONTENT_LENGTH,
+       SIGNIFICANT_HDR_LOCATION,
+       SIGNIFICANT_HDR_STATUS,
+       SIGNIFICANT_HDR_TRANSFER_ENCODING,
+
+       SIGNIFICANT_HDR_COUNT
+};
+
 /* wsi who is master of the cgi points to an lws_cgi */
 
 struct lws_cgi {
        struct lws_cgi *cgi_list;
        struct lws *stdwsi[3]; /* points to the associated stdin/out/err wsis */
        struct lws *wsi; /* owner */
+       unsigned char *headers_buf;
+       unsigned char *headers_pos;
+       unsigned char *headers_dumped;
+       unsigned char *headers_end;
        unsigned long content_length;
        unsigned long content_length_seen;
        int pipe_fds[3][2];
+       int match[SIGNIFICANT_HDR_COUNT];
        int pid;
+       int response_code;
+       int lp;
+       char l[12];
 
        unsigned int being_closed:1;
+       unsigned int explicitly_chunked:1;
 
        unsigned char chunked_grace;
 };
@@ -1473,6 +1562,7 @@ struct lws {
        struct lws *pending_read_list_prev, *pending_read_list_next;
 #if defined(LWS_WITH_STATS)
        uint64_t accept_start_us;
+       char seen_rx;
 #endif
 #endif
 #ifdef LWS_WITH_HTTP_PROXY
@@ -1584,6 +1674,11 @@ LWS_EXTERN int
 lws_socket_bind(struct lws_vhost *vhost, lws_sockfd_type sockfd, int port,
                const char *iface);
 
+#if defined(LWS_USE_IPV6)
+LWS_EXTERN unsigned long
+lws_get_addr_scope(const char *ipaddr);
+#endif
+
 LWS_EXTERN void
 lws_close_free_wsi(struct lws *wsi, enum lws_close_status);
 
@@ -2073,11 +2168,16 @@ LWS_EXTERN unsigned long long
 time_in_microseconds(void);
 LWS_EXTERN const char * LWS_WARN_UNUSED_RESULT
 lws_plat_inet_ntop(int af, const void *src, char *dst, int cnt);
+LWS_EXTERN int LWS_WARN_UNUSED_RESULT
+lws_plat_inet_pton(int af, const char *src, void *dst);
 
 LWS_EXTERN int LWS_WARN_UNUSED_RESULT
 lws_check_utf8(unsigned char *state, unsigned char *buf, size_t len);
 LWS_EXTERN int alloc_file(struct lws_context *context, const char *filename, uint8_t **buf,
                                lws_filepos_t *amount);
+LWS_EXTERN int alloc_pem_to_der_file(struct lws_context *context, const char *filename, uint8_t **buf,
+              lws_filepos_t *amount);
+
 LWS_EXTERN void
 lws_same_vh_protocol_remove(struct lws *wsi);
 LWS_EXTERN void
@@ -2099,6 +2199,10 @@ static inline uint64_t lws_stats_atomic_max(struct lws_context * context,
        (void)context; (void)pt; (void)index; (void)val; return 0; }
 #endif
 
+/* socks */
+void socks_generate_msg(struct lws *wsi, enum socks_msg_type type,
+                       size_t *msg_len);
+
 #ifdef __cplusplus
 };
 #endif