Home | History | Annotate | Download | only in glib
      1 /* GLIB - Library of useful routines for C programming
      2  * Copyright (C) 1995-1997  Peter Mattis, Spencer Kimball and Josh MacDonald
      3  *
      4  * giochannel.c: IO Channel abstraction
      5  * Copyright 1998 Owen Taylor
      6  *
      7  * This library is free software; you can redistribute it and/or
      8  * modify it under the terms of the GNU Lesser General Public
      9  * License as published by the Free Software Foundation; either
     10  * version 2 of the License, or (at your option) any later version.
     11  *
     12  * This library is distributed in the hope that it will be useful,
     13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
     15  * Lesser General Public License for more details.
     16  *
     17  * You should have received a copy of the GNU Lesser General Public
     18  * License along with this library; if not, write to the
     19  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
     20  * Boston, MA 02111-1307, USA.
     21  */
     22 
     23 /*
     24  * Modified by the GLib Team and others 1997-2000.  See the AUTHORS
     25  * file for a list of people on the GLib Team.  See the ChangeLog
     26  * files for a list of changes.  These files are distributed with
     27  * GLib at ftp://ftp.gtk.org/pub/gtk/.
     28  */
     29 
     30 /*
     31  * MT safe
     32  */
     33 
     34 #include "config.h"
     35 
     36 #include <string.h>
     37 #include <errno.h>
     38 
     39 #ifdef HAVE_UNISTD_H
     40 #include <unistd.h>
     41 #endif
     42 
     43 #undef G_DISABLE_DEPRECATED
     44 
     45 #include "glib.h"
     46 
     47 #include "giochannel.h"
     48 
     49 #include "glibintl.h"
     50 
     51 #include "galias.h"
     52 
     53 #define G_IO_NICE_BUF_SIZE	1024
     54 
     55 /* This needs to be as wide as the largest character in any possible encoding */
     56 #define MAX_CHAR_SIZE		10
     57 
     58 /* Some simplifying macros, which reduce the need to worry whether the
     59  * buffers have been allocated. These also make USE_BUF () an lvalue,
     60  * which is used in g_io_channel_read_to_end ().
     61  */
     62 #define USE_BUF(channel)	((channel)->encoding ? (channel)->encoded_read_buf \
     63 				 : (channel)->read_buf)
     64 #define BUF_LEN(string)		((string) ? (string)->len : 0)
     65 
     66 static GIOError		g_io_error_get_from_g_error	(GIOStatus    status,
     67 							 GError      *err);
     68 static void		g_io_channel_purge		(GIOChannel  *channel);
     69 static GIOStatus	g_io_channel_fill_buffer	(GIOChannel  *channel,
     70 							 GError     **err);
     71 static GIOStatus	g_io_channel_read_line_backend	(GIOChannel  *channel,
     72 							 gsize       *length,
     73 							 gsize       *terminator_pos,
     74 							 GError     **error);
     75 
     76 /**
     77  * g_io_channel_init:
     78  * @channel: a #GIOChannel
     79  *
     80  * Initializes a #GIOChannel struct.
     81  *
     82  * This is called by each of the above functions when creating a
     83  * #GIOChannel, and so is not often needed by the application
     84  * programmer (unless you are creating a new type of #GIOChannel).
     85  */
     86 void
     87 g_io_channel_init (GIOChannel *channel)
     88 {
     89   channel->ref_count = 1;
     90   channel->encoding = g_strdup ("UTF-8");
     91   channel->line_term = NULL;
     92   channel->line_term_len = 0;
     93   channel->buf_size = G_IO_NICE_BUF_SIZE;
     94   channel->read_cd = (GIConv) -1;
     95   channel->write_cd = (GIConv) -1;
     96   channel->read_buf = NULL; /* Lazy allocate buffers */
     97   channel->encoded_read_buf = NULL;
     98   channel->write_buf = NULL;
     99   channel->partial_write_buf[0] = '\0';
    100   channel->use_buffer = TRUE;
    101   channel->do_encode = FALSE;
    102   channel->close_on_unref = FALSE;
    103 }
    104 
    105 /**
    106  * g_io_channel_ref:
    107  * @channel: a #GIOChannel
    108  *
    109  * Increments the reference count of a #GIOChannel.
    110  *
    111  * Returns: the @channel that was passed in (since 2.6)
    112  */
    113 GIOChannel *
    114 g_io_channel_ref (GIOChannel *channel)
    115 {
    116   g_return_val_if_fail (channel != NULL, NULL);
    117 
    118   g_atomic_int_inc (&channel->ref_count);
    119 
    120   return channel;
    121 }
    122 
    123 /**
    124  * g_io_channel_unref:
    125  * @channel: a #GIOChannel
    126  *
    127  * Decrements the reference count of a #GIOChannel.
    128  */
    129 void
    130 g_io_channel_unref (GIOChannel *channel)
    131 {
    132   gboolean is_zero;
    133 
    134   g_return_if_fail (channel != NULL);
    135 
    136   is_zero = g_atomic_int_dec_and_test (&channel->ref_count);
    137 
    138   if (G_UNLIKELY (is_zero))
    139     {
    140       if (channel->close_on_unref)
    141         g_io_channel_shutdown (channel, TRUE, NULL);
    142       else
    143         g_io_channel_purge (channel);
    144       g_free (channel->encoding);
    145       if (channel->read_cd != (GIConv) -1)
    146         g_iconv_close (channel->read_cd);
    147       if (channel->write_cd != (GIConv) -1)
    148         g_iconv_close (channel->write_cd);
    149       g_free (channel->line_term);
    150       if (channel->read_buf)
    151         g_string_free (channel->read_buf, TRUE);
    152       if (channel->write_buf)
    153         g_string_free (channel->write_buf, TRUE);
    154       if (channel->encoded_read_buf)
    155         g_string_free (channel->encoded_read_buf, TRUE);
    156       channel->funcs->io_free (channel);
    157     }
    158 }
    159 
    160 static GIOError
    161 g_io_error_get_from_g_error (GIOStatus  status,
    162 			     GError    *err)
    163 {
    164   switch (status)
    165     {
    166       case G_IO_STATUS_NORMAL:
    167       case G_IO_STATUS_EOF:
    168         return G_IO_ERROR_NONE;
    169       case G_IO_STATUS_AGAIN:
    170         return G_IO_ERROR_AGAIN;
    171       case G_IO_STATUS_ERROR:
    172 	g_return_val_if_fail (err != NULL, G_IO_ERROR_UNKNOWN);
    173 
    174         if (err->domain != G_IO_CHANNEL_ERROR)
    175           return G_IO_ERROR_UNKNOWN;
    176         switch (err->code)
    177           {
    178             case G_IO_CHANNEL_ERROR_INVAL:
    179               return G_IO_ERROR_INVAL;
    180             default:
    181               return G_IO_ERROR_UNKNOWN;
    182           }
    183       default:
    184         g_assert_not_reached ();
    185     }
    186 }
    187 
    188 /**
    189  * g_io_channel_read:
    190  * @channel: a #GIOChannel
    191  * @buf: a buffer to read the data into (which should be at least
    192  *       count bytes long)
    193  * @count: the number of bytes to read from the #GIOChannel
    194  * @bytes_read: returns the number of bytes actually read
    195  *
    196  * Reads data from a #GIOChannel.
    197  *
    198  * Return value: %G_IO_ERROR_NONE if the operation was successful.
    199  *
    200  * Deprecated:2.2: Use g_io_channel_read_chars() instead.
    201  **/
    202 GIOError
    203 g_io_channel_read (GIOChannel *channel,
    204 		   gchar      *buf,
    205 		   gsize       count,
    206 		   gsize      *bytes_read)
    207 {
    208   GError *err = NULL;
    209   GIOError error;
    210   GIOStatus status;
    211 
    212   g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
    213   g_return_val_if_fail (bytes_read != NULL, G_IO_ERROR_UNKNOWN);
    214 
    215   if (count == 0)
    216     {
    217       if (bytes_read)
    218         *bytes_read = 0;
    219       return G_IO_ERROR_NONE;
    220     }
    221 
    222   g_return_val_if_fail (buf != NULL, G_IO_ERROR_UNKNOWN);
    223 
    224   status = channel->funcs->io_read (channel, buf, count, bytes_read, &err);
    225 
    226   error = g_io_error_get_from_g_error (status, err);
    227 
    228   if (err)
    229     g_error_free (err);
    230 
    231   return error;
    232 }
    233 
    234 /**
    235  * g_io_channel_write:
    236  * @channel:  a #GIOChannel
    237  * @buf: the buffer containing the data to write
    238  * @count: the number of bytes to write
    239  * @bytes_written: the number of bytes actually written
    240  *
    241  * Writes data to a #GIOChannel.
    242  *
    243  * Return value:  %G_IO_ERROR_NONE if the operation was successful.
    244  *
    245  * Deprecated:2.2: Use g_io_channel_write_chars() instead.
    246  **/
    247 GIOError
    248 g_io_channel_write (GIOChannel  *channel,
    249 		    const gchar *buf,
    250 		    gsize        count,
    251 		    gsize       *bytes_written)
    252 {
    253   GError *err = NULL;
    254   GIOError error;
    255   GIOStatus status;
    256 
    257   g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
    258   g_return_val_if_fail (bytes_written != NULL, G_IO_ERROR_UNKNOWN);
    259 
    260   status = channel->funcs->io_write (channel, buf, count, bytes_written, &err);
    261 
    262   error = g_io_error_get_from_g_error (status, err);
    263 
    264   if (err)
    265     g_error_free (err);
    266 
    267   return error;
    268 }
    269 
    270 /**
    271  * g_io_channel_seek:
    272  * @channel: a #GIOChannel
    273  * @offset: an offset, in bytes, which is added to the position specified
    274  *          by @type
    275  * @type: the position in the file, which can be %G_SEEK_CUR (the current
    276  *        position), %G_SEEK_SET (the start of the file), or %G_SEEK_END
    277  *        (the end of the file)
    278  *
    279  * Sets the current position in the #GIOChannel, similar to the standard
    280  * library function fseek().
    281  *
    282  * Return value: %G_IO_ERROR_NONE if the operation was successful.
    283  *
    284  * Deprecated:2.2: Use g_io_channel_seek_position() instead.
    285  **/
    286 GIOError
    287 g_io_channel_seek (GIOChannel *channel,
    288 		   gint64      offset,
    289 		   GSeekType   type)
    290 {
    291   GError *err = NULL;
    292   GIOError error;
    293   GIOStatus status;
    294 
    295   g_return_val_if_fail (channel != NULL, G_IO_ERROR_UNKNOWN);
    296   g_return_val_if_fail (channel->is_seekable, G_IO_ERROR_UNKNOWN);
    297 
    298   switch (type)
    299     {
    300       case G_SEEK_CUR:
    301       case G_SEEK_SET:
    302       case G_SEEK_END:
    303         break;
    304       default:
    305         g_warning ("g_io_channel_seek: unknown seek type");
    306         return G_IO_ERROR_UNKNOWN;
    307     }
    308 
    309   status = channel->funcs->io_seek (channel, offset, type, &err);
    310 
    311   error = g_io_error_get_from_g_error (status, err);
    312 
    313   if (err)
    314     g_error_free (err);
    315 
    316   return error;
    317 }
    318 
    319 /* The function g_io_channel_new_file() is prototyped in both
    320  * giounix.c and giowin32.c, so we stick its documentation here.
    321  */
    322 
    323 /**
    324  * g_io_channel_new_file:
    325  * @filename: A string containing the name of a file
    326  * @mode: One of "r", "w", "a", "r+", "w+", "a+". These have
    327  *        the same meaning as in fopen()
    328  * @error: A location to return an error of type %G_FILE_ERROR
    329  *
    330  * Open a file @filename as a #GIOChannel using mode @mode. This
    331  * channel will be closed when the last reference to it is dropped,
    332  * so there is no need to call g_io_channel_close() (though doing
    333  * so will not cause problems, as long as no attempt is made to
    334  * access the channel after it is closed).
    335  *
    336  * Return value: A #GIOChannel on success, %NULL on failure.
    337  **/
    338 
    339 /**
    340  * g_io_channel_close:
    341  * @channel: A #GIOChannel
    342  *
    343  * Close an IO channel. Any pending data to be written will be
    344  * flushed, ignoring errors. The channel will not be freed until the
    345  * last reference is dropped using g_io_channel_unref().
    346  *
    347  * Deprecated:2.2: Use g_io_channel_shutdown() instead.
    348  **/
    349 void
    350 g_io_channel_close (GIOChannel *channel)
    351 {
    352   GError *err = NULL;
    353 
    354   g_return_if_fail (channel != NULL);
    355 
    356   g_io_channel_purge (channel);
    357 
    358   channel->funcs->io_close (channel, &err);
    359 
    360   if (err)
    361     { /* No way to return the error */
    362       g_warning ("Error closing channel: %s", err->message);
    363       g_error_free (err);
    364     }
    365 
    366   channel->close_on_unref = FALSE; /* Because we already did */
    367   channel->is_readable = FALSE;
    368   channel->is_writeable = FALSE;
    369   channel->is_seekable = FALSE;
    370 }
    371 
    372 /**
    373  * g_io_channel_shutdown:
    374  * @channel: a #GIOChannel
    375  * @flush: if %TRUE, flush pending
    376  * @err: location to store a #GIOChannelError
    377  *
    378  * Close an IO channel. Any pending data to be written will be
    379  * flushed if @flush is %TRUE. The channel will not be freed until the
    380  * last reference is dropped using g_io_channel_unref().
    381  *
    382  * Return value: the status of the operation.
    383  **/
    384 GIOStatus
    385 g_io_channel_shutdown (GIOChannel  *channel,
    386 		       gboolean     flush,
    387 		       GError     **err)
    388 {
    389   GIOStatus status, result;
    390   GError *tmperr = NULL;
    391 
    392   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
    393   g_return_val_if_fail (err == NULL || *err == NULL, G_IO_STATUS_ERROR);
    394 
    395   if (channel->write_buf && channel->write_buf->len > 0)
    396     {
    397       if (flush)
    398         {
    399           GIOFlags flags;
    400 
    401           /* Set the channel to blocking, to avoid a busy loop
    402            */
    403           flags = g_io_channel_get_flags (channel);
    404           /* Ignore any errors here, they're irrelevant */
    405           g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL);
    406 
    407           result = g_io_channel_flush (channel, &tmperr);
    408         }
    409       else
    410         result = G_IO_STATUS_NORMAL;
    411 
    412       g_string_truncate(channel->write_buf, 0);
    413     }
    414   else
    415     result = G_IO_STATUS_NORMAL;
    416 
    417   if (channel->partial_write_buf[0] != '\0')
    418     {
    419       if (flush)
    420         g_warning ("Partial character at end of write buffer not flushed.\n");
    421       channel->partial_write_buf[0] = '\0';
    422     }
    423 
    424   status = channel->funcs->io_close (channel, err);
    425 
    426   channel->close_on_unref = FALSE; /* Because we already did */
    427   channel->is_readable = FALSE;
    428   channel->is_writeable = FALSE;
    429   channel->is_seekable = FALSE;
    430 
    431   if (status != G_IO_STATUS_NORMAL)
    432     {
    433       g_clear_error (&tmperr);
    434       return status;
    435     }
    436   else if (result != G_IO_STATUS_NORMAL)
    437     {
    438       g_propagate_error (err, tmperr);
    439       return result;
    440     }
    441   else
    442     return G_IO_STATUS_NORMAL;
    443 }
    444 
    445 /* This function is used for the final flush on close or unref */
    446 static void
    447 g_io_channel_purge (GIOChannel *channel)
    448 {
    449   GError *err = NULL;
    450   GIOStatus status;
    451 
    452   g_return_if_fail (channel != NULL);
    453 
    454   if (channel->write_buf && channel->write_buf->len > 0)
    455     {
    456       GIOFlags flags;
    457 
    458       /* Set the channel to blocking, to avoid a busy loop
    459        */
    460       flags = g_io_channel_get_flags (channel);
    461       g_io_channel_set_flags (channel, flags & ~G_IO_FLAG_NONBLOCK, NULL);
    462 
    463       status = g_io_channel_flush (channel, &err);
    464 
    465       if (err)
    466 	{ /* No way to return the error */
    467 	  g_warning ("Error flushing string: %s", err->message);
    468 	  g_error_free (err);
    469 	}
    470     }
    471 
    472   /* Flush these in case anyone tries to close without unrefing */
    473 
    474   if (channel->read_buf)
    475     g_string_truncate (channel->read_buf, 0);
    476   if (channel->write_buf)
    477     g_string_truncate (channel->write_buf, 0);
    478   if (channel->encoding)
    479     {
    480       if (channel->encoded_read_buf)
    481         g_string_truncate (channel->encoded_read_buf, 0);
    482 
    483       if (channel->partial_write_buf[0] != '\0')
    484         {
    485           g_warning ("Partial character at end of write buffer not flushed.\n");
    486           channel->partial_write_buf[0] = '\0';
    487         }
    488     }
    489 }
    490 
    491 /**
    492  * g_io_create_watch:
    493  * @channel: a #GIOChannel to watch
    494  * @condition: conditions to watch for
    495  *
    496  * Creates a #GSource that's dispatched when @condition is met for the
    497  * given @channel. For example, if condition is #G_IO_IN, the source will
    498  * be dispatched when there's data available for reading.
    499  *
    500  * g_io_add_watch() is a simpler interface to this same functionality, for
    501  * the case where you want to add the source to the default main loop context
    502  * at the default priority.
    503  *
    504  * On Windows, polling a #GSource created to watch a channel for a socket
    505  * puts the socket in non-blocking mode. This is a side-effect of the
    506  * implementation and unavoidable.
    507  *
    508  * Returns: a new #GSource
    509  */
    510 GSource *
    511 g_io_create_watch (GIOChannel   *channel,
    512 		   GIOCondition  condition)
    513 {
    514   g_return_val_if_fail (channel != NULL, NULL);
    515 
    516   return channel->funcs->io_create_watch (channel, condition);
    517 }
    518 
    519 /**
    520  * g_io_add_watch_full:
    521  * @channel: a #GIOChannel
    522  * @priority: the priority of the #GIOChannel source
    523  * @condition: the condition to watch for
    524  * @func: the function to call when the condition is satisfied
    525  * @user_data: user data to pass to @func
    526  * @notify: the function to call when the source is removed
    527  *
    528  * Adds the #GIOChannel into the default main loop context
    529  * with the given priority.
    530  *
    531  * This internally creates a main loop source using g_io_create_watch()
    532  * and attaches it to the main loop context with g_source_attach().
    533  * You can do these steps manuallt if you need greater control.
    534  *
    535  * Returns: the event source id
    536  */
    537 guint
    538 g_io_add_watch_full (GIOChannel    *channel,
    539 		     gint           priority,
    540 		     GIOCondition   condition,
    541 		     GIOFunc        func,
    542 		     gpointer       user_data,
    543 		     GDestroyNotify notify)
    544 {
    545   GSource *source;
    546   guint id;
    547 
    548   g_return_val_if_fail (channel != NULL, 0);
    549 
    550   source = g_io_create_watch (channel, condition);
    551 
    552   if (priority != G_PRIORITY_DEFAULT)
    553     g_source_set_priority (source, priority);
    554   g_source_set_callback (source, (GSourceFunc)func, user_data, notify);
    555 
    556   id = g_source_attach (source, NULL);
    557   g_source_unref (source);
    558 
    559   return id;
    560 }
    561 
    562 /**
    563  * g_io_add_watch:
    564  * @channel: a #GIOChannel
    565  * @condition: the condition to watch for
    566  * @func: the function to call when the condition is satisfied
    567  * @user_data: user data to pass to @func
    568  *
    569  * Adds the #GIOChannel into the default main loop context
    570  * with the default priority.
    571  *
    572  * Returns: the event source id
    573  */
    574 guint
    575 g_io_add_watch (GIOChannel   *channel,
    576 		GIOCondition  condition,
    577 		GIOFunc       func,
    578 		gpointer      user_data)
    579 {
    580   return g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, condition, func, user_data, NULL);
    581 }
    582 
    583 /**
    584  * g_io_channel_get_buffer_condition:
    585  * @channel: A #GIOChannel
    586  *
    587  * This function returns a #GIOCondition depending on whether there
    588  * is data to be read/space to write data in the internal buffers in
    589  * the #GIOChannel. Only the flags %G_IO_IN and %G_IO_OUT may be set.
    590  *
    591  * Return value: A #GIOCondition
    592  **/
    593 GIOCondition
    594 g_io_channel_get_buffer_condition (GIOChannel *channel)
    595 {
    596   GIOCondition condition = 0;
    597 
    598   if (channel->encoding)
    599     {
    600       if (channel->encoded_read_buf && (channel->encoded_read_buf->len > 0))
    601         condition |= G_IO_IN; /* Only return if we have full characters */
    602     }
    603   else
    604     {
    605       if (channel->read_buf && (channel->read_buf->len > 0))
    606         condition |= G_IO_IN;
    607     }
    608 
    609   if (channel->write_buf && (channel->write_buf->len < channel->buf_size))
    610     condition |= G_IO_OUT;
    611 
    612   return condition;
    613 }
    614 
    615 /**
    616  * g_io_channel_error_from_errno:
    617  * @en: an <literal>errno</literal> error number, e.g. %EINVAL
    618  *
    619  * Converts an <literal>errno</literal> error number to a #GIOChannelError.
    620  *
    621  * Return value: a #GIOChannelError error number, e.g.
    622  *      %G_IO_CHANNEL_ERROR_INVAL.
    623  **/
    624 GIOChannelError
    625 g_io_channel_error_from_errno (gint en)
    626 {
    627 #ifdef EAGAIN
    628   g_return_val_if_fail (en != EAGAIN, G_IO_CHANNEL_ERROR_FAILED);
    629 #endif
    630 
    631   switch (en)
    632     {
    633 #ifdef EBADF
    634     case EBADF:
    635       g_warning("Invalid file descriptor.\n");
    636       return G_IO_CHANNEL_ERROR_FAILED;
    637 #endif
    638 
    639 #ifdef EFAULT
    640     case EFAULT:
    641       g_warning("Buffer outside valid address space.\n");
    642       return G_IO_CHANNEL_ERROR_FAILED;
    643 #endif
    644 
    645 #ifdef EFBIG
    646     case EFBIG:
    647       return G_IO_CHANNEL_ERROR_FBIG;
    648 #endif
    649 
    650 #ifdef EINTR
    651     /* In general, we should catch EINTR before we get here,
    652      * but close() is allowed to return EINTR by POSIX, so
    653      * we need to catch it here; EINTR from close() is
    654      * unrecoverable, because it's undefined whether
    655      * the fd was actually closed or not, so we just return
    656      * a generic error code.
    657      */
    658     case EINTR:
    659       return G_IO_CHANNEL_ERROR_FAILED;
    660 #endif
    661 
    662 #ifdef EINVAL
    663     case EINVAL:
    664       return G_IO_CHANNEL_ERROR_INVAL;
    665 #endif
    666 
    667 #ifdef EIO
    668     case EIO:
    669       return G_IO_CHANNEL_ERROR_IO;
    670 #endif
    671 
    672 #ifdef EISDIR
    673     case EISDIR:
    674       return G_IO_CHANNEL_ERROR_ISDIR;
    675 #endif
    676 
    677 #ifdef ENOSPC
    678     case ENOSPC:
    679       return G_IO_CHANNEL_ERROR_NOSPC;
    680 #endif
    681 
    682 #ifdef ENXIO
    683     case ENXIO:
    684       return G_IO_CHANNEL_ERROR_NXIO;
    685 #endif
    686 
    687 #ifdef EOVERFLOW
    688     case EOVERFLOW:
    689       return G_IO_CHANNEL_ERROR_OVERFLOW;
    690 #endif
    691 
    692 #ifdef EPIPE
    693     case EPIPE:
    694       return G_IO_CHANNEL_ERROR_PIPE;
    695 #endif
    696 
    697     default:
    698       return G_IO_CHANNEL_ERROR_FAILED;
    699     }
    700 }
    701 
    702 /**
    703  * g_io_channel_set_buffer_size:
    704  * @channel: a #GIOChannel
    705  * @size: the size of the buffer, or 0 to let GLib pick a good size
    706  *
    707  * Sets the buffer size.
    708  **/
    709 void
    710 g_io_channel_set_buffer_size (GIOChannel *channel,
    711                               gsize       size)
    712 {
    713   g_return_if_fail (channel != NULL);
    714 
    715   if (size == 0)
    716     size = G_IO_NICE_BUF_SIZE;
    717 
    718   if (size < MAX_CHAR_SIZE)
    719     size = MAX_CHAR_SIZE;
    720 
    721   channel->buf_size = size;
    722 }
    723 
    724 /**
    725  * g_io_channel_get_buffer_size:
    726  * @channel: a #GIOChannel
    727  *
    728  * Gets the buffer size.
    729  *
    730  * Return value: the size of the buffer.
    731  **/
    732 gsize
    733 g_io_channel_get_buffer_size (GIOChannel *channel)
    734 {
    735   g_return_val_if_fail (channel != NULL, 0);
    736 
    737   return channel->buf_size;
    738 }
    739 
    740 /**
    741  * g_io_channel_set_line_term:
    742  * @channel: a #GIOChannel
    743  * @line_term: The line termination string. Use %NULL for autodetect.
    744  *             Autodetection breaks on "\n", "\r\n", "\r", "\0", and
    745  *             the Unicode paragraph separator. Autodetection should
    746  *             not be used for anything other than file-based channels.
    747  * @length: The length of the termination string. If -1 is passed, the
    748  *          string is assumed to be nul-terminated. This option allows
    749  *          termination strings with embedded nuls.
    750  *
    751  * This sets the string that #GIOChannel uses to determine
    752  * where in the file a line break occurs.
    753  **/
    754 void
    755 g_io_channel_set_line_term (GIOChannel	*channel,
    756                             const gchar	*line_term,
    757 			    gint         length)
    758 {
    759   g_return_if_fail (channel != NULL);
    760   g_return_if_fail (line_term == NULL || length != 0); /* Disallow "" */
    761 
    762   if (line_term == NULL)
    763     length = 0;
    764   else if (length < 0)
    765     length = strlen (line_term);
    766 
    767   g_free (channel->line_term);
    768   channel->line_term = line_term ? g_memdup (line_term, length) : NULL;
    769   channel->line_term_len = length;
    770 }
    771 
    772 /**
    773  * g_io_channel_get_line_term:
    774  * @channel: a #GIOChannel
    775  * @length: a location to return the length of the line terminator
    776  *
    777  * This returns the string that #GIOChannel uses to determine
    778  * where in the file a line break occurs. A value of %NULL
    779  * indicates autodetection.
    780  *
    781  * Return value: The line termination string. This value
    782  *   is owned by GLib and must not be freed.
    783  **/
    784 G_CONST_RETURN gchar*
    785 g_io_channel_get_line_term (GIOChannel *channel,
    786 			    gint       *length)
    787 {
    788   g_return_val_if_fail (channel != NULL, NULL);
    789 
    790   if (length)
    791     *length = channel->line_term_len;
    792 
    793   return channel->line_term;
    794 }
    795 
    796 /**
    797  * g_io_channel_set_flags:
    798  * @channel: a #GIOChannel
    799  * @flags: the flags to set on the IO channel
    800  * @error: A location to return an error of type #GIOChannelError
    801  *
    802  * Sets the (writeable) flags in @channel to (@flags & %G_IO_CHANNEL_SET_MASK).
    803  *
    804  * Return value: the status of the operation.
    805  **/
    806 GIOStatus
    807 g_io_channel_set_flags (GIOChannel  *channel,
    808                         GIOFlags     flags,
    809                         GError     **error)
    810 {
    811   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
    812   g_return_val_if_fail ((error == NULL) || (*error == NULL),
    813 			G_IO_STATUS_ERROR);
    814 
    815   return (*channel->funcs->io_set_flags) (channel,
    816 					  flags & G_IO_FLAG_SET_MASK,
    817 					  error);
    818 }
    819 
    820 /**
    821  * g_io_channel_get_flags:
    822  * @channel: a #GIOChannel
    823  *
    824  * Gets the current flags for a #GIOChannel, including read-only
    825  * flags such as %G_IO_FLAG_IS_READABLE.
    826  *
    827  * The values of the flags %G_IO_FLAG_IS_READABLE and %G_IO_FLAG_IS_WRITEABLE
    828  * are cached for internal use by the channel when it is created.
    829  * If they should change at some later point (e.g. partial shutdown
    830  * of a socket with the UNIX shutdown() function), the user
    831  * should immediately call g_io_channel_get_flags() to update
    832  * the internal values of these flags.
    833  *
    834  * Return value: the flags which are set on the channel
    835  **/
    836 GIOFlags
    837 g_io_channel_get_flags (GIOChannel *channel)
    838 {
    839   GIOFlags flags;
    840 
    841   g_return_val_if_fail (channel != NULL, 0);
    842 
    843   flags = (* channel->funcs->io_get_flags) (channel);
    844 
    845   /* Cross implementation code */
    846 
    847   if (channel->is_seekable)
    848     flags |= G_IO_FLAG_IS_SEEKABLE;
    849   if (channel->is_readable)
    850     flags |= G_IO_FLAG_IS_READABLE;
    851   if (channel->is_writeable)
    852     flags |= G_IO_FLAG_IS_WRITEABLE;
    853 
    854   return flags;
    855 }
    856 
    857 /**
    858  * g_io_channel_set_close_on_unref:
    859  * @channel: a #GIOChannel
    860  * @do_close: Whether to close the channel on the final unref of
    861  *            the GIOChannel data structure. The default value of
    862  *            this is %TRUE for channels created by g_io_channel_new_file (),
    863  *            and %FALSE for all other channels.
    864  *
    865  * Setting this flag to %TRUE for a channel you have already closed
    866  * can cause problems.
    867  **/
    868 void
    869 g_io_channel_set_close_on_unref	(GIOChannel *channel,
    870 				 gboolean    do_close)
    871 {
    872   g_return_if_fail (channel != NULL);
    873 
    874   channel->close_on_unref = do_close;
    875 }
    876 
    877 /**
    878  * g_io_channel_get_close_on_unref:
    879  * @channel: a #GIOChannel.
    880  *
    881  * Returns whether the file/socket/whatever associated with @channel
    882  * will be closed when @channel receives its final unref and is
    883  * destroyed. The default value of this is %TRUE for channels created
    884  * by g_io_channel_new_file (), and %FALSE for all other channels.
    885  *
    886  * Return value: Whether the channel will be closed on the final unref of
    887  *               the GIOChannel data structure.
    888  **/
    889 gboolean
    890 g_io_channel_get_close_on_unref	(GIOChannel *channel)
    891 {
    892   g_return_val_if_fail (channel != NULL, FALSE);
    893 
    894   return channel->close_on_unref;
    895 }
    896 
    897 /**
    898  * g_io_channel_seek_position:
    899  * @channel: a #GIOChannel
    900  * @offset: The offset in bytes from the position specified by @type
    901  * @type: a #GSeekType. The type %G_SEEK_CUR is only allowed in those
    902  *                      cases where a call to g_io_channel_set_encoding ()
    903  *                      is allowed. See the documentation for
    904  *                      g_io_channel_set_encoding () for details.
    905  * @error: A location to return an error of type #GIOChannelError
    906  *
    907  * Replacement for g_io_channel_seek() with the new API.
    908  *
    909  * Return value: the status of the operation.
    910  **/
    911 GIOStatus
    912 g_io_channel_seek_position (GIOChannel  *channel,
    913                             gint64       offset,
    914                             GSeekType    type,
    915                             GError     **error)
    916 {
    917   GIOStatus status;
    918 
    919   /* For files, only one of the read and write buffers can contain data.
    920    * For sockets, both can contain data.
    921    */
    922 
    923   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
    924   g_return_val_if_fail ((error == NULL) || (*error == NULL),
    925 			G_IO_STATUS_ERROR);
    926   g_return_val_if_fail (channel->is_seekable, G_IO_STATUS_ERROR);
    927 
    928   switch (type)
    929     {
    930       case G_SEEK_CUR: /* The user is seeking relative to the head of the buffer */
    931         if (channel->use_buffer)
    932           {
    933             if (channel->do_encode && channel->encoded_read_buf
    934                 && channel->encoded_read_buf->len > 0)
    935               {
    936                 g_warning ("Seek type G_SEEK_CUR not allowed for this"
    937                   " channel's encoding.\n");
    938                 return G_IO_STATUS_ERROR;
    939               }
    940           if (channel->read_buf)
    941             offset -= channel->read_buf->len;
    942           if (channel->encoded_read_buf)
    943             {
    944               g_assert (channel->encoded_read_buf->len == 0 || !channel->do_encode);
    945 
    946               /* If there's anything here, it's because the encoding is UTF-8,
    947                * so we can just subtract the buffer length, the same as for
    948                * the unencoded data.
    949                */
    950 
    951               offset -= channel->encoded_read_buf->len;
    952             }
    953           }
    954         break;
    955       case G_SEEK_SET:
    956       case G_SEEK_END:
    957         break;
    958       default:
    959         g_warning ("g_io_channel_seek_position: unknown seek type");
    960         return G_IO_STATUS_ERROR;
    961     }
    962 
    963   if (channel->use_buffer)
    964     {
    965       status = g_io_channel_flush (channel, error);
    966       if (status != G_IO_STATUS_NORMAL)
    967         return status;
    968     }
    969 
    970   status = channel->funcs->io_seek (channel, offset, type, error);
    971 
    972   if ((status == G_IO_STATUS_NORMAL) && (channel->use_buffer))
    973     {
    974       if (channel->read_buf)
    975         g_string_truncate (channel->read_buf, 0);
    976 
    977       /* Conversion state no longer matches position in file */
    978       if (channel->read_cd != (GIConv) -1)
    979         g_iconv (channel->read_cd, NULL, NULL, NULL, NULL);
    980       if (channel->write_cd != (GIConv) -1)
    981         g_iconv (channel->write_cd, NULL, NULL, NULL, NULL);
    982 
    983       if (channel->encoded_read_buf)
    984         {
    985           g_assert (channel->encoded_read_buf->len == 0 || !channel->do_encode);
    986           g_string_truncate (channel->encoded_read_buf, 0);
    987         }
    988 
    989       if (channel->partial_write_buf[0] != '\0')
    990         {
    991           g_warning ("Partial character at end of write buffer not flushed.\n");
    992           channel->partial_write_buf[0] = '\0';
    993         }
    994     }
    995 
    996   return status;
    997 }
    998 
    999 /**
   1000  * g_io_channel_flush:
   1001  * @channel: a #GIOChannel
   1002  * @error: location to store an error of type #GIOChannelError
   1003  *
   1004  * Flushes the write buffer for the GIOChannel.
   1005  *
   1006  * Return value: the status of the operation: One of
   1007  *   #G_IO_STATUS_NORMAL, #G_IO_STATUS_AGAIN, or
   1008  *   #G_IO_STATUS_ERROR.
   1009  **/
   1010 GIOStatus
   1011 g_io_channel_flush (GIOChannel	*channel,
   1012 		    GError     **error)
   1013 {
   1014   GIOStatus status;
   1015   gsize this_time = 1, bytes_written = 0;
   1016 
   1017   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
   1018   g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR);
   1019 
   1020   if (channel->write_buf == NULL || channel->write_buf->len == 0)
   1021     return G_IO_STATUS_NORMAL;
   1022 
   1023   do
   1024     {
   1025       g_assert (this_time > 0);
   1026 
   1027       status = channel->funcs->io_write (channel,
   1028 					 channel->write_buf->str + bytes_written,
   1029 					 channel->write_buf->len - bytes_written,
   1030 					 &this_time, error);
   1031       bytes_written += this_time;
   1032     }
   1033   while ((bytes_written < channel->write_buf->len)
   1034          && (status == G_IO_STATUS_NORMAL));
   1035 
   1036   g_string_erase (channel->write_buf, 0, bytes_written);
   1037 
   1038   return status;
   1039 }
   1040 
   1041 /**
   1042  * g_io_channel_set_buffered:
   1043  * @channel: a #GIOChannel
   1044  * @buffered: whether to set the channel buffered or unbuffered
   1045  *
   1046  * The buffering state can only be set if the channel's encoding
   1047  * is %NULL. For any other encoding, the channel must be buffered.
   1048  *
   1049  * A buffered channel can only be set unbuffered if the channel's
   1050  * internal buffers have been flushed. Newly created channels or
   1051  * channels which have returned %G_IO_STATUS_EOF
   1052  * not require such a flush. For write-only channels, a call to
   1053  * g_io_channel_flush () is sufficient. For all other channels,
   1054  * the buffers may be flushed by a call to g_io_channel_seek_position ().
   1055  * This includes the possibility of seeking with seek type %G_SEEK_CUR
   1056  * and an offset of zero. Note that this means that socket-based
   1057  * channels cannot be set unbuffered once they have had data
   1058  * read from them.
   1059  *
   1060  * On unbuffered channels, it is safe to mix read and write
   1061  * calls from the new and old APIs, if this is necessary for
   1062  * maintaining old code.
   1063  *
   1064  * The default state of the channel is buffered.
   1065  **/
   1066 void
   1067 g_io_channel_set_buffered (GIOChannel *channel,
   1068                            gboolean    buffered)
   1069 {
   1070   g_return_if_fail (channel != NULL);
   1071 
   1072   if (channel->encoding != NULL)
   1073     {
   1074       g_warning ("Need to have NULL encoding to set the buffering state of the "
   1075                  "channel.\n");
   1076       return;
   1077     }
   1078 
   1079   g_return_if_fail (!channel->read_buf || channel->read_buf->len == 0);
   1080   g_return_if_fail (!channel->write_buf || channel->write_buf->len == 0);
   1081 
   1082   channel->use_buffer = buffered;
   1083 }
   1084 
   1085 /**
   1086  * g_io_channel_get_buffered:
   1087  * @channel: a #GIOChannel
   1088  *
   1089  * Returns whether @channel is buffered.
   1090  *
   1091  * Return Value: %TRUE if the @channel is buffered.
   1092  **/
   1093 gboolean
   1094 g_io_channel_get_buffered (GIOChannel *channel)
   1095 {
   1096   g_return_val_if_fail (channel != NULL, FALSE);
   1097 
   1098   return channel->use_buffer;
   1099 }
   1100 
   1101 /**
   1102  * g_io_channel_set_encoding:
   1103  * @channel: a #GIOChannel
   1104  * @encoding: the encoding type
   1105  * @error: location to store an error of type #GConvertError
   1106  *
   1107  * Sets the encoding for the input/output of the channel.
   1108  * The internal encoding is always UTF-8. The default encoding
   1109  * for the external file is UTF-8.
   1110  *
   1111  * The encoding %NULL is safe to use with binary data.
   1112  *
   1113  * The encoding can only be set if one of the following conditions
   1114  * is true:
   1115  * <itemizedlist>
   1116  * <listitem><para>
   1117  *    The channel was just created, and has not been written to or read
   1118  *    from yet.
   1119  * </para></listitem>
   1120  * <listitem><para>
   1121  *    The channel is write-only.
   1122  * </para></listitem>
   1123  * <listitem><para>
   1124  *    The channel is a file, and the file pointer was just
   1125  *    repositioned by a call to g_io_channel_seek_position().
   1126  *    (This flushes all the internal buffers.)
   1127  * </para></listitem>
   1128  * <listitem><para>
   1129  *    The current encoding is %NULL or UTF-8.
   1130  * </para></listitem>
   1131  * <listitem><para>
   1132  *    One of the (new API) read functions has just returned %G_IO_STATUS_EOF
   1133  *    (or, in the case of g_io_channel_read_to_end(), %G_IO_STATUS_NORMAL).
   1134  * </para></listitem>
   1135  * <listitem><para>
   1136  *    One of the functions g_io_channel_read_chars() or
   1137  *    g_io_channel_read_unichar() has returned %G_IO_STATUS_AGAIN or
   1138  *    %G_IO_STATUS_ERROR. This may be useful in the case of
   1139  *    %G_CONVERT_ERROR_ILLEGAL_SEQUENCE.
   1140  *    Returning one of these statuses from g_io_channel_read_line(),
   1141  *    g_io_channel_read_line_string(), or g_io_channel_read_to_end()
   1142  *    does <emphasis>not</emphasis> guarantee that the encoding can
   1143  *    be changed.
   1144  * </para></listitem>
   1145  * </itemizedlist>
   1146  * Channels which do not meet one of the above conditions cannot call
   1147  * g_io_channel_seek_position() with an offset of %G_SEEK_CUR, and, if
   1148  * they are "seekable", cannot call g_io_channel_write_chars() after
   1149  * calling one of the API "read" functions.
   1150  *
   1151  * Return Value: %G_IO_STATUS_NORMAL if the encoding was successfully set.
   1152  **/
   1153 GIOStatus
   1154 g_io_channel_set_encoding (GIOChannel	*channel,
   1155                            const gchar	*encoding,
   1156 			   GError      **error)
   1157 {
   1158   GIConv read_cd, write_cd;
   1159   gboolean did_encode;
   1160 
   1161   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
   1162   g_return_val_if_fail ((error == NULL) || (*error == NULL), G_IO_STATUS_ERROR);
   1163 
   1164   /* Make sure the encoded buffers are empty */
   1165 
   1166   g_return_val_if_fail (!channel->do_encode || !channel->encoded_read_buf ||
   1167 			channel->encoded_read_buf->len == 0, G_IO_STATUS_ERROR);
   1168 
   1169   if (!channel->use_buffer)
   1170     {
   1171       g_warning ("Need to set the channel buffered before setting the encoding.\n");
   1172       g_warning ("Assuming this is what you meant and acting accordingly.\n");
   1173 
   1174       channel->use_buffer = TRUE;
   1175     }
   1176 
   1177   if (channel->partial_write_buf[0] != '\0')
   1178     {
   1179       g_warning ("Partial character at end of write buffer not flushed.\n");
   1180       channel->partial_write_buf[0] = '\0';
   1181     }
   1182 
   1183   did_encode = channel->do_encode;
   1184 
   1185   if (!encoding || strcmp (encoding, "UTF8") == 0 || strcmp (encoding, "UTF-8") == 0)
   1186     {
   1187       channel->do_encode = FALSE;
   1188       read_cd = write_cd = (GIConv) -1;
   1189     }
   1190   else
   1191     {
   1192       gint err = 0;
   1193       const gchar *from_enc = NULL, *to_enc = NULL;
   1194 
   1195       if (channel->is_readable)
   1196         {
   1197           read_cd = g_iconv_open ("UTF-8", encoding);
   1198 
   1199           if (read_cd == (GIConv) -1)
   1200             {
   1201               err = errno;
   1202               from_enc = encoding;
   1203               to_enc = "UTF-8";
   1204             }
   1205         }
   1206       else
   1207         read_cd = (GIConv) -1;
   1208 
   1209       if (channel->is_writeable && err == 0)
   1210         {
   1211           write_cd = g_iconv_open (encoding, "UTF-8");
   1212 
   1213           if (write_cd == (GIConv) -1)
   1214             {
   1215               err = errno;
   1216               from_enc = "UTF-8";
   1217               to_enc = encoding;
   1218             }
   1219         }
   1220       else
   1221         write_cd = (GIConv) -1;
   1222 
   1223       if (err != 0)
   1224         {
   1225           g_assert (from_enc);
   1226           g_assert (to_enc);
   1227 
   1228           if (err == EINVAL)
   1229             g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_NO_CONVERSION,
   1230                          _("Conversion from character set '%s' to '%s' is not supported"),
   1231                          from_enc, to_enc);
   1232           else
   1233             g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
   1234                          _("Could not open converter from '%s' to '%s': %s"),
   1235                          from_enc, to_enc, g_strerror (err));
   1236 
   1237           if (read_cd != (GIConv) -1)
   1238             g_iconv_close (read_cd);
   1239           if (write_cd != (GIConv) -1)
   1240             g_iconv_close (write_cd);
   1241 
   1242           return G_IO_STATUS_ERROR;
   1243         }
   1244 
   1245       channel->do_encode = TRUE;
   1246     }
   1247 
   1248   /* The encoding is ok, so set the fields in channel */
   1249 
   1250   if (channel->read_cd != (GIConv) -1)
   1251     g_iconv_close (channel->read_cd);
   1252   if (channel->write_cd != (GIConv) -1)
   1253     g_iconv_close (channel->write_cd);
   1254 
   1255   if (channel->encoded_read_buf && channel->encoded_read_buf->len > 0)
   1256     {
   1257       g_assert (!did_encode); /* Encoding UTF-8, NULL doesn't use encoded_read_buf */
   1258 
   1259       /* This is just validated UTF-8, so we can copy it back into read_buf
   1260        * so it can be encoded in whatever the new encoding is.
   1261        */
   1262 
   1263       g_string_prepend_len (channel->read_buf, channel->encoded_read_buf->str,
   1264                             channel->encoded_read_buf->len);
   1265       g_string_truncate (channel->encoded_read_buf, 0);
   1266     }
   1267 
   1268   channel->read_cd = read_cd;
   1269   channel->write_cd = write_cd;
   1270 
   1271   g_free (channel->encoding);
   1272   channel->encoding = g_strdup (encoding);
   1273 
   1274   return G_IO_STATUS_NORMAL;
   1275 }
   1276 
   1277 /**
   1278  * g_io_channel_get_encoding:
   1279  * @channel: a #GIOChannel
   1280  *
   1281  * Gets the encoding for the input/output of the channel.
   1282  * The internal encoding is always UTF-8. The encoding %NULL
   1283  * makes the channel safe for binary data.
   1284  *
   1285  * Return value: A string containing the encoding, this string is
   1286  *   owned by GLib and must not be freed.
   1287  **/
   1288 G_CONST_RETURN gchar*
   1289 g_io_channel_get_encoding (GIOChannel *channel)
   1290 {
   1291   g_return_val_if_fail (channel != NULL, NULL);
   1292 
   1293   return channel->encoding;
   1294 }
   1295 
   1296 static GIOStatus
   1297 g_io_channel_fill_buffer (GIOChannel  *channel,
   1298                           GError     **err)
   1299 {
   1300   gsize read_size, cur_len, oldlen;
   1301   GIOStatus status;
   1302 
   1303   if (channel->is_seekable && channel->write_buf && channel->write_buf->len > 0)
   1304     {
   1305       status = g_io_channel_flush (channel, err);
   1306       if (status != G_IO_STATUS_NORMAL)
   1307         return status;
   1308     }
   1309   if (channel->is_seekable && channel->partial_write_buf[0] != '\0')
   1310     {
   1311       g_warning ("Partial character at end of write buffer not flushed.\n");
   1312       channel->partial_write_buf[0] = '\0';
   1313     }
   1314 
   1315   if (!channel->read_buf)
   1316     channel->read_buf = g_string_sized_new (channel->buf_size);
   1317 
   1318   cur_len = channel->read_buf->len;
   1319 
   1320   g_string_set_size (channel->read_buf, channel->read_buf->len + channel->buf_size);
   1321 
   1322   status = channel->funcs->io_read (channel, channel->read_buf->str + cur_len,
   1323                                     channel->buf_size, &read_size, err);
   1324 
   1325   g_assert ((status == G_IO_STATUS_NORMAL) || (read_size == 0));
   1326 
   1327   g_string_truncate (channel->read_buf, read_size + cur_len);
   1328 
   1329   if ((status != G_IO_STATUS_NORMAL) &&
   1330       ((status != G_IO_STATUS_EOF) || (channel->read_buf->len == 0)))
   1331     return status;
   1332 
   1333   g_assert (channel->read_buf->len > 0);
   1334 
   1335   if (channel->encoded_read_buf)
   1336     oldlen = channel->encoded_read_buf->len;
   1337   else
   1338     {
   1339       oldlen = 0;
   1340       if (channel->encoding)
   1341         channel->encoded_read_buf = g_string_sized_new (channel->buf_size);
   1342     }
   1343 
   1344   if (channel->do_encode)
   1345     {
   1346       gsize errnum, inbytes_left, outbytes_left;
   1347       gchar *inbuf, *outbuf;
   1348       int errval;
   1349 
   1350       g_assert (channel->encoded_read_buf);
   1351 
   1352 reencode:
   1353 
   1354       inbytes_left = channel->read_buf->len;
   1355       outbytes_left = MAX (channel->read_buf->len,
   1356                            channel->encoded_read_buf->allocated_len
   1357                            - channel->encoded_read_buf->len - 1); /* 1 for NULL */
   1358       outbytes_left = MAX (outbytes_left, 6);
   1359 
   1360       inbuf = channel->read_buf->str;
   1361       g_string_set_size (channel->encoded_read_buf,
   1362                          channel->encoded_read_buf->len + outbytes_left);
   1363       outbuf = channel->encoded_read_buf->str + channel->encoded_read_buf->len
   1364                - outbytes_left;
   1365 
   1366       errnum = g_iconv (channel->read_cd, &inbuf, &inbytes_left,
   1367 			&outbuf, &outbytes_left);
   1368       errval = errno;
   1369 
   1370       g_assert (inbuf + inbytes_left == channel->read_buf->str
   1371                 + channel->read_buf->len);
   1372       g_assert (outbuf + outbytes_left == channel->encoded_read_buf->str
   1373                 + channel->encoded_read_buf->len);
   1374 
   1375       g_string_erase (channel->read_buf, 0,
   1376 		      channel->read_buf->len - inbytes_left);
   1377       g_string_truncate (channel->encoded_read_buf,
   1378 			 channel->encoded_read_buf->len - outbytes_left);
   1379 
   1380       if (errnum == (gsize) -1)
   1381         {
   1382           switch (errval)
   1383             {
   1384               case EINVAL:
   1385                 if ((oldlen == channel->encoded_read_buf->len)
   1386                   && (status == G_IO_STATUS_EOF))
   1387                   status = G_IO_STATUS_EOF;
   1388                 else
   1389                   status = G_IO_STATUS_NORMAL;
   1390                 break;
   1391               case E2BIG:
   1392                 /* Buffer size at least 6, wrote at least on character */
   1393                 g_assert (inbuf != channel->read_buf->str);
   1394                 goto reencode;
   1395               case EILSEQ:
   1396                 if (oldlen < channel->encoded_read_buf->len)
   1397                   status = G_IO_STATUS_NORMAL;
   1398                 else
   1399                   {
   1400                     g_set_error_literal (err, G_CONVERT_ERROR,
   1401                       G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
   1402                       _("Invalid byte sequence in conversion input"));
   1403                     return G_IO_STATUS_ERROR;
   1404                   }
   1405                 break;
   1406               default:
   1407                 g_assert (errval != EBADF); /* The converter should be open */
   1408                 g_set_error (err, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
   1409                   _("Error during conversion: %s"), g_strerror (errval));
   1410                 return G_IO_STATUS_ERROR;
   1411             }
   1412         }
   1413       g_assert ((status != G_IO_STATUS_NORMAL)
   1414                || (channel->encoded_read_buf->len > 0));
   1415     }
   1416   else if (channel->encoding) /* UTF-8 */
   1417     {
   1418       gchar *nextchar, *lastchar;
   1419 
   1420       g_assert (channel->encoded_read_buf);
   1421 
   1422       nextchar = channel->read_buf->str;
   1423       lastchar = channel->read_buf->str + channel->read_buf->len;
   1424 
   1425       while (nextchar < lastchar)
   1426         {
   1427           gunichar val_char;
   1428 
   1429           val_char = g_utf8_get_char_validated (nextchar, lastchar - nextchar);
   1430 
   1431           switch (val_char)
   1432             {
   1433               case -2:
   1434                 /* stop, leave partial character in buffer */
   1435                 lastchar = nextchar;
   1436                 break;
   1437               case -1:
   1438                 if (oldlen < channel->encoded_read_buf->len)
   1439                   status = G_IO_STATUS_NORMAL;
   1440                 else
   1441                   {
   1442                     g_set_error_literal (err, G_CONVERT_ERROR,
   1443                       G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
   1444                       _("Invalid byte sequence in conversion input"));
   1445                     status = G_IO_STATUS_ERROR;
   1446                   }
   1447                 lastchar = nextchar;
   1448                 break;
   1449               default:
   1450                 nextchar = g_utf8_next_char (nextchar);
   1451                 break;
   1452             }
   1453         }
   1454 
   1455       if (lastchar > channel->read_buf->str)
   1456         {
   1457           gint copy_len = lastchar - channel->read_buf->str;
   1458 
   1459           g_string_append_len (channel->encoded_read_buf, channel->read_buf->str,
   1460                                copy_len);
   1461           g_string_erase (channel->read_buf, 0, copy_len);
   1462         }
   1463     }
   1464 
   1465   return status;
   1466 }
   1467 
   1468 /**
   1469  * g_io_channel_read_line:
   1470  * @channel: a #GIOChannel
   1471  * @str_return: The line read from the #GIOChannel, including the
   1472  *              line terminator. This data should be freed with g_free()
   1473  *              when no longer needed. This is a nul-terminated string.
   1474  *              If a @length of zero is returned, this will be %NULL instead.
   1475  * @length: location to store length of the read data, or %NULL
   1476  * @terminator_pos: location to store position of line terminator, or %NULL
   1477  * @error: A location to return an error of type #GConvertError
   1478  *         or #GIOChannelError
   1479  *
   1480  * Reads a line, including the terminating character(s),
   1481  * from a #GIOChannel into a newly-allocated string.
   1482  * @str_return will contain allocated memory if the return
   1483  * is %G_IO_STATUS_NORMAL.
   1484  *
   1485  * Return value: the status of the operation.
   1486  **/
   1487 GIOStatus
   1488 g_io_channel_read_line (GIOChannel  *channel,
   1489                         gchar      **str_return,
   1490                         gsize       *length,
   1491 			gsize       *terminator_pos,
   1492 		        GError     **error)
   1493 {
   1494   GIOStatus status;
   1495   gsize got_length;
   1496 
   1497   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
   1498   g_return_val_if_fail (str_return != NULL, G_IO_STATUS_ERROR);
   1499   g_return_val_if_fail ((error == NULL) || (*error == NULL),
   1500 			G_IO_STATUS_ERROR);
   1501   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
   1502 
   1503   status = g_io_channel_read_line_backend (channel, &got_length, terminator_pos, error);
   1504 
   1505   if (length)
   1506     *length = got_length;
   1507 
   1508   if (status == G_IO_STATUS_NORMAL)
   1509     {
   1510       g_assert (USE_BUF (channel));
   1511       *str_return = g_strndup (USE_BUF (channel)->str, got_length);
   1512       g_string_erase (USE_BUF (channel), 0, got_length);
   1513     }
   1514   else
   1515     *str_return = NULL;
   1516 
   1517   return status;
   1518 }
   1519 
   1520 /**
   1521  * g_io_channel_read_line_string:
   1522  * @channel: a #GIOChannel
   1523  * @buffer: a #GString into which the line will be written.
   1524  *          If @buffer already contains data, the old data will
   1525  *          be overwritten.
   1526  * @terminator_pos: location to store position of line terminator, or %NULL
   1527  * @error: a location to store an error of type #GConvertError
   1528  *         or #GIOChannelError
   1529  *
   1530  * Reads a line from a #GIOChannel, using a #GString as a buffer.
   1531  *
   1532  * Return value: the status of the operation.
   1533  **/
   1534 GIOStatus
   1535 g_io_channel_read_line_string (GIOChannel  *channel,
   1536                                GString	   *buffer,
   1537 			       gsize       *terminator_pos,
   1538                                GError	  **error)
   1539 {
   1540   gsize length;
   1541   GIOStatus status;
   1542 
   1543   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
   1544   g_return_val_if_fail (buffer != NULL, G_IO_STATUS_ERROR);
   1545   g_return_val_if_fail ((error == NULL) || (*error == NULL),
   1546 			G_IO_STATUS_ERROR);
   1547   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
   1548 
   1549   if (buffer->len > 0)
   1550     g_string_truncate (buffer, 0); /* clear out the buffer */
   1551 
   1552   status = g_io_channel_read_line_backend (channel, &length, terminator_pos, error);
   1553 
   1554   if (status == G_IO_STATUS_NORMAL)
   1555     {
   1556       g_assert (USE_BUF (channel));
   1557       g_string_append_len (buffer, USE_BUF (channel)->str, length);
   1558       g_string_erase (USE_BUF (channel), 0, length);
   1559     }
   1560 
   1561   return status;
   1562 }
   1563 
   1564 
   1565 static GIOStatus
   1566 g_io_channel_read_line_backend (GIOChannel  *channel,
   1567                                 gsize       *length,
   1568                                 gsize       *terminator_pos,
   1569                                 GError     **error)
   1570 {
   1571   GIOStatus status;
   1572   gsize checked_to, line_term_len, line_length, got_term_len;
   1573   gboolean first_time = TRUE;
   1574 
   1575   if (!channel->use_buffer)
   1576     {
   1577       /* Can't do a raw read in read_line */
   1578       g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
   1579                            _("Can't do a raw read in g_io_channel_read_line_string"));
   1580       return G_IO_STATUS_ERROR;
   1581     }
   1582 
   1583   status = G_IO_STATUS_NORMAL;
   1584 
   1585   if (channel->line_term)
   1586     line_term_len = channel->line_term_len;
   1587   else
   1588     line_term_len = 3;
   1589     /* This value used for setting checked_to, it's the longest of the four
   1590      * we autodetect for.
   1591      */
   1592 
   1593   checked_to = 0;
   1594 
   1595   while (TRUE)
   1596     {
   1597       gchar *nextchar, *lastchar;
   1598       GString *use_buf;
   1599 
   1600       if (!first_time || (BUF_LEN (USE_BUF (channel)) == 0))
   1601         {
   1602 read_again:
   1603           status = g_io_channel_fill_buffer (channel, error);
   1604           switch (status)
   1605             {
   1606               case G_IO_STATUS_NORMAL:
   1607                 if (BUF_LEN (USE_BUF (channel)) == 0)
   1608                   /* Can happen when using conversion and only read
   1609                    * part of a character
   1610                    */
   1611                   {
   1612                     first_time = FALSE;
   1613                     continue;
   1614                   }
   1615                 break;
   1616               case G_IO_STATUS_EOF:
   1617                 if (BUF_LEN (USE_BUF (channel)) == 0)
   1618                   {
   1619                     if (length)
   1620                       *length = 0;
   1621 
   1622                     if (channel->encoding && channel->read_buf->len != 0)
   1623                       {
   1624                         g_set_error_literal (error, G_CONVERT_ERROR,
   1625                                              G_CONVERT_ERROR_PARTIAL_INPUT,
   1626                                              _("Leftover unconverted data in "
   1627                                                "read buffer"));
   1628                         return G_IO_STATUS_ERROR;
   1629                       }
   1630                     else
   1631                       return G_IO_STATUS_EOF;
   1632                   }
   1633                 break;
   1634               default:
   1635                 if (length)
   1636                   *length = 0;
   1637                 return status;
   1638             }
   1639         }
   1640 
   1641       g_assert (BUF_LEN (USE_BUF (channel)) != 0);
   1642 
   1643       use_buf = USE_BUF (channel); /* The buffer has been created by this point */
   1644 
   1645       first_time = FALSE;
   1646 
   1647       lastchar = use_buf->str + use_buf->len;
   1648 
   1649       for (nextchar = use_buf->str + checked_to; nextchar < lastchar;
   1650            channel->encoding ? nextchar = g_utf8_next_char (nextchar) : nextchar++)
   1651         {
   1652           if (channel->line_term)
   1653             {
   1654               if (memcmp (channel->line_term, nextchar, line_term_len) == 0)
   1655                 {
   1656                   line_length = nextchar - use_buf->str;
   1657                   got_term_len = line_term_len;
   1658                   goto done;
   1659                 }
   1660             }
   1661           else /* auto detect */
   1662             {
   1663               switch (*nextchar)
   1664                 {
   1665                   case '\n': /* unix */
   1666                     line_length = nextchar - use_buf->str;
   1667                     got_term_len = 1;
   1668                     goto done;
   1669                   case '\r': /* Warning: do not use with sockets */
   1670                     line_length = nextchar - use_buf->str;
   1671                     if ((nextchar == lastchar - 1) && (status != G_IO_STATUS_EOF)
   1672                        && (lastchar == use_buf->str + use_buf->len))
   1673                       goto read_again; /* Try to read more data */
   1674                     if ((nextchar < lastchar - 1) && (*(nextchar + 1) == '\n')) /* dos */
   1675                       got_term_len = 2;
   1676                     else /* mac */
   1677                       got_term_len = 1;
   1678                     goto done;
   1679                   case '\xe2': /* Unicode paragraph separator */
   1680                     if (strncmp ("\xe2\x80\xa9", nextchar, 3) == 0)
   1681                       {
   1682                         line_length = nextchar - use_buf->str;
   1683                         got_term_len = 3;
   1684                         goto done;
   1685                       }
   1686                     break;
   1687                   case '\0': /* Embeded null in input */
   1688                     line_length = nextchar - use_buf->str;
   1689                     got_term_len = 1;
   1690                     goto done;
   1691                   default: /* no match */
   1692                     break;
   1693                 }
   1694             }
   1695         }
   1696 
   1697       /* If encoding != NULL, valid UTF-8, didn't overshoot */
   1698       g_assert (nextchar == lastchar);
   1699 
   1700       /* Check for EOF */
   1701 
   1702       if (status == G_IO_STATUS_EOF)
   1703         {
   1704           if (channel->encoding && channel->read_buf->len > 0)
   1705             {
   1706               g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT,
   1707                                    _("Channel terminates in a partial character"));
   1708               return G_IO_STATUS_ERROR;
   1709             }
   1710           line_length = use_buf->len;
   1711           got_term_len = 0;
   1712           break;
   1713         }
   1714 
   1715       if (use_buf->len > line_term_len - 1)
   1716 	checked_to = use_buf->len - (line_term_len - 1);
   1717       else
   1718 	checked_to = 0;
   1719     }
   1720 
   1721 done:
   1722 
   1723   if (terminator_pos)
   1724     *terminator_pos = line_length;
   1725 
   1726   if (length)
   1727     *length = line_length + got_term_len;
   1728 
   1729   return G_IO_STATUS_NORMAL;
   1730 }
   1731 
   1732 /**
   1733  * g_io_channel_read_to_end:
   1734  * @channel: a #GIOChannel
   1735  * @str_return: Location to store a pointer to a string holding
   1736  *              the remaining data in the #GIOChannel. This data should
   1737  *              be freed with g_free() when no longer needed. This
   1738  *              data is terminated by an extra nul character, but there
   1739  *              may be other nuls in the intervening data.
   1740  * @length: location to store length of the data
   1741  * @error: location to return an error of type #GConvertError
   1742  *         or #GIOChannelError
   1743  *
   1744  * Reads all the remaining data from the file.
   1745  *
   1746  * Return value: %G_IO_STATUS_NORMAL on success.
   1747  *     This function never returns %G_IO_STATUS_EOF.
   1748  **/
   1749 GIOStatus
   1750 g_io_channel_read_to_end (GIOChannel  *channel,
   1751                           gchar      **str_return,
   1752                           gsize	      *length,
   1753                           GError     **error)
   1754 {
   1755   GIOStatus status;
   1756 
   1757   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
   1758   g_return_val_if_fail ((error == NULL) || (*error == NULL),
   1759     G_IO_STATUS_ERROR);
   1760   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
   1761 
   1762   if (str_return)
   1763     *str_return = NULL;
   1764   if (length)
   1765     *length = 0;
   1766 
   1767   if (!channel->use_buffer)
   1768     {
   1769       g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
   1770                            _("Can't do a raw read in g_io_channel_read_to_end"));
   1771       return G_IO_STATUS_ERROR;
   1772     }
   1773 
   1774   do
   1775     status = g_io_channel_fill_buffer (channel, error);
   1776   while (status == G_IO_STATUS_NORMAL);
   1777 
   1778   if (status != G_IO_STATUS_EOF)
   1779     return status;
   1780 
   1781   if (channel->encoding && channel->read_buf->len > 0)
   1782     {
   1783       g_set_error_literal (error, G_CONVERT_ERROR, G_CONVERT_ERROR_PARTIAL_INPUT,
   1784                            _("Channel terminates in a partial character"));
   1785       return G_IO_STATUS_ERROR;
   1786     }
   1787 
   1788   if (USE_BUF (channel) == NULL)
   1789     {
   1790       /* length is already set to zero */
   1791       if (str_return)
   1792         *str_return = g_strdup ("");
   1793     }
   1794   else
   1795     {
   1796       if (length)
   1797         *length = USE_BUF (channel)->len;
   1798 
   1799       if (str_return)
   1800         *str_return = g_string_free (USE_BUF (channel), FALSE);
   1801       else
   1802         g_string_free (USE_BUF (channel), TRUE);
   1803 
   1804       if (channel->encoding)
   1805 	channel->encoded_read_buf = NULL;
   1806       else
   1807 	channel->read_buf = NULL;
   1808     }
   1809 
   1810   return G_IO_STATUS_NORMAL;
   1811 }
   1812 
   1813 /**
   1814  * g_io_channel_read_chars:
   1815  * @channel: a #GIOChannel
   1816  * @buf: a buffer to read data into
   1817  * @count: the size of the buffer. Note that the buffer may
   1818  *         not be complelely filled even if there is data
   1819  *         in the buffer if the remaining data is not a
   1820  *         complete character.
   1821  * @bytes_read: The number of bytes read. This may be zero even on
   1822  *              success if count < 6 and the channel's encoding is non-%NULL.
   1823  *              This indicates that the next UTF-8 character is too wide for
   1824  *              the buffer.
   1825  * @error: a location to return an error of type #GConvertError
   1826  *         or #GIOChannelError.
   1827  *
   1828  * Replacement for g_io_channel_read() with the new API.
   1829  *
   1830  * Return value: the status of the operation.
   1831  **/
   1832 GIOStatus
   1833 g_io_channel_read_chars (GIOChannel  *channel,
   1834                          gchar	     *buf,
   1835                          gsize	      count,
   1836 			 gsize       *bytes_read,
   1837                          GError     **error)
   1838 {
   1839   GIOStatus status;
   1840   gsize got_bytes;
   1841 
   1842   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
   1843   g_return_val_if_fail ((error == NULL) || (*error == NULL),
   1844 			G_IO_STATUS_ERROR);
   1845   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
   1846 
   1847   if (count == 0)
   1848     {
   1849       *bytes_read = 0;
   1850       return G_IO_STATUS_NORMAL;
   1851     }
   1852   g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR);
   1853 
   1854   if (!channel->use_buffer)
   1855     {
   1856       gsize tmp_bytes;
   1857 
   1858       g_assert (!channel->read_buf || channel->read_buf->len == 0);
   1859 
   1860       status = channel->funcs->io_read (channel, buf, count, &tmp_bytes, error);
   1861 
   1862       if (bytes_read)
   1863 	*bytes_read = tmp_bytes;
   1864 
   1865       return status;
   1866     }
   1867 
   1868   status = G_IO_STATUS_NORMAL;
   1869 
   1870   while (BUF_LEN (USE_BUF (channel)) < count && status == G_IO_STATUS_NORMAL)
   1871     status = g_io_channel_fill_buffer (channel, error);
   1872 
   1873   /* Only return an error if we have no data */
   1874 
   1875   if (BUF_LEN (USE_BUF (channel)) == 0)
   1876     {
   1877       g_assert (status != G_IO_STATUS_NORMAL);
   1878 
   1879       if (status == G_IO_STATUS_EOF && channel->encoding
   1880           && BUF_LEN (channel->read_buf) > 0)
   1881         {
   1882           g_set_error_literal (error, G_CONVERT_ERROR,
   1883                                G_CONVERT_ERROR_PARTIAL_INPUT,
   1884                                _("Leftover unconverted data in read buffer"));
   1885           status = G_IO_STATUS_ERROR;
   1886         }
   1887 
   1888       if (bytes_read)
   1889         *bytes_read = 0;
   1890 
   1891       return status;
   1892     }
   1893 
   1894   if (status == G_IO_STATUS_ERROR)
   1895     g_clear_error (error);
   1896 
   1897   got_bytes = MIN (count, BUF_LEN (USE_BUF (channel)));
   1898 
   1899   g_assert (got_bytes > 0);
   1900 
   1901   if (channel->encoding)
   1902     /* Don't validate for NULL encoding, binary safe */
   1903     {
   1904       gchar *nextchar, *prevchar;
   1905 
   1906       g_assert (USE_BUF (channel) == channel->encoded_read_buf);
   1907 
   1908       nextchar = channel->encoded_read_buf->str;
   1909 
   1910       do
   1911         {
   1912           prevchar = nextchar;
   1913           nextchar = g_utf8_next_char (nextchar);
   1914           g_assert (nextchar != prevchar); /* Possible for *prevchar of -1 or -2 */
   1915         }
   1916       while (nextchar < channel->encoded_read_buf->str + got_bytes);
   1917 
   1918       if (nextchar > channel->encoded_read_buf->str + got_bytes)
   1919         got_bytes = prevchar - channel->encoded_read_buf->str;
   1920 
   1921       g_assert (got_bytes > 0 || count < 6);
   1922     }
   1923 
   1924   memcpy (buf, USE_BUF (channel)->str, got_bytes);
   1925   g_string_erase (USE_BUF (channel), 0, got_bytes);
   1926 
   1927   if (bytes_read)
   1928     *bytes_read = got_bytes;
   1929 
   1930   return G_IO_STATUS_NORMAL;
   1931 }
   1932 
   1933 /**
   1934  * g_io_channel_read_unichar:
   1935  * @channel: a #GIOChannel
   1936  * @thechar: a location to return a character
   1937  * @error: a location to return an error of type #GConvertError
   1938  *         or #GIOChannelError
   1939  *
   1940  * Reads a Unicode character from @channel.
   1941  * This function cannot be called on a channel with %NULL encoding.
   1942  *
   1943  * Return value: a #GIOStatus
   1944  **/
   1945 GIOStatus
   1946 g_io_channel_read_unichar (GIOChannel  *channel,
   1947 			   gunichar    *thechar,
   1948 			   GError     **error)
   1949 {
   1950   GIOStatus status = G_IO_STATUS_NORMAL;
   1951 
   1952   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
   1953   g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR);
   1954   g_return_val_if_fail ((error == NULL) || (*error == NULL),
   1955 			G_IO_STATUS_ERROR);
   1956   g_return_val_if_fail (channel->is_readable, G_IO_STATUS_ERROR);
   1957 
   1958   while (BUF_LEN (channel->encoded_read_buf) == 0 && status == G_IO_STATUS_NORMAL)
   1959     status = g_io_channel_fill_buffer (channel, error);
   1960 
   1961   /* Only return an error if we have no data */
   1962 
   1963   if (BUF_LEN (USE_BUF (channel)) == 0)
   1964     {
   1965       g_assert (status != G_IO_STATUS_NORMAL);
   1966 
   1967       if (status == G_IO_STATUS_EOF && BUF_LEN (channel->read_buf) > 0)
   1968         {
   1969           g_set_error_literal (error, G_CONVERT_ERROR,
   1970                                G_CONVERT_ERROR_PARTIAL_INPUT,
   1971                                _("Leftover unconverted data in read buffer"));
   1972           status = G_IO_STATUS_ERROR;
   1973         }
   1974 
   1975       if (thechar)
   1976         *thechar = (gunichar) -1;
   1977 
   1978       return status;
   1979     }
   1980 
   1981   if (status == G_IO_STATUS_ERROR)
   1982     g_clear_error (error);
   1983 
   1984   if (thechar)
   1985     *thechar = g_utf8_get_char (channel->encoded_read_buf->str);
   1986 
   1987   g_string_erase (channel->encoded_read_buf, 0,
   1988                   g_utf8_next_char (channel->encoded_read_buf->str)
   1989                   - channel->encoded_read_buf->str);
   1990 
   1991   return G_IO_STATUS_NORMAL;
   1992 }
   1993 
   1994 /**
   1995  * g_io_channel_write_chars:
   1996  * @channel: a #GIOChannel
   1997  * @buf: a buffer to write data from
   1998  * @count: the size of the buffer. If -1, the buffer
   1999  *         is taken to be a nul-terminated string.
   2000  * @bytes_written: The number of bytes written. This can be nonzero
   2001  *                 even if the return value is not %G_IO_STATUS_NORMAL.
   2002  *                 If the return value is %G_IO_STATUS_NORMAL and the
   2003  *                 channel is blocking, this will always be equal
   2004  *                 to @count if @count >= 0.
   2005  * @error: a location to return an error of type #GConvertError
   2006  *         or #GIOChannelError
   2007  *
   2008  * Replacement for g_io_channel_write() with the new API.
   2009  *
   2010  * On seekable channels with encodings other than %NULL or UTF-8, generic
   2011  * mixing of reading and writing is not allowed. A call to g_io_channel_write_chars ()
   2012  * may only be made on a channel from which data has been read in the
   2013  * cases described in the documentation for g_io_channel_set_encoding ().
   2014  *
   2015  * Return value: the status of the operation.
   2016  **/
   2017 GIOStatus
   2018 g_io_channel_write_chars (GIOChannel   *channel,
   2019                           const gchar  *buf,
   2020                           gssize        count,
   2021 			  gsize        *bytes_written,
   2022                           GError      **error)
   2023 {
   2024   GIOStatus status;
   2025   gssize wrote_bytes = 0;
   2026 
   2027   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
   2028   g_return_val_if_fail ((error == NULL) || (*error == NULL),
   2029 			G_IO_STATUS_ERROR);
   2030   g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR);
   2031 
   2032   if ((count < 0) && buf)
   2033     count = strlen (buf);
   2034 
   2035   if (count == 0)
   2036     {
   2037       if (bytes_written)
   2038         *bytes_written = 0;
   2039       return G_IO_STATUS_NORMAL;
   2040     }
   2041 
   2042   g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR);
   2043   g_return_val_if_fail (count > 0, G_IO_STATUS_ERROR);
   2044 
   2045   /* Raw write case */
   2046 
   2047   if (!channel->use_buffer)
   2048     {
   2049       gsize tmp_bytes;
   2050 
   2051       g_assert (!channel->write_buf || channel->write_buf->len == 0);
   2052       g_assert (channel->partial_write_buf[0] == '\0');
   2053 
   2054       status = channel->funcs->io_write (channel, buf, count, &tmp_bytes, error);
   2055 
   2056       if (bytes_written)
   2057 	*bytes_written = tmp_bytes;
   2058 
   2059       return status;
   2060     }
   2061 
   2062   /* General case */
   2063 
   2064   if (channel->is_seekable && (( BUF_LEN (channel->read_buf) > 0)
   2065     || (BUF_LEN (channel->encoded_read_buf) > 0)))
   2066     {
   2067       if (channel->do_encode && BUF_LEN (channel->encoded_read_buf) > 0)
   2068         {
   2069           g_warning("Mixed reading and writing not allowed on encoded files");
   2070           return G_IO_STATUS_ERROR;
   2071         }
   2072       status = g_io_channel_seek_position (channel, 0, G_SEEK_CUR, error);
   2073       if (status != G_IO_STATUS_NORMAL)
   2074         {
   2075           if (bytes_written)
   2076             *bytes_written = 0;
   2077           return status;
   2078         }
   2079     }
   2080 
   2081   if (!channel->write_buf)
   2082     channel->write_buf = g_string_sized_new (channel->buf_size);
   2083 
   2084   while (wrote_bytes < count)
   2085     {
   2086       gsize space_in_buf;
   2087 
   2088       /* If the buffer is full, try a write immediately. In
   2089        * the nonblocking case, this prevents the user from
   2090        * writing just a little bit to the buffer every time
   2091        * and never receiving an EAGAIN.
   2092        */
   2093 
   2094       if (channel->write_buf->len >= channel->buf_size - MAX_CHAR_SIZE)
   2095         {
   2096           gsize did_write = 0, this_time;
   2097 
   2098           do
   2099             {
   2100               status = channel->funcs->io_write (channel, channel->write_buf->str
   2101                                                  + did_write, channel->write_buf->len
   2102                                                  - did_write, &this_time, error);
   2103               did_write += this_time;
   2104             }
   2105           while (status == G_IO_STATUS_NORMAL &&
   2106                  did_write < MIN (channel->write_buf->len, MAX_CHAR_SIZE));
   2107 
   2108           g_string_erase (channel->write_buf, 0, did_write);
   2109 
   2110           if (status != G_IO_STATUS_NORMAL)
   2111             {
   2112               if (status == G_IO_STATUS_AGAIN && wrote_bytes > 0)
   2113                 status = G_IO_STATUS_NORMAL;
   2114               if (bytes_written)
   2115                 *bytes_written = wrote_bytes;
   2116               return status;
   2117             }
   2118         }
   2119 
   2120       space_in_buf = MAX (channel->buf_size, channel->write_buf->allocated_len - 1)
   2121                      - channel->write_buf->len; /* 1 for NULL */
   2122 
   2123       /* This is only true because g_io_channel_set_buffer_size ()
   2124        * ensures that channel->buf_size >= MAX_CHAR_SIZE.
   2125        */
   2126       g_assert (space_in_buf >= MAX_CHAR_SIZE);
   2127 
   2128       if (!channel->encoding)
   2129         {
   2130           gssize write_this = MIN (space_in_buf, count - wrote_bytes);
   2131 
   2132           g_string_append_len (channel->write_buf, buf, write_this);
   2133           buf += write_this;
   2134           wrote_bytes += write_this;
   2135         }
   2136       else
   2137         {
   2138           const gchar *from_buf;
   2139           gsize from_buf_len, from_buf_old_len, left_len;
   2140           gsize err;
   2141           gint errnum;
   2142 
   2143           if (channel->partial_write_buf[0] != '\0')
   2144             {
   2145               g_assert (wrote_bytes == 0);
   2146 
   2147               from_buf = channel->partial_write_buf;
   2148               from_buf_old_len = strlen (channel->partial_write_buf);
   2149               g_assert (from_buf_old_len > 0);
   2150               from_buf_len = MIN (6, from_buf_old_len + count);
   2151 
   2152               memcpy (channel->partial_write_buf + from_buf_old_len, buf,
   2153                       from_buf_len - from_buf_old_len);
   2154             }
   2155           else
   2156             {
   2157               from_buf = buf;
   2158               from_buf_len = count - wrote_bytes;
   2159               from_buf_old_len = 0;
   2160             }
   2161 
   2162 reconvert:
   2163 
   2164           if (!channel->do_encode) /* UTF-8 encoding */
   2165             {
   2166               const gchar *badchar;
   2167               gsize try_len = MIN (from_buf_len, space_in_buf);
   2168 
   2169               /* UTF-8, just validate, emulate g_iconv */
   2170 
   2171               if (!g_utf8_validate (from_buf, try_len, &badchar))
   2172                 {
   2173                   gunichar try_char;
   2174                   gsize incomplete_len = from_buf + try_len - badchar;
   2175 
   2176                   left_len = from_buf + from_buf_len - badchar;
   2177 
   2178                   try_char = g_utf8_get_char_validated (badchar, incomplete_len);
   2179 
   2180                   switch (try_char)
   2181                     {
   2182                       case -2:
   2183                         g_assert (incomplete_len < 6);
   2184                         if (try_len == from_buf_len)
   2185                           {
   2186                             errnum = EINVAL;
   2187                             err = (gsize) -1;
   2188                           }
   2189                         else
   2190                           {
   2191                             errnum = 0;
   2192                             err = (gsize) 0;
   2193                           }
   2194                         break;
   2195                       case -1:
   2196                         g_warning ("Invalid UTF-8 passed to g_io_channel_write_chars().");
   2197                         /* FIXME bail here? */
   2198                         errnum = EILSEQ;
   2199                         err = (gsize) -1;
   2200                         break;
   2201                       default:
   2202                         g_assert_not_reached ();
   2203                         err = (gsize) -1;
   2204                         errnum = 0; /* Don't confunse the compiler */
   2205                     }
   2206                 }
   2207               else
   2208                 {
   2209                   err = (gsize) 0;
   2210                   errnum = 0;
   2211                   left_len = from_buf_len - try_len;
   2212                 }
   2213 
   2214               g_string_append_len (channel->write_buf, from_buf,
   2215                                    from_buf_len - left_len);
   2216               from_buf += from_buf_len - left_len;
   2217             }
   2218           else
   2219             {
   2220                gchar *outbuf;
   2221 
   2222                left_len = from_buf_len;
   2223                g_string_set_size (channel->write_buf, channel->write_buf->len
   2224                                   + space_in_buf);
   2225                outbuf = channel->write_buf->str + channel->write_buf->len
   2226                         - space_in_buf;
   2227                err = g_iconv (channel->write_cd, (gchar **) &from_buf, &left_len,
   2228                               &outbuf, &space_in_buf);
   2229                errnum = errno;
   2230                g_string_truncate (channel->write_buf, channel->write_buf->len
   2231                                   - space_in_buf);
   2232             }
   2233 
   2234           if (err == (gsize) -1)
   2235             {
   2236               switch (errnum)
   2237         	{
   2238                   case EINVAL:
   2239                     g_assert (left_len < 6);
   2240 
   2241                     if (from_buf_old_len == 0)
   2242                       {
   2243                         /* Not from partial_write_buf */
   2244 
   2245                         memcpy (channel->partial_write_buf, from_buf, left_len);
   2246                         channel->partial_write_buf[left_len] = '\0';
   2247                         if (bytes_written)
   2248                           *bytes_written = count;
   2249                         return G_IO_STATUS_NORMAL;
   2250                       }
   2251 
   2252                     /* Working in partial_write_buf */
   2253 
   2254                     if (left_len == from_buf_len)
   2255                       {
   2256                         /* Didn't convert anything, must still have
   2257                          * less than a full character
   2258                          */
   2259 
   2260                         g_assert (count == from_buf_len - from_buf_old_len);
   2261 
   2262                         channel->partial_write_buf[from_buf_len] = '\0';
   2263 
   2264                         if (bytes_written)
   2265                           *bytes_written = count;
   2266 
   2267                         return G_IO_STATUS_NORMAL;
   2268                       }
   2269 
   2270                     g_assert (from_buf_len - left_len >= from_buf_old_len);
   2271 
   2272                     /* We converted all the old data. This is fine */
   2273 
   2274                     break;
   2275                   case E2BIG:
   2276                     if (from_buf_len == left_len)
   2277                       {
   2278                         /* Nothing was written, add enough space for
   2279                          * at least one character.
   2280                          */
   2281                         space_in_buf += MAX_CHAR_SIZE;
   2282                         goto reconvert;
   2283                       }
   2284                     break;
   2285                   case EILSEQ:
   2286                     g_set_error_literal (error, G_CONVERT_ERROR,
   2287                       G_CONVERT_ERROR_ILLEGAL_SEQUENCE,
   2288                       _("Invalid byte sequence in conversion input"));
   2289                     if (from_buf_old_len > 0 && from_buf_len == left_len)
   2290                       g_warning ("Illegal sequence due to partial character "
   2291                                  "at the end of a previous write.\n");
   2292                     else
   2293                       wrote_bytes += from_buf_len - left_len - from_buf_old_len;
   2294                     if (bytes_written)
   2295                       *bytes_written = wrote_bytes;
   2296                     channel->partial_write_buf[0] = '\0';
   2297                     return G_IO_STATUS_ERROR;
   2298                   default:
   2299                     g_set_error (error, G_CONVERT_ERROR, G_CONVERT_ERROR_FAILED,
   2300                       _("Error during conversion: %s"), g_strerror (errnum));
   2301                     if (from_buf_len >= left_len + from_buf_old_len)
   2302                       wrote_bytes += from_buf_len - left_len - from_buf_old_len;
   2303                     if (bytes_written)
   2304                       *bytes_written = wrote_bytes;
   2305                     channel->partial_write_buf[0] = '\0';
   2306                     return G_IO_STATUS_ERROR;
   2307                 }
   2308             }
   2309 
   2310           g_assert (from_buf_len - left_len >= from_buf_old_len);
   2311 
   2312           wrote_bytes += from_buf_len - left_len - from_buf_old_len;
   2313 
   2314           if (from_buf_old_len > 0)
   2315             {
   2316               /* We were working in partial_write_buf */
   2317 
   2318               buf += from_buf_len - left_len - from_buf_old_len;
   2319               channel->partial_write_buf[0] = '\0';
   2320             }
   2321           else
   2322             buf = from_buf;
   2323         }
   2324     }
   2325 
   2326   if (bytes_written)
   2327     *bytes_written = count;
   2328 
   2329   return G_IO_STATUS_NORMAL;
   2330 }
   2331 
   2332 /**
   2333  * g_io_channel_write_unichar:
   2334  * @channel: a #GIOChannel
   2335  * @thechar: a character
   2336  * @error: location to return an error of type #GConvertError
   2337  *         or #GIOChannelError
   2338  *
   2339  * Writes a Unicode character to @channel.
   2340  * This function cannot be called on a channel with %NULL encoding.
   2341  *
   2342  * Return value: a #GIOStatus
   2343  **/
   2344 GIOStatus
   2345 g_io_channel_write_unichar (GIOChannel  *channel,
   2346 			    gunichar     thechar,
   2347 			    GError     **error)
   2348 {
   2349   GIOStatus status;
   2350   gchar static_buf[6];
   2351   gsize char_len, wrote_len;
   2352 
   2353   g_return_val_if_fail (channel != NULL, G_IO_STATUS_ERROR);
   2354   g_return_val_if_fail (channel->encoding != NULL, G_IO_STATUS_ERROR);
   2355   g_return_val_if_fail ((error == NULL) || (*error == NULL),
   2356 			G_IO_STATUS_ERROR);
   2357   g_return_val_if_fail (channel->is_writeable, G_IO_STATUS_ERROR);
   2358 
   2359   char_len = g_unichar_to_utf8 (thechar, static_buf);
   2360 
   2361   if (channel->partial_write_buf[0] != '\0')
   2362     {
   2363       g_warning ("Partial charater written before writing unichar.\n");
   2364       channel->partial_write_buf[0] = '\0';
   2365     }
   2366 
   2367   status = g_io_channel_write_chars (channel, static_buf,
   2368                                      char_len, &wrote_len, error);
   2369 
   2370   /* We validate UTF-8, so we can't get a partial write */
   2371 
   2372   g_assert (wrote_len == char_len || status != G_IO_STATUS_NORMAL);
   2373 
   2374   return status;
   2375 }
   2376 
   2377 /**
   2378  * g_io_channel_error_quark:
   2379  *
   2380  * Return value: the quark used as %G_IO_CHANNEL_ERROR
   2381  **/
   2382 GQuark
   2383 g_io_channel_error_quark (void)
   2384 {
   2385   return g_quark_from_static_string ("g-io-channel-error-quark");
   2386 }
   2387 
   2388 #define __G_IOCHANNEL_C__
   2389 #include "galiasdef.c"
   2390