/* 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 <config.h>
+#endif
#include <assert.h>
#include <string.h>
#include <yaz/log.h>
#include <yazpp/pdu-assoc.h>
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
using namespace yazpp_1;
void PDU_Assoc::init(ISocketObservable *socketObservable)
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;
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;
}