18e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington/* GLIB - Library of useful routines for C programming
28e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
38e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington *
48e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * This library is free software; you can redistribute it and/or
58e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * modify it under the terms of the GNU Lesser General Public
68e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * License as published by the Free Software Foundation; either
78e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * version 2 of the License, or (at your option) any later version.
88e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington *
98e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * This library is distributed in the hope that it will be useful,
108e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * but WITHOUT ANY WARRANTY; without even the implied warranty of
118e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
128e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * Lesser General Public License for more details.
138e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington *
148e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * You should have received a copy of the GNU Lesser General Public
158e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * License along with this library; if not, write to the
168e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
178e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * Boston, MA 02111-1307, USA.
188e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington */
198e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
208e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington/*
218e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
228e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * file for a list of people on the GLib Team.  See the ChangeLog
238e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * files for a list of changes.  These files are distributed with
248e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington * GLib at ftp://ftp.gtk.org/pub/gtk/.
258e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington */
268e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
273fa620d4dfeb3440526682b4970bc9147b6665c9Darin Adler#undef G_DISABLE_ASSERT
288e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington#undef G_LOG_DOMAIN
298e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
308e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington#include <glib.h>
318e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington#include <stdio.h>
328e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington#include <string.h>
338e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington#include <stdlib.h>
348e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
351f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist#ifdef G_OS_WIN32
361f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist#include <fcntl.h>
372781d5f6b3cf40fcf63b041932e58cd9d228d99eHans Breuer#include <io.h>
387d2ec70a49558247fb5874b1770e315e8deff235Tor Lillqvist#define pipe(fds) _pipe(fds, 4096, _O_BINARY)
391f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist#endif
401f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
418e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
428e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Penningtonstatic void
438e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Penningtonrun_tests (void)
448e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington{
458e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  GError *err;
468e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  gchar *output = NULL;
471f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist#ifdef G_OS_WIN32
481f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  gchar *erroutput = NULL;
491f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  int pipedown[2], pipeup[2];
501f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  gchar **argv = 0;
511f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist#endif
528e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
538e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  err = NULL;
548e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  if (!g_spawn_command_line_sync ("nonexistent_application foo 'bar baz' blah blah",
558e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington                                  NULL, NULL, NULL,
568e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington                                  &err))
578e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington    {
588e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington      g_error_free (err);
598e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington    }
607221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen  else
617221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen    {
627221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen      g_warning ("no error for sync spawn of nonexistent application");
637221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen      exit (1);
647221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen    }
658e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
668e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  err = NULL;
678e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  if (!g_spawn_command_line_async ("nonexistent_application foo bar baz \"blah blah\"",
688e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington                                   &err))
698e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington    {
708e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington      g_error_free (err);
718e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington    }
727221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen  else
737221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen    {
747221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen      g_warning ("no error for async spawn of nonexistent application");
757221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen      exit (1);
767221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen    }
778e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
788e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  err = NULL;
79fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist#ifdef G_OS_UNIX
808e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  if (!g_spawn_command_line_sync ("/bin/sh -c 'echo hello'",
818e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington                                  &output, NULL, NULL,
828e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington                                  &err))
838e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington    {
848e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington      fprintf (stderr, "Error: %s\n", err->message);
858e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington      g_error_free (err);
868e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington      exit (1);
878e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington    }
888e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  else
898e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington    {
908e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington      g_assert (output != NULL);
918e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
928e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington      if (strcmp (output, "hello\n") != 0)
938e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington        {
948e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington          printf ("output was '%s', should have been 'hello'\n",
958e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington                  output);
968e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
978e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington          exit (1);
988e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington        }
998e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
1008e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington      g_free (output);
1018e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington    }
102fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist#else
103fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist#ifdef G_OS_WIN32
10420378332aea3a273a27bd0d40451811b21a7a1f6Tor Lillqvist  printf ("Running netstat synchronously, collecting its output\n");
1051f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
10620378332aea3a273a27bd0d40451811b21a7a1f6Tor Lillqvist  if (!g_spawn_command_line_sync ("netstat -n",
1071f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist                                  &output, &erroutput, NULL,
108fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist                                  &err))
109fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist    {
110fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist      fprintf (stderr, "Error: %s\n", err->message);
111fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist      g_error_free (err);
112fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist      exit (1);
113fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist    }
114fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist  else
115fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist    {
116fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist      g_assert (output != NULL);
1171f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_assert (erroutput != NULL);
118fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist
11920378332aea3a273a27bd0d40451811b21a7a1f6Tor Lillqvist      if (strstr (output, "Active Connections") == 0)
120fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist        {
12120378332aea3a273a27bd0d40451811b21a7a1f6Tor Lillqvist          printf ("output was '%s', should have contained 'Active Connections'\n",
122fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist                  output);
123fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist
124fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist          exit (1);
125fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist        }
1261f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      if (erroutput[0] != '\0')
1271f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	{
1281f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  printf ("error output was '%s', should have been empty\n",
1291f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		  erroutput);
1301f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  exit (1);
1311f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	}
1321f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
1331f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_free (output);
1341f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      output = NULL;
1351f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_free (erroutput);
1361f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      erroutput = NULL;
1371f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    }
1381f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
139f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist  printf ("Running spawn-test-win32-gui in various ways. Click on the OK buttons.\n");
140f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist
141f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist  printf ("First asynchronously (without wait).\n");
1421f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
1431f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  if (!g_spawn_command_line_async ("'.\\spawn-test-win32-gui.exe' 1", &err))
1441f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    {
1451f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      fprintf (stderr, "Error: %s\n", err->message);
1461f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_error_free (err);
1471f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      exit (1);
1481f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    }
1491f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
150f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist  printf ("Now synchronously, collecting its output.\n");
1511f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  if (!g_spawn_command_line_sync ("'.\\spawn-test-win32-gui.exe' 2",
1521f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist				  &output, &erroutput, NULL,
1531f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist				  &err))
1541f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    {
1551f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      fprintf (stderr, "Error: %s\n", err->message);
1561f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_error_free (err);
1571f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      exit (1);
1581f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    }
1591f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  else
1601f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    {
1611f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_assert (output != NULL);
1621f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_assert (erroutput != NULL);
1631f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
1641f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      if (strcmp (output, "This is stdout\r\n") != 0)
1651f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist        {
1661f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist          printf ("output was '%s', should have been 'This is stdout'\n",
1671f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist                  g_strescape (output, NULL));
1681f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
1691f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist          exit (1);
1701f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist        }
1711f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      if (strcmp (erroutput, "This is stderr\r\n") != 0)
1721f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	{
1731f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  printf ("error output was '%s', should have been 'This is stderr'\n",
1741f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		  g_strescape (erroutput, NULL));
1751f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  exit (1);
1761f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	}
177fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist
178fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist      g_free (output);
1791f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_free (erroutput);
1801f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    }
1811f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
182f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist  printf ("Now with G_SPAWN_FILE_AND_ARGV_ZERO.\n");
183f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist
184f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist  if (!g_shell_parse_argv ("'.\\spawn-test-win32-gui.exe' this-should-be-argv-zero nop", NULL, &argv, &err))
185f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist    {
186f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist      fprintf (stderr, "Error parsing command line? %s\n", err->message);
187f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist      g_error_free (err);
188f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist      exit (1);
189f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist    }
190f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist
191f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist  if (!g_spawn_async (NULL, argv, NULL,
192f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist		      G_SPAWN_FILE_AND_ARGV_ZERO,
193f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist		      NULL, NULL, NULL,
194f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist		      &err))
195f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist    {
196f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist      fprintf (stderr, "Error: %s\n", err->message);
197f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist      g_error_free (err);
198f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist      exit (1);
199f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist    }
200f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist
201f4cb22c78d573d53dba62b7f6743cbe0a1d1e135Tor Lillqvist  printf ("Now talking to it through pipes.\n");
2021f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
2031f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  if (pipe (pipedown) < 0 ||
2041f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      pipe (pipeup) < 0)
2051f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    {
2061f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      fprintf (stderr, "Could not create pipes\n");
2071f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      exit (1);
208fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist    }
209fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist
2101f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  if (!g_shell_parse_argv (g_strdup_printf ("'.\\spawn-test-win32-gui.exe' pipes %d %d",
2111f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist					    pipedown[0], pipeup[1]),
2121f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist                           NULL, &argv,
2131f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist                           &err))
2141f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    {
2151f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      fprintf (stderr, "Error parsing command line? %s\n", err->message);
2161f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_error_free (err);
2171f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      exit (1);
2181f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    }
2191f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
2201f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  if (!g_spawn_async (NULL, argv, NULL,
2211f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		      G_SPAWN_LEAVE_DESCRIPTORS_OPEN |
2221f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		      G_SPAWN_DO_NOT_REAP_CHILD,
2231f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		      NULL, NULL, NULL,
2241f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		      &err))
2251f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    {
2261f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      fprintf (stderr, "Error: %s\n", err->message);
2271f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      g_error_free (err);
2281f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      exit (1);
2291f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    }
2301f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist  else
2311f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    {
2321f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      int k, n;
2331f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      char buf[100];
2341f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
2351f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      if ((k = read (pipeup[0], &n, sizeof (n))) != sizeof (n))
2361f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	{
2371f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  if (k == -1)
2381f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	    fprintf (stderr, "Read error: %s\n", g_strerror (errno));
2391f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  else
2401f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	    fprintf (stderr, "Wanted to read %d bytes, got %d\n",
2411f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		     sizeof (n), k);
2421f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  exit (1);
2431f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	}
2441f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
2451f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      if ((k = read (pipeup[0], buf, n)) != n)
2461f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	{
2471f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  if (k == -1)
2481f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	    fprintf (stderr, "Read error: %s\n", g_strerror (errno));
2491f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  else
2501f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	    fprintf (stderr, "Wanted to read %d bytes, got %d\n",
2511f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		     n, k);
2521f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  exit (1);
2531f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	}
2541f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
2551f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      n = strlen ("Bye then");
2561f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      if (write (pipedown[1], &n, sizeof (n)) == -1 ||
2571f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  write (pipedown[1], "Bye then", n) == -1)
2581f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	{
2591f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  fprintf (stderr, "Write error: %s\n", g_strerror (errno));
2601f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  exit (1);
2611f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	}
2621f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
2631f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      if ((k = read (pipeup[0], &n, sizeof (n))) != sizeof (n))
2641f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	{
2651f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  if (k == -1)
2661f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	    fprintf (stderr, "Read error: %s\n", g_strerror (errno));
2671f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  else
2681f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	    fprintf (stderr, "Wanted to read %d bytes, got %d\n",
2691f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		     sizeof (n), k);
2701f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  exit (1);
2711f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	}
2721f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist
2731f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist      if ((k = read (pipeup[0], buf, n)) != n)
2741f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	{
2751f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  if (k == -1)
2761f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	    fprintf (stderr, "Read error: %s\n", g_strerror (errno));
2771f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  else
2781f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	    fprintf (stderr, "Wanted to read %d bytes, got %d\n",
2791f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist		     n, k);
2801f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	  exit (1);
2811f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist	}
2821f04f2cce236311e79fef775890a5114123ced37Tor Lillqvist    }
283fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist#endif
284fb4de1c50d96cd500f53f7701629fd01ec99d7adTor Lillqvist#endif
2858e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington}
2868e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
2878e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Penningtonint
2888e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Penningtonmain (int   argc,
2898e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington      char *argv[])
2908e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington{
2918e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  run_tests ();
2928e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington
2938e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington  return 0;
2948e3a3eef63c3c298c93fa8f8e827b10dd1b6327cHavoc Pennington}
295