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