1d81ac5339fcf9537a3731ebb5770238f4fa69d59Sebastian Wilhelmi#undef G_DISABLE_ASSERT
2d81ac5339fcf9537a3731ebb5770238f4fa69d59Sebastian Wilhelmi#undef G_LOG_DOMAIN
3d81ac5339fcf9537a3731ebb5770238f4fa69d59Sebastian Wilhelmi
442a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor#include <sys/types.h>
542a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor#include <sys/stat.h>
642a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor#include <fcntl.h>
742a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor#include <glib.h>
842a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor#include <string.h>
942a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor#include <stdio.h>
1042a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor#include <stdlib.h>
1142a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
1242a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor#define BUFFER_SIZE 1024
1342a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
1414538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasenstatic void
1514538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasentest_small_writes (void)
1614538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen{
1714538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  GIOChannel *io;
1814538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  GIOStatus status;
1914538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  guint cnt;
2014538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  gchar tmp;
2114538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  GError *error = NULL;
2214538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
2314538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error);
2414538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  if (error)
2514538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen    {
2614538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen      g_warning ("Unable to open file %s: %s",
2714538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen		 "iochannel-test-outfile",
2814538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen		 error->message);
2914538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen      g_error_free (error);
3014538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
3114538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen      exit (1);
3214538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen    }
3314538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
3414538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  g_io_channel_set_encoding (io, NULL, NULL);
3514538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  g_io_channel_set_buffer_size (io, 1022);
3614538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
3714538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  cnt = 2 * g_io_channel_get_buffer_size (io);
3814538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  tmp = 0;
3914538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
4014538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  while (cnt)
4114538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen    {
4214538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen      status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL);
4314538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen      if (status == G_IO_STATUS_ERROR)
4414538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen	break;
4514538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen      if (status == G_IO_STATUS_NORMAL)
4614538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen	cnt--;
4714538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen    }
4814538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
4914538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  g_assert (status == G_IO_STATUS_NORMAL);
5014538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
5114538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen  g_io_channel_unref (io);
5214538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen}
5314538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
5414538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
5542a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylorgint main (gint argc, gchar * argv[])
5642a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor{
5742a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    GIOChannel *gio_r, *gio_w ;
5842a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    GError *gerr = NULL;
5942a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    GString *buffer;
60dff516edc8c173e8444abecf70532d829f45c13dOwen Taylor    char *filename;
61dff516edc8c173e8444abecf70532d829f45c13dOwen Taylor    char *srcdir = getenv ("srcdir");
62ac1080ee3b1aa149edb1839d33249e516c5d6db7Manish Singh    gint rlength = 0;
63ac1080ee3b1aa149edb1839d33249e516c5d6db7Manish Singh    glong wlength = 0;
64ac1080ee3b1aa149edb1839d33249e516c5d6db7Manish Singh    gsize length_out;
65ac1080ee3b1aa149edb1839d33249e516c5d6db7Manish Singh    const gchar encoding[] = "EUC-JP";
6642a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    GIOStatus status;
6742a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    GIOFlags flags;
6842a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
69dff516edc8c173e8444abecf70532d829f45c13dOwen Taylor    if (!srcdir)
70dff516edc8c173e8444abecf70532d829f45c13dOwen Taylor      srcdir = ".";
71dff516edc8c173e8444abecf70532d829f45c13dOwen Taylor    filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL);
72dff516edc8c173e8444abecf70532d829f45c13dOwen Taylor
737221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen    setbuf (stdout, NULL); /* For debugging */
7442a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
75dff516edc8c173e8444abecf70532d829f45c13dOwen Taylor    gio_r = g_io_channel_new_file (filename, "r", &gerr);
76e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke    if (gerr)
77e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      {
787221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_warning ("Unable to open file %s: %s", filename, gerr->message);
797221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_error_free (gerr);
80dff516edc8c173e8444abecf70532d829f45c13dOwen Taylor        return 1;
81e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      }
827221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen    gio_w = g_io_channel_new_file ("iochannel-test-outfile", "w", &gerr);
83e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke    if (gerr)
84e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      {
857221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message);
867221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_error_free (gerr);
87dff516edc8c173e8444abecf70532d829f45c13dOwen Taylor        return 1;
88e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      }
8942a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
9042a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    g_io_channel_set_encoding (gio_r, encoding, &gerr);
91e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke    if (gerr)
92e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      {
937221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_warning (gerr->message);
943ec443b1887c1bcfe538926e215c528ac0aae3d8Matthias Clasen        /* Keep going if this is just a case of iconv not supporting EUC-JP, see bug 428048 */
953ec443b1887c1bcfe538926e215c528ac0aae3d8Matthias Clasen        if (gerr->code != G_CONVERT_ERROR_NO_CONVERSION)
963ec443b1887c1bcfe538926e215c528ac0aae3d8Matthias Clasen          return 1;
977221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_error_free (gerr);
983ec443b1887c1bcfe538926e215c528ac0aae3d8Matthias Clasen        gerr = NULL;
99e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      }
10042a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
10142a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
10242a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
10342a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr);
104e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke    if (status == G_IO_STATUS_ERROR)
105e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      {
1067221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_warning (gerr->message);
1077221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_error_free (gerr);
108e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke        gerr = NULL;
109e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      }
11042a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    flags = g_io_channel_get_flags (gio_r);
11142a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    buffer = g_string_sized_new (BUFFER_SIZE);
11242a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
11342a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    while (TRUE)
11442a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    {
11542a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        do
11642a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr);
11742a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        while (status == G_IO_STATUS_AGAIN);
11842a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        if (status != G_IO_STATUS_NORMAL)
11942a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          break;
12042a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
12142a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        rlength += buffer->len;
12242a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
12342a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        do
12442a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len,
12542a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor            &length_out, &gerr);
12642a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        while (status == G_IO_STATUS_AGAIN);
12742a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        if (status != G_IO_STATUS_NORMAL)
12842a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          break;
12942a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
13042a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        wlength += length_out;
13142a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
13242a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        if (length_out < buffer->len)
13342a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          g_warning ("Only wrote part of the line.");
13442a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
1357221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen#ifdef VERBOSE
1361ff027aa2ddb2fa3c6adf12c5a3fa1717c5ce25aRon Steinke        g_print ("%s", buffer->str);
1377221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen#endif
13842a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        g_string_truncate (buffer, 0);
13942a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    }
14042a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
14142a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    switch (status)
14242a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor      {
14342a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        case G_IO_STATUS_EOF:
14442a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          break;
14542a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        case G_IO_STATUS_ERROR:
14642a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          g_warning (gerr->message);
14742a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          g_error_free (gerr);
14842a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          gerr = NULL;
14942a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          break;
15042a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor        default:
15142a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          g_warning ("Abnormal exit from write loop.");
15242a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor          break;
15342a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor      }
15442a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
15542a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    do
15642a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor      status = g_io_channel_flush (gio_w, &gerr);
15742a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    while (status == G_IO_STATUS_AGAIN);
15842a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
159e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke    if (status == G_IO_STATUS_ERROR)
160e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      {
1617221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_warning (gerr->message);
1627221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen        g_error_free (gerr);
163e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke        gerr = NULL;
164e070fdea390b04f7784f7c930342d481b82c9c60Ron Steinke      }
16542a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
1667221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen#ifdef VERBOSE
167ac1080ee3b1aa149edb1839d33249e516c5d6db7Manish Singh    g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength);
1687221f500f53591f980fbb2368c7eaa7f9beb6f27Matthias Clasen#endif
16942a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
17042a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    g_io_channel_unref(gio_r);
17142a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    g_io_channel_unref(gio_w);
17214538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen
17314538bb8d6d4e8af33151fb4d84dc893fa850577Matthias Clasen    test_small_writes ();
17442a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor
17542a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor    return 0;
17642a23950f50223eb640a7b5a16e74176ea38df9dOwen Taylor}
177