blob: 251cee4796fab9b3af31c12844f8edaf88065fe6 [file] [log] [blame]
/* $Id$
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to you under the Apache License, Version
* 2.0 (the "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/*
* etch_conxevent.c
* event handler overrides for the various connection superclasses
*/
#include "etch_thread.h"
#include "etch_tcp_connection.h"
#include "etch_tcp_server.h"
#include "etch_objecttypes.h"
#include "etch_log.h"
static const char* LOG_CATEGORY = "etch_connection_event";
/*
* etch_deftcplistener_on_event()
* default handler for listener events
*/
int etch_deftcplistener_on_event(etch_tcp_server* l, etch_tcp_connection* c, const int e, int p1, void* p2)
{
char cxstr[24], *smask = "server %u";
if (c)
{ c->cx.listener = (etch_object*) l;
return c->cx.on_event(c, e, p1, p2);
}
apr_snprintf(cxstr, sizeof(cxstr), smask, l->listener_id);
switch(e)
{
case ETCH_CONXEVT_CREATED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s created\n", cxstr);
break;
case ETCH_CONXEVT_CREATERR:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s not created\n", cxstr);
break;
case ETCH_CONXEVT_OPENING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s opening ...\n", cxstr);
break;
case ETCH_CONXEVT_DESTROYING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s destroying ...\n", cxstr);
break;
case ETCH_CONXEVT_DESTROYED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s destroyed\n", cxstr);
break;
case ETCH_CONXEVT_SHUTDOWN:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_WARN, "%s shutdown request detected\n", cxstr);
break;
}
return 0;
}
/*
* etch_tcpconx_on_event()
* default handler for connection events
*/
int etch_tcpconx_on_event(void* data, const int e, int p1, void* p2)
{
etch_tcp_connection* c = (etch_tcp_connection*)data;
int result = 0, lid = 0;
char cxstr[32], estr[128];
char *scmask = "server %u connxn %u", *cmask = "connxn %u";
if (is_etch_tcpserver(c->cx.listener))
lid = ((etch_tcp_server*)(c->cx.listener))->listener_id;
if (lid)
sprintf(cxstr, scmask, lid, c->cx.conxid);
else sprintf(cxstr, cmask, c->cx.conxid);
switch(e)
{
case ETCH_CONXEVT_RECEIVING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_XDEBUG, "%s begin receive (block) ...\n", cxstr);
break;
case ETCH_CONXEVT_RECEIVERR:
apr_strerror(p1, estr, 128);
if(IS_ETCH_SOCKET_TIMEOUT(p1))
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s socket receive timed out\n", cxstr);
else
if(p1 == APR_OTHER_END_CLOSED)
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_WARN,"%s connection was broken\n", cxstr);
else
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s apr_socket_recv() %s\n", cxstr, estr);
break;
case ETCH_CONXEVT_RECEIVED: /* "eod=%d", p1 */
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s end receive %d bytes\n", cxstr, (int)(size_t)p2);
break;
case ETCH_CONXEVT_CONXCLOSED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s local connection closed\n", cxstr);
break;
case ETCH_CONXEVT_PEERCLOSED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s peer connection closed\n", cxstr);
break;
case ETCH_CONXEVT_RECEIVEND:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_XDEBUG, "%s exit receive loop\n", cxstr, p1);
break;
case ETCH_CONXEVT_SENDING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_XDEBUG, "%s begin send\n", cxstr);
break;
case ETCH_CONXEVT_SENDERR:
apr_strerror(p1, estr, 128);
if(IS_ETCH_SOCKET_TIMEOUT(p1))
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s socket send timed out\n", cxstr);
else
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s apr_socket_send() %s\n", cxstr, estr);
break;
case ETCH_CONXEVT_SENDEND:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s end send %d bytes\n", cxstr, p1);
break;
case ETCH_CONXEVT_RCVPUMP_START:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s start receive pump\n", cxstr, p1);
break;
case ETCH_CONXEVT_RCVPUMP_RECEIVING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s thread %d receiving ...\n", cxstr, p1);
break;
case ETCH_CONXEVT_RCVPUMP_ERR:
result = -1;
if(p1 == APR_OTHER_END_CLOSED)
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_WARN, "%s connection was broken\n", cxstr);
else
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s receive failed\n", cxstr);
break;
case ETCH_CONXEVT_RCVPUMP_STOP:
result = p1;
if (result >= 0)
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s receive pump on thread %d exited\n", cxstr, (int) (size_t) p2);
else
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s receive pump abnormal exit\n", cxstr);
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s destroying accepted connection\n", cxstr);
break;
case ETCH_CONXEVT_ACCEPTING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s accepting ...\n", cxstr);
break;
case ETCH_CONXEVT_ACCEPTERR:
result = -1;
apr_strerror((apr_status_t)(size_t)p2, estr, 128);
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s apr_socket_accept() %s\n", cxstr, estr);
break;
case ETCH_CONXEVT_ACCEPTED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s accepted\n", cxstr);
break;
case ETCH_CONXEVT_CREATED:
if(p1)
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s created for socket %x\n", cxstr, p1);
else
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s created\n", cxstr);
break;
case ETCH_CONXEVT_CREATERR:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s not created\n", cxstr);
break;
case ETCH_CONXEVT_OPENING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s opening ...\n", cxstr);
break;
case ETCH_CONXEVT_OPENERR:
result = -1;
switch(p1)
{
case 0:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s not opened\n", cxstr);
break;
case 2:
apr_strerror((apr_status_t)(size_t)p2, estr, 128);
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_WARN, "%s socket connect: %s\n", cxstr, estr);
break;
case 3:
apr_strerror((apr_status_t)(size_t)p2, estr, 128);
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR,
"%s socket create: %s\n", cxstr, estr);
break;
case 4:
apr_strerror((apr_status_t)(size_t)p2, estr, 128);
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR,
"%s sockaddr info: %s\n", cxstr, estr);
break;
case 5:
apr_strerror((apr_status_t)(size_t)p2, estr, 128);
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR,
"%s socket bind: %s\n", cxstr, estr);
break;
case 6:
apr_strerror((apr_status_t)(size_t)p2, estr, 128);
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s socket listen: %s\n", cxstr, estr);
break;
}
break;
case ETCH_CONXEVT_OPENED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s opened\n", cxstr);
break;
case ETCH_CONXEVT_STARTING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s starting ...\n", cxstr);
break;
case ETCH_CONXEVT_STARTERR:
result = -1;
switch(p1)
{
case 0:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s not started\n", cxstr);
break;
case 1:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s etch_threadpool.run()\n", cxstr);
break;
}
break;
case ETCH_CONXEVT_STARTED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s started\n", cxstr);
break;
case ETCH_CONXEVT_ACCEPTPUMPEXIT:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s accept pump on thread %d exited\n", cxstr, p1);
break;
case ETCH_CONXEVT_ACCEPTPUMPEXITERR:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s accept pump abnormal exit\n", cxstr);
break;
case ETCH_CONXEVT_LISTENED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s server id is %d\n", cxstr, p1);
break;
case ETCH_CONXEVT_UP:
case ETCH_CONXEVT_DOWN:
break;
case ETCH_CONXEVT_SOCKOPTERR:
result = 1; /* to increment counter */
apr_strerror(p1, estr, 128);
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s set socket option %s: %s\n", cxstr, p2, estr);
break;
case ETCH_CONXEVT_SHUTDOWN:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_WARN, "%s shutdown request detected\n", cxstr);
break;
case ETCH_CONXEVT_STOPPING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s stopping ...\n", cxstr);
break;
case ETCH_CONXEVT_STOPERR:
result = -1;
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s not stopped\n", cxstr);
break;
case ETCH_CONXEVT_STOPPED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s stopped\n", cxstr);
break;
case ETCH_CONXEVT_CLOSING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s closing ...\n", cxstr);
break;
case ETCH_CONXEVT_CLOSERR:
result = -1;
switch(p1)
{
case 0:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s not closed\n", cxstr);
break;
case 1:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s close when not open\n", cxstr);
break;
case 2:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR, "%s concurrent close denied\n", cxstr);
break;
case 3:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_ERROR,
"%s apr_socket_close() error %d\n", cxstr, (int)(size_t)p2);
break;
}
break;
case ETCH_CONXEVT_CLOSED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s closed\n", cxstr);
break;
case ETCH_CONXEVT_DESTROYING:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s destroying ...\n", cxstr);
break;
case ETCH_CONXEVT_DESTROYED:
ETCH_LOG(LOG_CATEGORY, ETCH_LOG_DEBUG, "%s destroyed\n", cxstr);
break;
}
return result;
}