[kdbus] KDBUS_ITEM_PAYLOAD_OFF items are (once again) relative to msg header
[platform/upstream/glib.git] / gio / tests / gsubprocess-testprog.c
1 #include <gio/gio.h>
2 #include <string.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <errno.h>
6 #ifdef G_OS_UNIX
7 #include <unistd.h>
8 #include <gio/gunixinputstream.h>
9 #include <gio/gunixoutputstream.h>
10 #else
11 #include <io.h>
12 #endif
13
14 static GOptionEntry options[] = {
15   {NULL}
16 };
17
18 static void
19 write_all (int           fd,
20            const guint8* buf,
21            gsize         len)
22 {
23   while (len > 0)
24     {
25       gssize bytes_written = write (fd, buf, len);
26       if (bytes_written < 0)
27         g_error ("Failed to write to fd %d: %s",
28                  fd, strerror (errno));
29       buf += bytes_written;
30       len -= bytes_written;
31     }
32 }
33
34 static int
35 echo_mode (int argc,
36            char **argv)
37 {
38   int i;
39
40   for (i = 2; i < argc; i++)
41     {
42       write_all (1, (guint8*)argv[i], strlen (argv[i]));
43       write_all (1, (guint8*)"\n", 1);
44     }
45
46   return 0;
47 }
48
49 static int
50 echo_stdout_and_stderr_mode (int argc,
51                              char **argv)
52 {
53   int i;
54
55   for (i = 2; i < argc; i++)
56     {
57       write_all (1, (guint8*)argv[i], strlen (argv[i]));
58       write_all (1, (guint8*)"\n", 1);
59       write_all (2, (guint8*)argv[i], strlen (argv[i]));
60       write_all (2, (guint8*)"\n", 1);
61     }
62
63   return 0;
64 }
65
66 static int
67 cat_mode (int argc,
68           char **argv)
69 {
70   GIOChannel *chan_stdin;
71   GIOChannel *chan_stdout;
72   GIOStatus status;
73   char buf[1024];
74   gsize bytes_read, bytes_written;
75   GError *local_error = NULL;
76   GError **error = &local_error;
77
78   chan_stdin = g_io_channel_unix_new (0);
79   g_io_channel_set_encoding (chan_stdin, NULL, error);
80   g_assert_no_error (local_error);
81   chan_stdout = g_io_channel_unix_new (1);
82   g_io_channel_set_encoding (chan_stdout, NULL, error);
83   g_assert_no_error (local_error);
84
85   while (TRUE)
86     {
87       do
88         status = g_io_channel_read_chars (chan_stdin, buf, sizeof (buf),
89                                           &bytes_read, error);
90       while (status == G_IO_STATUS_AGAIN);
91
92       if (status == G_IO_STATUS_EOF || status == G_IO_STATUS_ERROR)
93         break;
94
95       do
96         status = g_io_channel_write_chars (chan_stdout, buf, bytes_read,
97                                            &bytes_written, error);
98       while (status == G_IO_STATUS_AGAIN);
99
100       if (status == G_IO_STATUS_EOF || status == G_IO_STATUS_ERROR)
101         break;
102     }
103
104   g_io_channel_unref (chan_stdin);
105   g_io_channel_unref (chan_stdout);
106
107   if (local_error)
108     {
109       g_printerr ("I/O error: %s\n", local_error->message);
110       g_clear_error (&local_error);
111       return 1;
112     }
113   return 0;
114 }
115
116 static gint
117 sleep_forever_mode (int argc,
118                     char **argv)
119 {
120   GMainLoop *loop;
121   
122   loop = g_main_loop_new (NULL, TRUE);
123   g_main_loop_run (loop);
124
125   return 0;
126 }
127
128 static int
129 write_to_fds (int argc, char **argv)
130 {
131   int i;
132
133   for (i = 2; i < argc; i++)
134     {
135       int fd = atoi (argv[i]);
136       FILE *f = fdopen (fd, "w");
137       const char buf[] = "hello world\n";
138       size_t bytes_written;
139       
140       g_assert (f != NULL);
141       
142       bytes_written = fwrite (buf, 1, sizeof (buf), f);
143       g_assert (bytes_written == sizeof (buf));
144       
145       if (fclose (f) == -1)
146         g_assert_not_reached ();
147     }
148
149   return 0;
150 }
151
152 static int
153 env_mode (int argc, char **argv)
154 {
155   char **env;
156   int i;
157
158   env = g_get_environ ();
159
160   for (i = 0; env[i]; i++)
161     g_print ("%s\n", env[i]);
162
163   g_strfreev (env);
164
165   return 0;
166 }
167
168 static int
169 cwd_mode (int argc, char **argv)
170 {
171   char *cwd;
172
173   cwd = g_get_current_dir ();
174   g_print ("%s\n", cwd);
175   g_free (cwd);
176
177   return 0;
178 }
179
180 static int
181 printenv_mode (int argc, char **argv)
182 {
183   gint i;
184
185   for (i = 2; i < argc; i++)
186     {
187       const gchar *value = g_getenv (argv[i]);
188
189       if (value != NULL)
190         g_print ("%s=%s\n", argv[i], value);
191     }
192
193   return 0;
194 }
195
196 int
197 main (int argc, char **argv)
198 {
199   GOptionContext *context;
200   GError *error = NULL;
201   const char *mode;
202
203   context = g_option_context_new ("MODE - Test GSubprocess stuff");
204   g_option_context_add_main_entries (context, options, NULL);
205   if (!g_option_context_parse (context, &argc, &argv, &error))
206     {
207       g_printerr ("%s: %s\n", argv[0], error->message);
208       return 1;
209     }
210
211   if (argc < 2)
212     {
213       g_printerr ("MODE argument required\n");
214       return 1;
215     }
216
217   mode = argv[1];
218   if (strcmp (mode, "noop") == 0)
219     return 0;
220   else if (strcmp (mode, "exit1") == 0)
221     return 1;
222   else if (strcmp (mode, "assert-argv0") == 0)
223     {
224       if (strcmp (argv[0], "moocow") == 0)
225         return 0;
226       g_printerr ("argv0=%s != moocow\n", argv[0]);
227       return 1;
228     }
229   else if (strcmp (mode, "echo") == 0)
230     return echo_mode (argc, argv);
231   else if (strcmp (mode, "echo-stdout-and-stderr") == 0)
232     return echo_stdout_and_stderr_mode (argc, argv);
233   else if (strcmp (mode, "cat") == 0)
234     return cat_mode (argc, argv);
235   else if (strcmp (mode, "sleep-forever") == 0)
236     return sleep_forever_mode (argc, argv);
237   else if (strcmp (mode, "write-to-fds") == 0)
238     return write_to_fds (argc, argv);
239   else if (strcmp (mode, "env") == 0)
240     return env_mode (argc, argv);
241   else if (strcmp (mode, "cwd") == 0)
242     return cwd_mode (argc, argv);
243   else if (strcmp (mode, "printenv") == 0)
244     return printenv_mode (argc, argv);
245   else
246     {
247       g_printerr ("Unknown MODE %s\n", argv[1]);
248       return 1;
249     }
250
251   return TRUE;
252 }