static ngx_int_t ngx_tcp_cmd_tran_handler(ngx_tcp_ctx_t *ctx, const u_char *pkg, int pkg_len) { ngx_tcp_cmd_pkghead_t *pkghead; ngx_tcp_cmd_pkgtran_t *pkgtran; uint32_t pkg_size; ngx_tcp_cmd_session_t *s; ngx_connection_t *c; ngx_tcp_cmd_session_t *dest_s; ngx_tcp_core_main_conf_t *cmcf; socketfd_info_t *socketfd_info; s = ctx->ngx_tcp_session; c = s->parent.connection; if (ngx_rstrncmp((u_char *)"unix:", c->addr_text.data, sizeof("unix:") - 1) != 0) { ngx_log_error(NGX_LOG_ERR, c->log, 0, "ngx_tcp_cmd_tran_handler|cli=%V\n", &c->addr_text); return NGX_OK; } cmcf = ngx_tcp_get_module_main_conf(((ngx_tcp_session_t *)s), ngx_tcp_core_module); pkghead = (ngx_tcp_cmd_pkghead_t *)(pkg); pkgtran = (ngx_tcp_cmd_pkgtran_t *)(pkghead + 1); pkg_size = pkgtran->data_size; socketfd_info = cmcf->socketfd_shm->info->socketfd_info + pkgtran->dest_fd; dest_s = (ngx_tcp_cmd_session_t *)(socketfd_info->tag); if (dest_s == NULL) { ngx_log_error(NGX_LOG_ERR, s->parent.connection->log, 0, "ngx_tcp_cmd_tran_handler|dest_s=NULL|dest_fd=%d|dest_pid=%d\n", pkgtran->dest_fd, pkgtran->dest_pid); return NGX_OK; } if (dest_s->parent.connection == NULL || pkgtran->dest_fd <= 2) { ngx_log_error(NGX_LOG_ERR, s->parent.connection->log, 0, "ngx_tcp_cmd_tran_handler|dest_c=%p|dest_fd=%d\n", dest_s->parent.connection, pkgtran->dest_fd); return NGX_OK; } if (ngx_pid != pkgtran->dest_pid || ngx_process_slot != socketfd_info->listening_unix_info_i || pkgtran->dest_fd != dest_s->parent.connection->fd) { ngx_log_error(NGX_LOG_ERR, s->parent.connection->log, 0, "ngx_tcp_cmd_tran_handler|conn fd=%d|dest_fd=%d" "|ngx_process_slot=%d|listening_unix_info_i=%d" "|dest_pid=%d|ngx_pid=%d\n", dest_s->parent.connection->fd, pkgtran->dest_fd, ngx_process_slot, socketfd_info->listening_unix_info_i, pkgtran->dest_pid, ngx_pid); return NGX_OK; } ngx_tcp_send_data(&dest_s->parent.tcp_ctx, pkgtran->data, pkg_size); return NGX_OK; }
long ngx_tcp_send_cmdpkg(ngx_tcp_ctx_t *ctx, u_char *data, int len) { ngx_tcp_session_t *s; s = (ngx_tcp_session_t *)ctx->ngx_tcp_session; if (NGX_OK != ngx_tcp_do_cmdpkg_filter(s, &sendpkg_filters, &data, &len)) { return NGX_ERROR; } return ngx_tcp_send_data(ctx, data, len); }