/* Unix pipe-to-self. This is a utility module for tests, not a test.
 *
 * Copyright © 2008-2010 Red Hat, Inc.
 * Copyright © 2011 Nokia Corporation
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General
 * Public License along with this library; if not, see <http://www.gnu.org/licenses/>.
 *
 * Author: Simon McVittie <simon.mcvittie@collabora.co.uk>
 */

#include <errno.h>
#include <unistd.h>

#include <gio/gio.h>

#include "test-io-stream.h"
#include "test-pipe-unix.h"

#ifdef G_OS_UNIX
#   include <gio/gunixinputstream.h>
#   include <gio/gunixoutputstream.h>
#else
#   error This module only exists on Unix
#endif

/*
 * test_pipe:
 * @is: (out) (allow-none): used to return a #GInputStream
 * @os: (out) (allow-none): used to return a #GOutputStream
 * @error: used to raise an error
 *
 * Return a "pipe to self" connecting @is to @os. This can be used
 * as a unidirectional pipe to or from a child process, for instance.
 *
 * See test_bidi_pipe() if you want to emulate a bidirectional pipe
 * via a pair of unidirectional pipes.
 *
 * Returns: %TRUE on success
 */
gboolean
test_pipe (GInputStream  **is,
           GOutputStream **os,
           GError        **error)
{
  int pipefd[2];
  int ret;

  ret = pipe (pipefd);

  if (ret != 0)
    {
      int e = errno;

      g_set_error (error, G_IO_ERROR, g_io_error_from_errno (e),
                   "%s", g_strerror (e));
      return FALSE;
    }

  if (is != NULL)
    *is = g_unix_input_stream_new (pipefd[0], TRUE);
  else
    close (pipefd[0]);

  if (os != NULL)
    *os = g_unix_output_stream_new (pipefd[1], TRUE);
  else
    close (pipefd[1]);

  return TRUE;
}

/*
 * test_bidi_pipe:
 * @left: (out) (allow-none): used to return one #GIOStream
 * @right: (out) (allow-none): used to return the other #GIOStream
 * @error: used to raise an error
 *
 * Return two #GIOStream<!---->s connected to each other with pipes.
 * The "left" input stream is connected by a unidirectional pipe
 * to the "right" output stream, and vice versa. This can be used
 * as a bidirectional pipe to a child process, for instance.
 *
 * See test_pipe() if you only need a one-way pipe.
 *
 * Returns: %TRUE on success
 */
gboolean
test_bidi_pipe (GIOStream **left,
                GIOStream **right,
                GError    **error)
{
  GInputStream *left_in = NULL;
  GOutputStream *left_out = NULL;
  GInputStream *right_in = NULL;
  GOutputStream *right_out = NULL;
  gboolean ret = FALSE;

  if (!test_pipe (&left_in, &right_out, error))
    goto out;

  if (!test_pipe (&right_in, &left_out, error))
    goto out;

  if (left != NULL)
    *left = test_io_stream_new (left_in, left_out);

  if (right != NULL)
    *right = test_io_stream_new (right_in, right_out);

  ret = TRUE;

out:
  g_clear_object (&left_in);
  g_clear_object (&left_out);
  g_clear_object (&right_in);
  g_clear_object (&right_out);
  return ret;
}
