Commit e7931deb authored by Ron Steinke's avatar Ron Steinke

Modified Files: glib/ChangeLog glib/glib/giochannel.c glib/glib/giounix.c

Modified Files:
	glib/ChangeLog glib/glib/giochannel.c glib/glib/giounix.c
	glib/glib/giochannel.h glib/glib/glib.def
	glib/docs/reference/ChangeLog
	glib/docs/reference/glib/glib-sections.txt

	* glib/giochannel.c glib/glib.def glib/giochannel.h: Added
	new functions g_io_channel_[set,get]_close_on_unref ()

	* glib/giochannel.c: glib/giochannel.h: Documentation fixes

	* glib/giochannel.c: Fixed g_io_channel_write_chars ()
	so that bytes_written is always set to an appropriate
	value when it returns

	* glib/giounix.c: changed g_io_channel_get_flags () to
	set the is_readable and is_writeable flags cached
	by the channel

	* docs/reference/glib/glib-sections.txt: Added
	declarations for g_io_channel_[set,get]_close_on_unref
parent a80fc07f
2001-08-15 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c glib/glib.def glib/giochannel.h: Added
new functions g_io_channel_[set,get]_close_on_unref ()
* glib/giochannel.c: glib/giochannel.h: Documentation fixes
* glib/giochannel.c: Fixed g_io_channel_write_chars ()
so that bytes_written is always set to an appropriate
value when it returns
* glib/giounix.c: changed g_io_channel_get_flags () to
set the is_readable and is_writeable flags cached
by the channel
Wed Aug 15 11:09:56 2001 Tim Janik <timj@gtk.org>
* Makefile.am: let the generated .pc files depend on config.status,
......
2001-08-15 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c glib/glib.def glib/giochannel.h: Added
new functions g_io_channel_[set,get]_close_on_unref ()
* glib/giochannel.c: glib/giochannel.h: Documentation fixes
* glib/giochannel.c: Fixed g_io_channel_write_chars ()
so that bytes_written is always set to an appropriate
value when it returns
* glib/giounix.c: changed g_io_channel_get_flags () to
set the is_readable and is_writeable flags cached
by the channel
Wed Aug 15 11:09:56 2001 Tim Janik <timj@gtk.org>
* Makefile.am: let the generated .pc files depend on config.status,
......
2001-08-15 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c glib/glib.def glib/giochannel.h: Added
new functions g_io_channel_[set,get]_close_on_unref ()
* glib/giochannel.c: glib/giochannel.h: Documentation fixes
* glib/giochannel.c: Fixed g_io_channel_write_chars ()
so that bytes_written is always set to an appropriate
value when it returns
* glib/giounix.c: changed g_io_channel_get_flags () to
set the is_readable and is_writeable flags cached
by the channel
Wed Aug 15 11:09:56 2001 Tim Janik <timj@gtk.org>
* Makefile.am: let the generated .pc files depend on config.status,
......
2001-08-15 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c glib/glib.def glib/giochannel.h: Added
new functions g_io_channel_[set,get]_close_on_unref ()
* glib/giochannel.c: glib/giochannel.h: Documentation fixes
* glib/giochannel.c: Fixed g_io_channel_write_chars ()
so that bytes_written is always set to an appropriate
value when it returns
* glib/giounix.c: changed g_io_channel_get_flags () to
set the is_readable and is_writeable flags cached
by the channel
Wed Aug 15 11:09:56 2001 Tim Janik <timj@gtk.org>
* Makefile.am: let the generated .pc files depend on config.status,
......
2001-08-15 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c glib/glib.def glib/giochannel.h: Added
new functions g_io_channel_[set,get]_close_on_unref ()
* glib/giochannel.c: glib/giochannel.h: Documentation fixes
* glib/giochannel.c: Fixed g_io_channel_write_chars ()
so that bytes_written is always set to an appropriate
value when it returns
* glib/giounix.c: changed g_io_channel_get_flags () to
set the is_readable and is_writeable flags cached
by the channel
Wed Aug 15 11:09:56 2001 Tim Janik <timj@gtk.org>
* Makefile.am: let the generated .pc files depend on config.status,
......
2001-08-15 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c glib/glib.def glib/giochannel.h: Added
new functions g_io_channel_[set,get]_close_on_unref ()
* glib/giochannel.c: glib/giochannel.h: Documentation fixes
* glib/giochannel.c: Fixed g_io_channel_write_chars ()
so that bytes_written is always set to an appropriate
value when it returns
* glib/giounix.c: changed g_io_channel_get_flags () to
set the is_readable and is_writeable flags cached
by the channel
Wed Aug 15 11:09:56 2001 Tim Janik <timj@gtk.org>
* Makefile.am: let the generated .pc files depend on config.status,
......
2001-08-15 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c glib/glib.def glib/giochannel.h: Added
new functions g_io_channel_[set,get]_close_on_unref ()
* glib/giochannel.c: glib/giochannel.h: Documentation fixes
* glib/giochannel.c: Fixed g_io_channel_write_chars ()
so that bytes_written is always set to an appropriate
value when it returns
* glib/giounix.c: changed g_io_channel_get_flags () to
set the is_readable and is_writeable flags cached
by the channel
Wed Aug 15 11:09:56 2001 Tim Janik <timj@gtk.org>
* Makefile.am: let the generated .pc files depend on config.status,
......
2001-08-15 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c glib/glib.def glib/giochannel.h: Added
new functions g_io_channel_[set,get]_close_on_unref ()
* glib/giochannel.c: glib/giochannel.h: Documentation fixes
* glib/giochannel.c: Fixed g_io_channel_write_chars ()
so that bytes_written is always set to an appropriate
value when it returns
* glib/giounix.c: changed g_io_channel_get_flags () to
set the is_readable and is_writeable flags cached
by the channel
Wed Aug 15 11:09:56 2001 Tim Janik <timj@gtk.org>
* Makefile.am: let the generated .pc files depend on config.status,
......
2001-08-15 Ron Stenike <rsteinke@w-link.net>
* docs/reference/glib/glib-sections.txt: Added
declarations for g_io_channel_[set,get]_close_on_unref
Sun Aug 12 10:03:42 2001 Owen Taylor <otaylor@redhat.com>
* */Makefile.am: Set GPATH to fix srcdir != builddir
......
......@@ -640,6 +640,8 @@ g_io_channel_get_buffered
g_io_channel_set_buffered
g_io_channel_get_encoding
g_io_channel_set_encoding
g_io_channel_get_close_on_unref
g_io_channel_set_close_on_unref
<SUBSECTION Private>
g_io_channel_win32_new_fd
......
......@@ -328,7 +328,7 @@ g_io_channel_close (GIOChannel *channel)
* @err: location to store a #GIOChannelError
*
* Close an IO channel. Any pending data to be written will be
* flushed. The channel will not be freed until the
* flushed if @flush is %TRUE. The channel will not be freed until the
* last reference is dropped using g_io_channel_unref().
*
* Return value:
......@@ -479,9 +479,10 @@ g_io_add_watch (GIOChannel *channel,
* g_io_channel_get_buffer_condition:
* @channel: A #GIOChannel
*
* This function returns a #GIOCondition depending on the status of the
* This function returns a #GIOCondition depending on whether there
* is data to be read/space to write data in the
* internal buffers in the #GIOChannel. Only the flags %G_IO_IN and
* %G_IO_OUT will be set.
* %G_IO_OUT may be set.
*
* Return value: A #GIOCondition
**/
......@@ -624,6 +625,9 @@ g_io_channel_get_buffer_size (GIOChannel *channel)
* g_io_channel_set_line_term:
* @channel: a #GIOChannel
* @line_term: The line termination string. Use %NULL for auto detect.
* Auto detection breaks on "\n", "\r\n", "\r", and
* the unicode paragraph separator. Auto detection should
* not be used for anything other than file-based channels.
*
* This sets the string that #GIOChannel uses to determine
* where in the file a line break occurs.
......@@ -689,6 +693,13 @@ g_io_channel_set_flags (GIOChannel *channel,
* Gets the current flags for a #GIOChannel, including read-only
* flags such as %G_IO_FLAG_IS_READABLE.
*
* The values of the flags %G_IO_FLAG_IS_READABLE and %G_IO_FLAG_IS_WRITEABLE
* are cached for internal use by the channel when it is created.
* If they should change at some later point (e.g. partial shutdown
* of a socket with the unix shutdown () function), the user
* should immediately call g_io_channel_get_flags () to update
* the internal values of these flags.
*
* Return value: the flags which are set on the channel
**/
GIOFlags
......@@ -712,13 +723,51 @@ g_io_channel_get_flags (GIOChannel *channel)
return flags;
}
/**
* g_io_channel_set_close_on_unref:
* @channel: a #GIOChannel
* @do_close: Whether to close the channel on the final unref of
* the GIOChannel data structure. The default value of
* this is %TRUE for channels created by g_io_channel_new_file (),
* and %FALSE for all other channels.
*
* Setting this flag to %TRUE for a channel you have already closed
* can cause problems.
**/
void
g_io_channel_set_close_on_unref (GIOChannel *channel,
gboolean do_close)
{
g_return_if_fail (channel != NULL);
channel->close_on_unref = do_close;
}
/**
* g_io_channel_get_close_on_unref:
* @channel: a #GIOChannel
*
* Return value: Whether the channel will be closedi on the final unref of
* the GIOChannel data structure. The default value of
* this is %TRUE for channels created by g_io_channel_new_file (),
* and %FALSE for all other channels.
**/
gboolean
g_io_channel_get_close_on_unref (GIOChannel *channel)
{
g_return_val_if_fail (channel != NULL, FALSE);
return channel->close_on_unref;
}
/**
* g_io_channel_seek_position:
* @channel: a #GIOChannel
* @offset: The offset in bytes from the position specified by @type
* @type: a #GSeekType. The type %G_SEEK_CUR is only allowed if
* the channel has the default encoding or the
* encoding %G_IO_CHANNEL_ENCODE_RAW for raw file access.
* @type: a #GSeekType. The type %G_SEEK_CUR is only allowed in those
* cases where a call to g_io_channel_set_encoding ()
* is allowed. See the documentation for
* g_io_channel_set_encoding () for details.
* @error: A location to return an error of type #GIOChannelError
*
* Replacement for g_io_channel_seek() with the new API.
......@@ -863,6 +912,21 @@ g_io_channel_flush (GIOChannel *channel,
* The buffering state can only be set if the channel's encoding
* is %NULL. For any other encoding, the channel must be buffered.
*
* A buffered channel can only be set unbuffered if the channel's
* internal buffers have been flushed. Newly created channels or
* channels which have returned G_IO_STATUS_EOF
* not require such a flush. For write-only channels, a call to
* g_io_channel_flush () is sufficient. For all other channels,
* the buffers may be flushed by a call to g_io_channel_seek_position ().
* This includes the possibility of seeking with seek type %G_SEEK_CUR
* and an offset of zero. Note that this means that socket-based
* channels cannot be set unbuffered once they have had data
* read from them.
*
* On unbuffered channels, it is safe to mix read and write
* calls from the new and old APIs, if this is necessary for
* maintaining old code.
*
* The default state of the channel is buffered.
**/
void
......@@ -909,23 +973,35 @@ g_io_channel_get_buffered (GIOChannel *channel)
* external file is UTF-8.
*
* The encoding %NULL is safe to use with binary data.
* Encodings other than %NULL must use a buffered channel.
* Encodings other than %NULL and UTF-8 cannot
* use g_io_channel_seek_position() with seek type %G_SEEK_CUR,
* and cannot mix reading and writing if the channel is
* a file without first doing a seek of type %G_SEEK_SET or
* %G_SEEK_END.
*
* The encoding can only be set under three conditions:
* The encoding can only be set under the following conditions:
*
* 1. The channel was just created, and has not been written to
* or read from yet.
*
* 2. The channel is a file, and the file pointer was just
* 2. The channel is write-only.
*
* 3. The channel is a file, and the file pointer was just
* repositioned by a call to g_io_channel_seek_position().
* (This flushes all the internal buffers.)
*
* 3. The current encoding is %NULL or UTF-8.
* 4. The current encoding is %NULL or UTF-8.
*
* 5. One of the (new API) read functions has just returned G_IO_STATUS_EOF
* (or, in the case of g_io_channel_read_to_end (), G_IO_STATUS_NORMAL).
*
* 6. One of the functions g_io_channel_read_chars () or g_io_channel_read_unichar ()
* has returned G_IO_STATUS_AGAIN or G_IO_STATUS_ERROR. This may be
* useful in the case of G_CONVERT_ERROR_ILLEGAL_SEQUENCE.
* Returning one of these statuses from g_io_channel_read_line (),
* g_io_channel_read_line_string (), or g_io_channel_read_to_end ()
* does _not_ guarantee that the encoding can be changed.
*
* Channels which do not meet the above conditions cannot call
* g_io_channel_seek_position () with an offset of %G_SEEK_CUR,
* and if they are "seekable" cannot
* call g_io_channel_write_chars () after calling one
* of the API "read" functions.
*
* Return Value: %G_IO_STATUS_NORMAL if the encoding was succesfully set.
**/
......@@ -1058,10 +1134,8 @@ g_io_channel_set_encoding (GIOChannel *channel,
* @channel: a #GIOChannel
*
* Get the encoding for the input/output of the channel. The internal
* encoding is always UTF-8. The encoding %G_IO_CHANNEL_ENCODE_RAW
* disables encoding and turns off internal buffering. Both
* %G_IO_CHANNEL_ENCODE_RAW and the default (no encoding, but buffered)
* are safe to use with binary data.
* encoding is always UTF-8. The encoding %NULL makes the
* channel safe for binary data.
*
* Return value: A string containing the encoding, this string is
* owned by GLib and must not be freed.
......@@ -1258,7 +1332,7 @@ reencode:
* @error: A location to return an error of type #GConvertError
* or #GIOChannelError
*
* Read a line, not including the terminating character(s),
* Read a line, including the terminating character(s),
* from a #GIOChannel into a newly allocated string.
* @length will contain allocated memory if the return
* is %G_IO_STATUS_NORMAL.
......@@ -1303,8 +1377,8 @@ g_io_channel_read_line (GIOChannel *channel,
* g_io_channel_read_line_string:
* @channel: a #GIOChannel
* @buffer: a #GString into which the line will be written.
* If @buffer already contains data, the new data will
* be appended to it.
* If @buffer already contains data, the old data will
* be overwritten.
* @terminator_pos: location to store position of line terminator, or %NULL
* @error: a location to store an error of type #GConvertError
* or #GIOChannelError
......@@ -1526,11 +1600,10 @@ done:
* @error: A location to return an error of type #GConvertError
* or #GIOChannelError
*
* Read all the remaining data from the file. Parameters as
* for g_io_channel_read_line.
* Read all the remaining data from the file.
*
* Return value: One of #G_IO_STATUS_EOF or #G_IO_STATUS_PARTIAL_CHARS
* on success
* Return value: %G_IO_STATUS_NORMAL on success. This function never
* returns %G_IO_STATUS_EOF.
**/
GIOStatus
g_io_channel_read_to_end (GIOChannel *channel,
......@@ -1602,7 +1675,10 @@ g_io_channel_read_to_end (GIOChannel *channel,
* not be complelely filled even if there is data
* in the buffer if the remaining data is not a
* complete character.
* @bytes_read: The number of bytes read.
* @bytes_read: The number of bytes read. This may be zero even on
* success if count < 6 and the channel's encoding is non-%NULL.
* This indicates that the next UTF-8 character is too wide for
* the buffer.
* @error: A location to return an error of type #GConvertError
* or #GIOChannelError.
*
......@@ -1685,7 +1761,7 @@ g_io_channel_read_chars (GIOChannel *channel,
{
prevchar = nextchar;
nextchar = g_utf8_next_char (nextchar);
g_assert (nextchar != prevchar); /* Posibile for *prevchar of -1 or -2 */
g_assert (nextchar != prevchar); /* Possible for *prevchar of -1 or -2 */
}
while (nextchar < channel->encoded_read_buf->str + got_bytes);
......@@ -1772,11 +1848,19 @@ g_io_channel_read_unichar (GIOChannel *channel,
* is taken to be a nul terminated string.
* @bytes_written: The number of bytes written. This can be nonzero
* even if the return value is not %G_IO_STATUS_NORMAL.
* If the return value is %G_IO_STATUS_NORMAL and the
* channel is blocking, this will always be equal
* to @count if @count >= 0.
* @error: A location to return an error of type #GConvertError
* or #GIOChannelError
*
* Replacement for g_io_channel_write() with the new API.
*
* On seekable channels with encodings other than %NULL or UTF-8, generic
* mixing of reading and writing is not allowed. A call to g_io_channel_write_chars ()
* may only be made on a channel from which data has been read in the
* cases described in the documentation for g_io_channel_set_encoding ().
*
* Return value:
**/
GIOStatus
......@@ -1798,7 +1882,11 @@ g_io_channel_write_chars (GIOChannel *channel,
count = strlen (buf);
if (count == 0)
return G_IO_STATUS_NORMAL;
{
if (bytes_written)
*bytes_written = 0;
return G_IO_STATUS_NORMAL;
}
g_return_val_if_fail (buf != NULL, G_IO_STATUS_ERROR);
g_return_val_if_fail (count > 0, G_IO_STATUS_ERROR);
......@@ -1824,7 +1912,11 @@ g_io_channel_write_chars (GIOChannel *channel,
}
status = g_io_channel_seek_position (channel, 0, G_SEEK_CUR, error);
if (status != G_IO_STATUS_NORMAL)
return status;
{
if (bytes_written)
*bytes_written = 0;
return status;
}
}
if (!channel->write_buf)
......@@ -1978,6 +2070,8 @@ reconvert:
memcpy (channel->partial_write_buf, from_buf, left_len);
channel->partial_write_buf[left_len] = '\0';
if (bytes_written)
*bytes_written = count;
return G_IO_STATUS_NORMAL;
}
......@@ -2056,7 +2150,7 @@ reconvert:
}
if (bytes_written)
*bytes_written = wrote_bytes;
*bytes_written = count;
return G_IO_STATUS_NORMAL;
}
......
......@@ -103,8 +103,6 @@ typedef enum
struct _GIOChannel
{
/*<private>*/
guint ref_count;
GIOFuncs *funcs;
......@@ -123,20 +121,7 @@ struct _GIOChannel
gboolean use_buffer : 1; /* The encoding uses the buffers */
gboolean do_encode : 1; /* The encoding uses the GIConv coverters */
/*<public>*/
gboolean close_on_unref : 1; /* Close the channel on final unref */
/* The is_readable and is_writeable flags should really be marked
* <protected> instead of <private>. Some applications of GIOChannel,
* like GNet which implements the unix shutdown function to partially
* or completely disconnect sockets, may need to set these. For most
* cases, people won't need to touch them.
*/
/*<private>*/
gboolean is_readable : 1; /* Cached GIOFlag */
gboolean is_writeable : 1; /* ditto */
gboolean is_seekable : 1; /* ditto */
......@@ -228,6 +213,9 @@ GIOStatus g_io_channel_set_encoding (GIOChannel *channel,
const gchar *encoding,
GError **error);
G_CONST_RETURN gchar* g_io_channel_get_encoding (GIOChannel *channel);
void g_io_channel_set_close_on_unref (GIOChannel *channel,
gboolean do_close);
gboolean g_io_channel_get_close_on_unref (GIOChannel *channel);
GIOStatus g_io_channel_flush (GIOChannel *channel,
......
......@@ -340,34 +340,24 @@ g_io_unix_create_watch (GIOChannel *channel,
return source;
}
static const GIOFlags g_io_unix_fcntl_flags[] = {
G_IO_FLAG_APPEND,
G_IO_FLAG_NONBLOCK,
};
static const glong g_io_unix_fcntl_posix_flags[] = {
O_APPEND,
#ifdef O_NONBLOCK
O_NONBLOCK,
#else
O_NDELAY,
#endif
};
#define G_IO_UNIX_NUM_FCNTL_FLAGS G_N_ELEMENTS (g_io_unix_fcntl_flags)
static GIOStatus
g_io_unix_set_flags (GIOChannel *channel,
GIOFlags flags,
GError **err)
{
glong fcntl_flags;
gint loop;
GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel;
fcntl_flags = 0;
for (loop = 0; loop < G_IO_UNIX_NUM_FCNTL_FLAGS; loop++)
if (flags & g_io_unix_fcntl_flags[loop])
fcntl_flags |= g_io_unix_fcntl_posix_flags[loop];
if (flags & G_IO_FLAG_APPEND)
fcntl_flags |= O_APPEND;
if (flags & G_IO_FLAG_NONBLOCK)
#ifdef O_NONBLOCK
fcntl_flags |= O_NONBLOCK;
#else
fcntl_flags |= O_NDELAY;
#endif
if (fcntl (unix_channel->fd, F_SETFL, fcntl_flags) == -1)
{
......@@ -385,7 +375,6 @@ g_io_unix_get_flags (GIOChannel *channel)
{
GIOFlags flags = 0;
glong fcntl_flags;
gint loop;
GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel;
fcntl_flags = fcntl (unix_channel->fd, F_GETFL);
......@@ -397,9 +386,32 @@ g_io_unix_get_flags (GIOChannel *channel)
return 0;
}
for (loop = 0; loop < G_IO_UNIX_NUM_FCNTL_FLAGS; loop++)
if (fcntl_flags & g_io_unix_fcntl_posix_flags[loop])
flags |= g_io_unix_fcntl_flags[loop];
if (fcntl_flags & O_APPEND)
flags |= G_IO_FLAG_APPEND;
#ifdef O_NONBLOCK
if (fcntl_flags & O_NONBLOCK)
#else
if (fcntl_flags & O_NDELAY)
#endif
flags |= G_IO_FLAG_NONBLOCK;
switch (fcntl_flags & (O_RDONLY | O_WRONLY | O_RDWR))
{
case O_RDONLY:
channel->is_readable = TRUE;
channel->is_writeable = FALSE;
break;
case O_WRONLY:
channel->is_readable = FALSE;
channel->is_writeable = TRUE;
break;
case O_RDWR:
channel->is_readable = TRUE;
channel->is_writeable = TRUE;
break;
default:
g_assert_not_reached ();
}
return flags;
}
......@@ -540,7 +552,6 @@ g_io_channel_unix_new (gint fd)
struct stat buffer;
GIOUnixChannel *unix_channel = g_new (GIOUnixChannel, 1);
GIOChannel *channel = (GIOChannel *)unix_channel;
int flags;
g_io_channel_init (channel);
channel->funcs = &unix_channel_funcs;
......@@ -557,44 +568,10 @@ g_io_channel_unix_new (gint fd)
else /* Assume not seekable */
channel->is_seekable = FALSE;
flags = fcntl (fd, F_GETFL);
if (flags != -1)
{
/* Don't know if fcntl flags overlap, be careful */
unix_channel->fd = fd;
if (flags & O_WRONLY)
{
channel->is_readable = FALSE;
channel->is_writeable = TRUE;
}
else if (flags & O_RDWR)
channel->is_readable = channel->is_writeable = TRUE;
#if O_RDONLY == 0
else /* O_RDONLY defined as zero on linux (elsewhere?) */
{
channel->is_readable = TRUE;
channel->is_writeable = FALSE;
}
#else /* O_RDONLY == 0 */
else if (flags & O_RDONLY)
{
channel->is_readable = TRUE;
channel->is_writeable = FALSE;
}
else
channel->is_readable = channel->is_writeable = FALSE;
#endif /* O_RDONLY == 0 */
}
else
{
g_warning (G_STRLOC "Error while getting flags for FD: %s (%d)\n",
g_strerror (errno), errno);
g_free (channel);
return NULL;
}
g_io_unix_get_flags (channel); /* Sets is_readable, is_writeable */
unix_channel->fd = fd;
return channel;
}
......
......@@ -194,6 +194,7 @@ EXPORTS
g_io_channel_get_buffer_condition
g_io_channel_get_buffer_size
g_io_channel_get_buffered
g_io_channel_get_close_of_unref
g_io_channel_get_encoding
g_io_channel_get_flags
g_io_channel_get_line_term
......@@ -210,6 +211,7 @@ EXPORTS
g_io_channel_seek_position
g_io_channel_set_buffer_size
g_io_channel_set_buffered
g_io_channel_set_close_of_unref
g_io_channel_set_encoding
g_io_channel_set_flags
g_io_channel_set_line_term
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment