1#undef G_DISABLE_ASSERT 2#undef G_LOG_DOMAIN 3 4#include <sys/types.h> 5#include <sys/stat.h> 6#include <fcntl.h> 7#include <glib.h> 8#include <string.h> 9#include <stdio.h> 10#include <stdlib.h> 11 12#define BUFFER_SIZE 1024 13 14static void 15test_small_writes (void) 16{ 17 GIOChannel *io; 18 GIOStatus status; 19 guint cnt; 20 gchar tmp; 21 GError *error = NULL; 22 23 io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error); 24 if (error) 25 { 26 g_warning ("Unable to open file %s: %s", 27 "iochannel-test-outfile", 28 error->message); 29 g_error_free (error); 30 31 exit (1); 32 } 33 34 g_io_channel_set_encoding (io, NULL, NULL); 35 g_io_channel_set_buffer_size (io, 1022); 36 37 cnt = 2 * g_io_channel_get_buffer_size (io); 38 tmp = 0; 39 40 while (cnt) 41 { 42 status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL); 43 if (status == G_IO_STATUS_ERROR) 44 break; 45 if (status == G_IO_STATUS_NORMAL) 46 cnt--; 47 } 48 49 g_assert (status == G_IO_STATUS_NORMAL); 50 51 g_io_channel_unref (io); 52} 53 54 55gint main (gint argc, gchar * argv[]) 56{ 57 GIOChannel *gio_r, *gio_w ; 58 GError *gerr = NULL; 59 GString *buffer; 60 char *filename; 61 char *srcdir = getenv ("srcdir"); 62 gint rlength = 0; 63 glong wlength = 0; 64 gsize length_out; 65 const gchar encoding[] = "EUC-JP"; 66 GIOStatus status; 67 GIOFlags flags; 68 69 if (!srcdir) 70 srcdir = "."; 71 filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL); 72 73 setbuf (stdout, NULL); /* For debugging */ 74 75 gio_r = g_io_channel_new_file (filename, "r", &gerr); 76 if (gerr) 77 { 78 g_warning ("Unable to open file %s: %s", filename, gerr->message); 79 g_error_free (gerr); 80 return 1; 81 } 82 gio_w = g_io_channel_new_file ("iochannel-test-outfile", "w", &gerr); 83 if (gerr) 84 { 85 g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message); 86 g_error_free (gerr); 87 return 1; 88 } 89 90 g_io_channel_set_encoding (gio_r, encoding, &gerr); 91 if (gerr) 92 { 93 g_warning (gerr->message); 94 /* Keep going if this is just a case of iconv not supporting EUC-JP, see bug 428048 */ 95 if (gerr->code != G_CONVERT_ERROR_NO_CONVERSION) 96 return 1; 97 g_error_free (gerr); 98 gerr = NULL; 99 } 100 101 g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE); 102 103 status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr); 104 if (status == G_IO_STATUS_ERROR) 105 { 106 g_warning (gerr->message); 107 g_error_free (gerr); 108 gerr = NULL; 109 } 110 flags = g_io_channel_get_flags (gio_r); 111 buffer = g_string_sized_new (BUFFER_SIZE); 112 113 while (TRUE) 114 { 115 do 116 status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr); 117 while (status == G_IO_STATUS_AGAIN); 118 if (status != G_IO_STATUS_NORMAL) 119 break; 120 121 rlength += buffer->len; 122 123 do 124 status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len, 125 &length_out, &gerr); 126 while (status == G_IO_STATUS_AGAIN); 127 if (status != G_IO_STATUS_NORMAL) 128 break; 129 130 wlength += length_out; 131 132 if (length_out < buffer->len) 133 g_warning ("Only wrote part of the line."); 134 135#ifdef VERBOSE 136 g_print ("%s", buffer->str); 137#endif 138 g_string_truncate (buffer, 0); 139 } 140 141 switch (status) 142 { 143 case G_IO_STATUS_EOF: 144 break; 145 case G_IO_STATUS_ERROR: 146 g_warning (gerr->message); 147 g_error_free (gerr); 148 gerr = NULL; 149 break; 150 default: 151 g_warning ("Abnormal exit from write loop."); 152 break; 153 } 154 155 do 156 status = g_io_channel_flush (gio_w, &gerr); 157 while (status == G_IO_STATUS_AGAIN); 158 159 if (status == G_IO_STATUS_ERROR) 160 { 161 g_warning (gerr->message); 162 g_error_free (gerr); 163 gerr = NULL; 164 } 165 166#ifdef VERBOSE 167 g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength); 168#endif 169 170 g_io_channel_unref(gio_r); 171 g_io_channel_unref(gio_w); 172 173 test_small_writes (); 174 175 return 0; 176} 177