X-Git-Url: http://git.indexdata.com/?p=yazpp-moved-to-github.git;a=blobdiff_plain;f=src%2Fyaz-pdu-assoc.cpp;h=9af1ab7eeb339810d20ddd10c66f7677b31dc2ac;hp=3ff759f2987dcc86e4328dac4937be3ab4f1363a;hb=711105a336b155f2b7f098cf84f2e30952cb8588;hpb=9fef1c618f2f936041b3b58d61e406182033ab30 diff --git a/src/yaz-pdu-assoc.cpp b/src/yaz-pdu-assoc.cpp index 3ff759f..9af1ab7 100644 --- a/src/yaz-pdu-assoc.cpp +++ b/src/yaz-pdu-assoc.cpp @@ -1,8 +1,11 @@ /* This file is part of the yazpp toolkit. - * Copyright (C) 1998-2009 Index Data and Mike Taylor + * Copyright (C) 1998-2012 Index Data and Mike Taylor * See the file LICENSE for details. */ +#if HAVE_CONFIG_H +#include +#endif #include #include #include @@ -10,6 +13,10 @@ #include +#if HAVE_FCNTL_H +#include +#endif + using namespace yazpp_1; void PDU_Assoc::init(ISocketObservable *socketObservable) @@ -109,7 +116,7 @@ void PDU_Assoc::socketNotify(int event) m_state = Ready; flush_PDU(); } - else + else { // accept still incomplete. yaz_log(m_log, "maskObserver 2"); m_socketObservable->maskObserver(this, @@ -118,7 +125,7 @@ void PDU_Assoc::socketNotify(int event) } break; case Connecting: - if (event & SOCKET_OBSERVE_READ && + if (event & SOCKET_OBSERVE_READ && event & SOCKET_OBSERVE_WRITE) { // For Unix: if both read and write is set, then connect failed. @@ -153,7 +160,7 @@ void PDU_Assoc::socketNotify(int event) { int res; COMSTACK new_line; - + if ((res = cs_listen(m_cs, 0, 0)) == 1) return; if (res < 0) @@ -163,7 +170,7 @@ void PDU_Assoc::socketNotify(int event) } if (!(new_line = cs_accept(m_cs))) return; - /* 1. create socket-manager + /* 1. create socket-manager 2. create pdu-assoc 3. create top-level object setup observer for child fileid in pdu-assoc @@ -213,7 +220,7 @@ void PDU_Assoc::socketNotify(int event) PDU_Queue **pq = &m_queue_in; while (*pq) pq = &(*pq)->m_next; - + *pq = new PDU_Queue(m_input_buf, res); #else m_PDU_Observer->recv_PDU(m_input_buf, res); @@ -325,7 +332,7 @@ PDU_Assoc::PDU_Queue::~PDU_Queue() int PDU_Assoc::flush_PDU() { int r; - + if (m_state != Ready && m_state != Writing) { yaz_log (m_log, "YAZ_PDU_Assoc::flush_PDU, not ready"); @@ -370,7 +377,7 @@ int PDU_Assoc::flush_PDU() yaz_log (m_log, "PDU_Assoc::flush_PDU cs_put %d bytes fd=%d (inc)", q->m_len, cs_fileno(m_cs)); return r; - } + } yaz_log (m_log, "PDU_Assoc::flush_PDU cs_put %d bytes", q->m_len); // whole packet sent... delete this and proceed to next ... m_queue_out = q->m_next; @@ -382,6 +389,8 @@ int PDU_Assoc::flush_PDU() yaz_log(m_log, "maskObserver 8"); m_socketObservable->maskObserver(this, SOCKET_OBSERVE_READ| SOCKET_OBSERVE_EXCEPT); + if (m_session_is_dead) + shutdown(); } return r; } @@ -391,7 +400,7 @@ int PDU_Assoc::send_PDU(const char *buf, int len) yaz_log (m_log, "PDU_Assoc::send_PDU"); PDU_Queue **pq = &m_queue_out; int is_idle = (*pq ? 0 : 1); - + if (!m_cs) { yaz_log (m_log, "PDU_Assoc::send_PDU failed, m_cs == 0"); @@ -415,6 +424,29 @@ COMSTACK PDU_Assoc::comstack(const char *type_and_host, void **vp) int PDU_Assoc::listen(IPDU_Observer *observer, const char *addr) { + if (*addr == '\0') + { + m_socketObservable->deleteObserver(this); + m_state = Closed; + if (m_cs) + { + yaz_log (m_log, "PDU_Assoc::close fd=%d", cs_fileno(m_cs)); + cs_close (m_cs); + } + m_cs = 0; + while (m_queue_out) + { + PDU_Queue *q_this = m_queue_out; + m_queue_out = m_queue_out->m_next; + delete q_this; + } + xfree (m_input_buf); + m_input_buf = 0; + m_input_len = 0; + + return 0; + } + shutdown(); m_PDU_Observer = observer; @@ -425,11 +457,21 @@ int PDU_Assoc::listen(IPDU_Observer *observer, const char *addr) return -1; if (cs_bind(m_cs, ap, CS_SERVER) < 0) return -2; - m_socketObservable->addObserver(cs_fileno(m_cs), this); + + int fd = cs_fileno(m_cs); +#if HAVE_FCNTL_H + int oldflags = fcntl(fd, F_GETFD, 0); + if (oldflags >= 0) + { + oldflags |= FD_CLOEXEC; + fcntl(fd, F_SETFD, oldflags); + } +#endif + m_socketObservable->addObserver(fd, this); yaz_log(m_log, "maskObserver 9"); m_socketObservable->maskObserver(this, SOCKET_OBSERVE_READ| SOCKET_OBSERVE_EXCEPT); - yaz_log (m_log, "PDU_Assoc::listen ok fd=%d", cs_fileno(m_cs)); + yaz_log (m_log, "PDU_Assoc::listen ok fd=%d", fd); m_state = Listen; return 0; } @@ -491,7 +533,7 @@ void PDU_Assoc::childNotify(COMSTACK cs) { PDU_Assoc *new_observable = new PDU_Assoc (m_socketObservable, cs); - + // Clone PDU Observer new_observable->m_PDU_Observer = m_PDU_Observer->sessionNotify (new_observable, cs_fileno(cs)); @@ -516,6 +558,7 @@ const char*PDU_Assoc::getpeername() /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab