/* 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;
}
