1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148
|
/* -*- C++ -*- */
// $Id: Handle_L_Stream.inl 81978 2008-06-16 16:57:12Z sowayaa $
#include "ace/Get_Opt.h"
#include "ace/OS_NS_stdio.h"
#include "ace/OS_NS_string.h"
#include "ace/OS_NS_time.h"
#include "ace/OS_NS_unistd.h"
ACE_INLINE
Handle_L_Stream::~Handle_L_Stream (void)
{
}
ACE_INLINE
Handle_L_Stream::Handle_L_Stream (void)
{
if (Handle_L_Stream::login_name == 0)
Handle_L_Stream::login_name = ACE_OS::cuserid (Handle_L_Stream::login);
}
ACE_INLINE int
Handle_L_Stream::open (const ACE_UNIX_Addr &suas,
int async)
{
if (this->ACE_LSOCK_Acceptor::open (suas) == -1)
return -1;
else if (async && this->ACE_LSOCK_Acceptor::enable (ACE_SIGIO) == -1)
return -1;
else
return 0;
}
ACE_INLINE int
Handle_L_Stream::info (ACE_TCHAR **strp, size_t length) const
{
ACE_TCHAR buf[BUFSIZ];
ACE_UNIX_Addr sa;
if (this->get_local_addr (sa) == -1)
return -1;
ACE_OS::strcpy (buf, ACE_TEXT_CHAR_TO_TCHAR (sa.get_path_name ()));
ACE_OS::strcat (buf, ACE_TEXT (" # tests local ACE_Stream\n"));
if (*strp == 0 && (*strp = ACE_OS::strdup (buf)) == 0)
return -1;
else
ACE_OS::strncpy (*strp, buf, length);
return ACE_OS::strlen (buf);
}
ACE_INLINE int
Handle_L_Stream::init (int argc, ACE_TCHAR *argv[])
{
ACE_UNIX_Addr sus;
const ACE_TCHAR *r = Handle_L_Stream::DEFAULT_RENDEZVOUS;
ACE_Get_Opt get_opt (argc, argv, ACE_TEXT ("r:"), 0);
for (int c; (c = get_opt ()) != -1; )
switch (c)
{
case 'r':
r = get_opt.opt_arg ();
break;
default:
break;
}
ACE_OS::strncpy (this->rendezvous, r, MAXPATHLEN);
ACE_OS::unlink (this->rendezvous);
sus.set (this->rendezvous);
if (this->open (sus) == -1)
ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"), ACE_TEXT ("open")), -1);
else if (ACE_Reactor::instance ()->register_handler (this, ACE_Event_Handler::ACCEPT_MASK) == -1)
ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT ("%p\n"),
ACE_TEXT ("registering service with ACE_Reactor")), -1);
return 0;
}
ACE_INLINE int
Handle_L_Stream::fini (void)
{
return ACE_Reactor::instance ()->remove_handler
(this, ACE_Event_Handler::ACCEPT_MASK);
}
ACE_INLINE ACE_HANDLE
Handle_L_Stream::get_handle (void) const
{
return ACE_LSOCK_Acceptor::get_handle ();
}
ACE_INLINE int
Handle_L_Stream::handle_input (ACE_HANDLE)
{
ACE_LSOCK_Stream new_local_stream;
ACE_UNIX_Addr sa;
ACE_HANDLE handle = ACE_INVALID_HANDLE;
char buf[BUFSIZ];
if (this->accept (new_local_stream, &sa) == -1)
return -1;
else if (new_local_stream.recv_handle (handle) == -1)
return -1;
else
ACE_DEBUG ((LM_INFO,
ACE_TEXT ("received file descriptor %d on ACE_Stream %s\n"),
handle, sa.get_path_name ()));
ACE_OS::puts ("----------------------------------------");
for (;;)
{
ssize_t n = ACE_OS::read (handle, buf, sizeof buf);
if (n <= 0)
break;
ACE_OS::write (ACE_STDOUT, buf, n);
}
ACE_OS::puts ("----------------------------------------");
time_t t = ACE_OS::time (0L);
ACE_TCHAR *cs = ACE_OS::ctime (&t);
if (new_local_stream.send (4,
Handle_L_Stream::login_name,
ACE_OS::strlen (Handle_L_Stream::login_name),
ACE_TEXT_ALWAYS_CHAR (cs),
ACE_OS::strlen (cs)) == -1)
return -1;
else if (ACE_OS::close (handle) == -1)
return -1;
else if (new_local_stream.close () == -1)
return -1;
else
return 0;
}
ACE_INLINE int
Handle_L_Stream::handle_close (ACE_HANDLE, ACE_Reactor_Mask)
{
this->ACE_LSOCK_Acceptor::close ();
return ACE_OS::unlink (this->rendezvous);
}
|