Branch data Line data Source code
1 : : /* Unix pipe-to-self. This is a utility module for tests, not a test. 2 : : * 3 : : * Copyright © 2008-2010 Red Hat, Inc. 4 : : * Copyright © 2011 Nokia Corporation 5 : : * 6 : : * SPDX-License-Identifier: LGPL-2.1-or-later 7 : : * 8 : : * This library is free software; you can redistribute it and/or 9 : : * modify it under the terms of the GNU Lesser General Public 10 : : * License as published by the Free Software Foundation; either 11 : : * version 2.1 of the License, or (at your option) any later version. 12 : : * 13 : : * This library is distributed in the hope that it will be useful, 14 : : * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 : : * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 : : * Lesser General Public License for more details. 17 : : * 18 : : * You should have received a copy of the GNU Lesser General 19 : : * Public License along with this library; if not, see <http://www.gnu.org/licenses/>. 20 : : * 21 : : * Author: Simon McVittie <simon.mcvittie@collabora.co.uk> 22 : : */ 23 : : 24 : : #include <errno.h> 25 : : #include <unistd.h> 26 : : 27 : : #include <gio/gio.h> 28 : : 29 : : #include "test-io-stream.h" 30 : : #include "test-pipe-unix.h" 31 : : 32 : : #ifdef G_OS_UNIX 33 : : # include <gio/gunixinputstream.h> 34 : : # include <gio/gunixoutputstream.h> 35 : : #else 36 : : # error This module only exists on Unix 37 : : #endif 38 : : 39 : : /** 40 : : * test_pipe: 41 : : * @is: (out) (optional): used to return a #GInputStream 42 : : * @os: (out) (optional): used to return a #GOutputStream 43 : : * @error: used to raise an error 44 : : * 45 : : * Return a "pipe to self" connecting @is to @os. This can be used 46 : : * as a unidirectional pipe to or from a child process, for instance. 47 : : * 48 : : * See test_bidi_pipe() if you want to emulate a bidirectional pipe 49 : : * via a pair of unidirectional pipes. 50 : : * 51 : : * Returns: %TRUE on success 52 : : */ 53 : : gboolean 54 : 6 : test_pipe (GInputStream **is, 55 : : GOutputStream **os, 56 : : GError **error) 57 : : { 58 : : int pipefd[2]; 59 : : int ret; 60 : : 61 : 6 : ret = pipe (pipefd); 62 : : 63 [ - + ]: 6 : if (ret != 0) 64 : : { 65 : 0 : int e = errno; 66 : : 67 : 0 : g_set_error (error, G_IO_ERROR, g_io_error_from_errno (e), 68 : : "%s", g_strerror (e)); 69 : 0 : return FALSE; 70 : : } 71 : : 72 [ + - ]: 6 : if (is != NULL) 73 : 6 : *is = g_unix_input_stream_new (pipefd[0], TRUE); 74 : : else 75 : 0 : close (pipefd[0]); 76 : : 77 [ + - ]: 6 : if (os != NULL) 78 : 6 : *os = g_unix_output_stream_new (pipefd[1], TRUE); 79 : : else 80 : 0 : close (pipefd[1]); 81 : : 82 : 6 : return TRUE; 83 : : } 84 : : 85 : : /** 86 : : * test_bidi_pipe: 87 : : * @left: (out) (optional): used to return one #GIOStream 88 : : * @right: (out) (optional): used to return the other #GIOStream 89 : : * @error: used to raise an error 90 : : * 91 : : * Return two #GIOStreams connected to each other with pipes. 92 : : * The "left" input stream is connected by a unidirectional pipe 93 : : * to the "right" output stream, and vice versa. This can be used 94 : : * as a bidirectional pipe to a child process, for instance. 95 : : * 96 : : * See test_pipe() if you only need a one-way pipe. 97 : : * 98 : : * Returns: %TRUE on success 99 : : */ 100 : : gboolean 101 : 1 : test_bidi_pipe (GIOStream **left, 102 : : GIOStream **right, 103 : : GError **error) 104 : : { 105 : 1 : GInputStream *left_in = NULL; 106 : 1 : GOutputStream *left_out = NULL; 107 : 1 : GInputStream *right_in = NULL; 108 : 1 : GOutputStream *right_out = NULL; 109 : 1 : gboolean ret = FALSE; 110 : : 111 [ - + ]: 1 : if (!test_pipe (&left_in, &right_out, error)) 112 : 0 : goto out; 113 : : 114 [ - + ]: 1 : if (!test_pipe (&right_in, &left_out, error)) 115 : 0 : goto out; 116 : : 117 [ + - ]: 1 : if (left != NULL) 118 : 1 : *left = test_io_stream_new (left_in, left_out); 119 : : 120 [ + - ]: 1 : if (right != NULL) 121 : 1 : *right = test_io_stream_new (right_in, right_out); 122 : : 123 : 1 : ret = TRUE; 124 : : 125 : 1 : out: 126 : 1 : g_clear_object (&left_in); 127 : 1 : g_clear_object (&left_out); 128 : 1 : g_clear_object (&right_in); 129 : 1 : g_clear_object (&right_out); 130 : 1 : return ret; 131 : : }