Exemplo n.º 1
0
int
ACE_SPIPE_Addr::set (const ACE_SPIPE_Addr &sa)
{
  this->base_set (sa.get_type (), sa.get_size ());

  if (sa.get_type () == AF_ANY)
    (void) ACE_OS::memset ((void *) &this->SPIPE_addr_,
                           0,
                           sizeof this->SPIPE_addr_);
  else
    (void) ACE_OS::memcpy ((void *) &this->SPIPE_addr_, (void *)
                           &sa.SPIPE_addr_,
                           sa.get_size ());
  return 0;
}
Exemplo n.º 2
0
int
ACE_SPIPE_Connector::connect (ACE_SPIPE_Stream &new_io,
			      const ACE_SPIPE_Addr &remote_sap,
			      ACE_Time_Value *timeout,
			      const ACE_Addr & /* local_sap */,
			      int /* reuse_addr */,
			      int flags,
			      int perms)
{
  ACE_TRACE ("ACE_SPIPE_Connector::connect");

  // Make darn sure that the O_CREAT flag is not set!
#if ! defined (ACE_PSOS_DIAB_MIPS)
  ACE_CLR_BITS (flags, O_CREAT);
# endif /* !ACE_PSOS_DIAB_MIPS */
  ACE_HANDLE handle = ACE_Handle_Ops::handle_timed_open (timeout,
                                                         remote_sap.get_path_name (),
                                                         flags, perms);
  new_io.set_handle (handle);
  new_io.remote_addr_ = remote_sap; // class copy.

#if defined (ACE_WIN32) && !defined (ACE_HAS_PHARLAP)
  DWORD pipe_mode = PIPE_READMODE_MESSAGE | PIPE_WAIT;

  // Set named pipe mode and buffering characteristics.
  if (handle != ACE_INVALID_HANDLE)
    return ::SetNamedPipeHandleState (handle,
				      &pipe_mode,
				      NULL,
				      NULL);
#endif
  return handle == ACE_INVALID_HANDLE ? -1 : 0;
}
Exemplo n.º 3
0
ACE_SPIPE_Connector::ACE_SPIPE_Connector (ACE_SPIPE_Stream &new_io,
					  const ACE_SPIPE_Addr &remote_sap,
					  ACE_Time_Value *timeout,
					  const ACE_Addr & local_sap,
					  int reuse_addr,
					  int flags,
					  int perms)
{
  ACE_TRACE ("ACE_SPIPE_Connector::ACE_SPIPE_Connector");
  if (this->connect (new_io, remote_sap, timeout, local_sap,
		     reuse_addr, flags, perms) == -1
      && timeout != 0 && !(errno == EWOULDBLOCK || errno == ETIME))
    ACE_ERROR ((LM_ERROR, ACE_LIB_TEXT ("address %s, %p\n"),
	       remote_sap.get_path_name (), ACE_LIB_TEXT ("ACE_SPIPE_Connector")));
}
Exemplo n.º 4
0
int
ACE_SPIPE_Connector::connect (ACE_SPIPE_Stream &new_io,
                              const ACE_SPIPE_Addr &remote_sap,
                              ACE_Time_Value *timeout,
                              const ACE_Addr & /* local_sap */,
                              int /* reuse_addr */,
                              int flags,
                              int perms,
                              LPSECURITY_ATTRIBUTES sa,
                              int pipe_mode)
{
  ACE_TRACE ("ACE_SPIPE_Connector::connect");
  // Make darn sure that the O_CREAT flag is not set!
  ACE_CLR_BITS (flags, O_CREAT);

  ACE_HANDLE handle;

  ACE_UNUSED_ARG (pipe_mode);
#if defined (ACE_WIN32) && \
   !defined (ACE_HAS_PHARLAP) && !defined (ACE_HAS_WINCE)
  // We need to allow for more than one attempt to connect,
  // calculate the absolute time at which we give up.
  ACE_Time_Value absolute_time;
  if (timeout != 0)
    absolute_time = ACE_OS::gettimeofday () + *timeout;

  // Loop until success or failure.
  for (;;)
    {
      handle = ACE_OS::open (remote_sap.get_path_name(), flags, perms, sa);
      if (handle != ACE_INVALID_HANDLE)
        // Success!
        break;

      // Check if we have a busy pipe condition.
      if (::GetLastError() != ERROR_PIPE_BUSY)
        // Nope, this is a failure condition.
        break;

      // This will hold the time out value used in the ::WaitNamedPipe
      // call.
      DWORD time_out_value;

      // Check if we are to block until we connect.
      if (timeout == 0)
        // Wait for as long as it takes.
        time_out_value = NMPWAIT_WAIT_FOREVER;
      else
        {
          // Calculate the amount of time left to wait.
          ACE_Time_Value relative_time (absolute_time - ACE_OS::gettimeofday ());
          // Check if we have run out of time.
          if (relative_time <= ACE_Time_Value::zero)
            {
              // Mimick the errno value returned by
              // ACE::handle_timed_open.
              if (*timeout == ACE_Time_Value::zero)
                errno = EWOULDBLOCK;
              else
                errno = ETIMEDOUT;
              // Exit the connect loop with the failure.
              break;
            }
          // Get the amount of time remaining for ::WaitNamedPipe.
          time_out_value = relative_time.msec ();

        }

      // Wait for the named pipe to become available.
      ACE_TEXT_WaitNamedPipe (remote_sap.get_path_name (),
                              time_out_value);

      // Regardless of the return value, we'll do one more attempt to
      // connect to see if it is now available and to return
      // consistent error values.
    }

  // Set named pipe mode if we have a valid handle.
  if (handle != ACE_INVALID_HANDLE)
    {
      // Check if we are changing the pipe mode from the default.
      if (pipe_mode != (PIPE_READMODE_BYTE | PIPE_WAIT))
        {
          DWORD dword_pipe_mode = pipe_mode;
          if (!::SetNamedPipeHandleState (handle,
                                          &dword_pipe_mode,
                                          0,
                                          0))
            {
              // We were not able to put the pipe into the requested
              // mode.
              ACE_OS::close (handle);
              handle = ACE_INVALID_HANDLE;
            }
        }
    }
#else /* ACE_WIN32 && !ACE_HAS_PHARLAP */
  handle = ACE::handle_timed_open (timeout,
                                              remote_sap.get_path_name (),
                                              flags, perms, sa);
#endif /* !ACE_WIN32 || ACE_HAS_PHARLAP || ACE_HAS_WINCE */

  new_io.set_handle (handle);
  new_io.remote_addr_ = remote_sap; // class copy.

  return handle == ACE_INVALID_HANDLE ? -1 : 0;
}
Exemplo n.º 5
0
int
ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
  ACE_SPIPE_Acceptor peer_acceptor;
  ACE_SPIPE_Stream new_stream;
  struct pollfd poll_array[MAX_HANDLES];
  ACE_HANDLE handle;

  for (handle = 0; handle < MAX_HANDLES; handle++)
    {
      poll_array[handle].fd = -1;
      poll_array[handle].events = POLLIN;
    }

  if (argc > 1)
    rendezvous = argv[1];

  ACE_OS::fdetach (ACE_TEXT_ALWAYS_CHAR (rendezvous));
  ACE_SPIPE_Addr addr (rendezvous);

  ACE_HANDLE s_handle = peer_acceptor.open (addr);

  if (s_handle == -1)
    ACE_ERROR_RETURN ((LM_ERROR, "%p\n", "peer_acceptor.open"), -1);

  poll_array[0].fd = s_handle;

  for (int width = 1;;)
    {
      // Block waiting for client I/O events (handle interrupts).
      while (ACE_OS::poll (poll_array, width) == -1 && errno == EINTR)
        continue;

      // Handle pending logging messages first (s_handle + 1 is
      // guaranteed to be lowest client descriptor).

      for (handle = s_handle + 1; handle < width; handle++)
        if (ACE_BIT_ENABLED (poll_array[handle].revents, POLLIN)
            || ACE_BIT_ENABLED (poll_array[handle].revents, POLLHUP))
          {
            char buf[BUFSIZ];
            ssize_t n = ACE_OS::read (handle, buf, sizeof buf);

            // recv will not block in this case!
            if (n == -1)
              ACE_DEBUG ((LM_DEBUG, "%p\n", "read failed"));
            else if (n == 0)
              {
                // Handle client connection shutdown.
                if (ACE_OS::close (poll_array[handle].fd) == -1)
                  ACE_DEBUG ((LM_DEBUG, "%p\n", "close"));
                poll_array[handle].fd = -1;

                if (handle + 1 == width)
                  {
                    while (poll_array[handle].fd == -1)
                      handle--;
                    width = handle + 1;
                  }
              }
            else
              ACE_DEBUG ((LM_DEBUG, "%*s\n", n, buf));
          }

      if (ACE_BIT_ENABLED (poll_array[0].revents, POLLIN))
        {
          if (peer_acceptor.accept (new_stream) == -1)
            ACE_DEBUG ((LM_DEBUG, "%p\n", "accept failed"));

          ACE_SPIPE_Addr client;
          ACE_HANDLE n_handle = new_stream.get_handle ();

          if (new_stream.get_remote_addr (client) == -1)
            ACE_DEBUG ((LM_DEBUG, "%p\n",
                        "get_remote_addr failed"));

          ACE_DEBUG ((LM_DEBUG,
                      "n_handle = %d, uid = %d, gid = %d\n",
                      n_handle,
                      client.user_id (),
                      client.group_id ()));

          int arg = RMSGN | RPROTDAT;

          if (ACE_OS::ioctl (n_handle,
                             I_SRDOPT, (void *) arg) == -1)
            ACE_DEBUG ((LM_DEBUG, "%p\n", "ioctl failed"));

          poll_array[n_handle].fd = n_handle;

          if (n_handle >= width)
            width = n_handle + 1;
        }
    }

  ACE_NOTREACHED (return 0;)
}