
/*
 * Copyright (C) Yichun Zhang (agentzh)
 */


#ifndef _NGX_HTTP_LUA_SOCKET_UDP_H_INCLUDED_
#define _NGX_HTTP_LUA_SOCKET_UDP_H_INCLUDED_


#include "ngx_http_lua_common.h"


typedef struct ngx_http_lua_socket_udp_upstream_s
    ngx_http_lua_socket_udp_upstream_t;


typedef
    int (*ngx_http_lua_socket_udp_retval_handler)(ngx_http_request_t *r,
        ngx_http_lua_socket_udp_upstream_t *u, lua_State *L);


typedef void (*ngx_http_lua_socket_udp_upstream_handler_pt)
    (ngx_http_request_t *r, ngx_http_lua_socket_udp_upstream_t *u);


typedef struct {
    ngx_connection_t         *connection;
    struct sockaddr          *sockaddr;
    socklen_t                 socklen;
    ngx_str_t                 server;
    ngx_log_t                 log;
} ngx_http_lua_udp_connection_t;


struct ngx_http_lua_socket_udp_upstream_s {
    ngx_http_lua_socket_udp_retval_handler          prepare_retvals;
    ngx_http_lua_socket_udp_upstream_handler_pt     read_event_handler;

    ngx_http_lua_loc_conf_t         *conf;
    ngx_http_cleanup_pt             *cleanup;
    ngx_http_request_t              *request;
    ngx_http_lua_udp_connection_t    udp_connection;

    ngx_addr_t                      *local;

    ngx_msec_t                       read_timeout;

    ngx_http_upstream_resolved_t    *resolved;

    ngx_str_t                        host;
    in_port_t                        port;
    ngx_uint_t                       ft_type;
    ngx_err_t                        socket_errno;
    size_t                           received; /* for receive */
    size_t                           recv_buf_size;

    ngx_http_lua_co_ctx_t           *co_ctx;

    unsigned                         waiting:1; /* :1 */
};


void ngx_http_lua_inject_socket_udp_api(ngx_log_t *log, lua_State *L);


#endif /* _NGX_HTTP_LUA_SOCKET_UDP_H_INCLUDED_ */

/* vi:set ft=c ts=4 sw=4 et fdm=marker: */
