mirror of
				https://gitlab.gnome.org/GNOME/glib.git
				synced 2025-11-04 10:08:56 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			173 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			173 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#undef G_DISABLE_ASSERT
 | 
						|
#undef G_LOG_DOMAIN
 | 
						|
 | 
						|
#include <sys/types.h>
 | 
						|
#include <sys/stat.h>
 | 
						|
#include <fcntl.h>
 | 
						|
#include <glib.h>
 | 
						|
#include <string.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
 | 
						|
#define BUFFER_SIZE 1024
 | 
						|
 | 
						|
static void
 | 
						|
test_small_writes (void)
 | 
						|
{
 | 
						|
  GIOChannel *io;
 | 
						|
  GIOStatus status = G_IO_STATUS_ERROR;
 | 
						|
  guint cnt; 
 | 
						|
  gchar tmp;
 | 
						|
  GError *error = NULL;
 | 
						|
 | 
						|
  io = g_io_channel_new_file ("iochannel-test-outfile", "w", &error);
 | 
						|
  if (error)
 | 
						|
    {
 | 
						|
      g_warning ("Unable to open file %s: %s", 
 | 
						|
		 "iochannel-test-outfile", 
 | 
						|
		 error->message);
 | 
						|
      g_clear_error (&error);
 | 
						|
      
 | 
						|
      exit (1);
 | 
						|
    }
 | 
						|
 | 
						|
  g_io_channel_set_encoding (io, NULL, NULL);
 | 
						|
  g_io_channel_set_buffer_size (io, 1022);
 | 
						|
 | 
						|
  cnt = 2 * g_io_channel_get_buffer_size (io);
 | 
						|
  tmp = 0;
 | 
						|
 
 | 
						|
  while (cnt)
 | 
						|
    {
 | 
						|
      status = g_io_channel_write_chars (io, &tmp, 1, NULL, NULL);
 | 
						|
      if (status == G_IO_STATUS_ERROR)
 | 
						|
	break;
 | 
						|
      if (status == G_IO_STATUS_NORMAL)
 | 
						|
	cnt--;
 | 
						|
    }
 | 
						|
 | 
						|
  g_assert (status == G_IO_STATUS_NORMAL);
 | 
						|
 | 
						|
  g_io_channel_unref (io);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
gint main (gint argc, gchar * argv[])
 | 
						|
{
 | 
						|
    GIOChannel *gio_r, *gio_w ;
 | 
						|
    GError *gerr = NULL;
 | 
						|
    GString *buffer;
 | 
						|
    char *filename;
 | 
						|
    gint rlength = 0;
 | 
						|
    glong wlength = 0;
 | 
						|
    gsize length_out;
 | 
						|
    const gchar encoding[] = "EUC-JP";
 | 
						|
    GIOStatus status;
 | 
						|
 | 
						|
    g_test_init (&argc, &argv, NULL);
 | 
						|
 | 
						|
    filename = g_test_build_filename (G_TEST_DIST, "iochannel-test-infile", NULL);
 | 
						|
 | 
						|
    setbuf (stdout, NULL); /* For debugging */
 | 
						|
 | 
						|
    gio_r = g_io_channel_new_file (filename, "r", &gerr);
 | 
						|
    if (gerr)
 | 
						|
      {
 | 
						|
        g_warning ("Unable to open file %s: %s", filename, gerr->message);
 | 
						|
        g_clear_error (&gerr);
 | 
						|
        return 1;
 | 
						|
      }
 | 
						|
    gio_w = g_io_channel_new_file ("iochannel-test-outfile", "w", &gerr);
 | 
						|
    if (gerr)
 | 
						|
      {
 | 
						|
        g_warning ("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message);
 | 
						|
        g_clear_error (&gerr);
 | 
						|
        return 1;
 | 
						|
      }
 | 
						|
 | 
						|
    g_io_channel_set_encoding (gio_r, encoding, &gerr);
 | 
						|
    if (gerr)
 | 
						|
      {
 | 
						|
        g_warning ("%s", gerr->message);
 | 
						|
        /* Keep going if this is just a case of iconv not supporting EUC-JP, see bug 428048 */
 | 
						|
        if (gerr->code != G_CONVERT_ERROR_NO_CONVERSION)
 | 
						|
          return 1;
 | 
						|
        g_clear_error (&gerr);
 | 
						|
      }
 | 
						|
    
 | 
						|
    g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
 | 
						|
 | 
						|
    status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr);
 | 
						|
    if (status == G_IO_STATUS_ERROR)
 | 
						|
      {
 | 
						|
        g_warning ("%s", gerr->message);
 | 
						|
        g_clear_error (&gerr);
 | 
						|
      }
 | 
						|
    buffer = g_string_sized_new (BUFFER_SIZE);
 | 
						|
 | 
						|
    while (TRUE)
 | 
						|
    {
 | 
						|
        do
 | 
						|
          status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr);
 | 
						|
        while (status == G_IO_STATUS_AGAIN);
 | 
						|
        if (status != G_IO_STATUS_NORMAL)
 | 
						|
          break;
 | 
						|
 | 
						|
        rlength += buffer->len;
 | 
						|
 | 
						|
        do
 | 
						|
          status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len,
 | 
						|
            &length_out, &gerr);
 | 
						|
        while (status == G_IO_STATUS_AGAIN);
 | 
						|
        if (status != G_IO_STATUS_NORMAL)
 | 
						|
          break;
 | 
						|
 | 
						|
        wlength += length_out;
 | 
						|
 | 
						|
        if (length_out < buffer->len)
 | 
						|
          g_warning ("Only wrote part of the line.");
 | 
						|
 | 
						|
#ifdef VERBOSE
 | 
						|
        g_print ("%s", buffer->str);
 | 
						|
#endif
 | 
						|
        g_string_truncate (buffer, 0);
 | 
						|
    }
 | 
						|
 | 
						|
    switch (status)
 | 
						|
      {
 | 
						|
        case G_IO_STATUS_EOF:
 | 
						|
          break;
 | 
						|
        case G_IO_STATUS_ERROR:
 | 
						|
          g_warning ("%s", gerr->message);
 | 
						|
          g_clear_error (&gerr);
 | 
						|
          break;
 | 
						|
        default:
 | 
						|
          g_warning ("Abnormal exit from write loop.");
 | 
						|
          break;
 | 
						|
      }
 | 
						|
 | 
						|
    do
 | 
						|
      status = g_io_channel_flush (gio_w, &gerr);
 | 
						|
    while (status == G_IO_STATUS_AGAIN);
 | 
						|
 | 
						|
    if (status == G_IO_STATUS_ERROR)
 | 
						|
      {
 | 
						|
        g_warning ("%s", gerr->message);
 | 
						|
        g_clear_error (&gerr);
 | 
						|
      }
 | 
						|
 | 
						|
#ifdef VERBOSE
 | 
						|
    g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength);
 | 
						|
#endif
 | 
						|
 | 
						|
    g_io_channel_unref(gio_r);
 | 
						|
    g_io_channel_unref(gio_w);
 | 
						|
 | 
						|
    test_small_writes ();
 | 
						|
 | 
						|
    g_free (filename);
 | 
						|
    g_string_free (buffer, TRUE);
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 |