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;
}
Esempio n. 2
0
ngx_http_cache_t *ngx_http_cache_get(ngx_http_cache_hash_t *hash,
                                     ngx_http_cleanup_t *cleanup,
                                     ngx_str_t *key, uint32_t *crc)
{
    ngx_uint_t         i;
    ngx_http_cache_t  *c;

    *crc = ngx_crc(key->data, key->len);

    c = hash->elts + *crc % hash->hash * hash->nelts;

    if (ngx_mutex_lock(&hash->mutex) == NGX_ERROR) {
        return (void *) NGX_ERROR;
    }

    for (i = 0; i < hash->nelts; i++) {
        if (c[i].crc == *crc
                && c[i].key.len == key->len
                && ngx_rstrncmp(c[i].key.data, key->data, key->len) == 0)
        {
#if 0
            if (c[i].expired) {
                ngx_mutex_unlock(&hash->mutex);
                return (void *) NGX_AGAIN;
            }
#endif

            c[i].refs++;

            if ((!(c[i].notify && (ngx_event_flags & NGX_USE_KQUEUE_EVENT)))
                    && (ngx_cached_time - c[i].updated >= hash->update))
            {
                c[i].expired = 1;
            }

            ngx_mutex_unlock(&hash->mutex);

            if (cleanup) {
                cleanup->data.cache.hash = hash;
                cleanup->data.cache.cache = &c[i];
                cleanup->valid = 1;
                cleanup->cache = 1;
            }

            return &c[i];
        }
    }

    ngx_mutex_unlock(&hash->mutex);

    return NULL;
}
Esempio n. 3
0
//get the index
static ngx_http_dclass_kvdata_str *ngx_http_dclass_index(ngx_http_request_t *r)
{
    ngx_uint_t i;
    u_char *hfield=NULL;
    ngx_uint_t key;
    ngx_str_t str;
    ngx_http_variable_value_t *val;
    const dclass_keyvalue *kvd;
    ngx_list_part_t *part;
    ngx_table_elt_t *header;
    ngx_http_dclass_conf_t  *cf;
    ngx_http_dclass_kvdata_str *kvs;
    
    cf = ngx_http_get_module_loc_conf(r,ngx_http_dclass_module);
    
    if(!cf->enable || !cf->head[0])
        return NULL;
    
    ngx_str_set(&str,"dclass_ptr");
    
    key=ngx_hash_key(str.data,str.len);
    val=ngx_http_get_variable(r, &str, key);
    
    if(val && val->valid && val->data && !ngx_rstrncmp((u_char*)"ptr",val->data,3))
    {
        kvs=(ngx_http_dclass_kvdata_str*)val->data;
        
        ngx_log_error(NGX_HTTP_DCLASS_LOGLEVEL,r->connection->log,0,"dClass: classify cache: '%s'",kvs->kvd[0]->id);
        
        return kvs;
    }
    
    if(!*cf->hfield.data)
    {
        if(r->headers_in.user_agent)
            hfield = r->headers_in.user_agent->value.data;
    }
    else
    {
        part=&r->headers_in.headers.part;
        header=part->elts;
        for (i=0;;i++)
        {
            if(i>=part->nelts)
            {
                if(part->next==NULL)
                    break;
                part=part->next;
                header=part->elts;
                i=0;
            }
            if(!ngx_strcasecmp(cf->hfield.data,header[i].key.data))
            {
                hfield=header[i].value.data;
                break;
            }
        }
    }
    
    if(hfield==NULL)
        return NULL;
    
    kvs=(ngx_http_dclass_kvdata_str*)ngx_pcalloc(r->pool,sizeof(ngx_http_dclass_kvdata_str));
    
    if(kvs==NULL)
        return NULL;
    
    for(i=0;i<NGX_HTTP_DCLASS_INDEXES && cf->head[i];i++)
    {
        kvd=dclass_classify(cf->head[i],(char*)hfield);

        kvs->kvd[i]=kvd;
        ngx_cpystrn(kvs->data,(u_char*)"ptr",4);

        ngx_log_error(NGX_HTTP_DCLASS_LOGLEVEL,r->connection->log,0,"dClass: classify %d: '%s' => '%s'",i,hfield,kvd->id);
    }
    
    return kvs;
}