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

Modified Files:
 	glib/ChangeLog glib/glib.def glib/glib/giochannel.c
 	glib/glib/giochannel.h glib/glib/giounix.c
 	glib/glib/giowin32.c
 	glib/docs/reference/glib/glib-sections.txt
 	glib/tests/iochannel-test.c glib/tests/unicode-collate.c
 	glib/tests/unicode-normalize.c
     Added Files:
 	glib/tests/iochannel-test-infile

        * glib/giochannel.c: API changes, fixes to
        error handling, some internal restructuring
        * glib/giochannel.h: API changes, documentation for
        elements in GIOChannel structure
        * glib/giounix.c: Matched API changes, implemented
        backend to set is_readable, is_writeable, is_seekable
        flags, added a test to catch large values of count
        for which the behavior of write() is undefined
        * glib/giowin32.c: Changed to match new prototypes for
        io_close() and io_seek(), removed references to
        G_IO_STATUS_INTR, set is_seekable flag in channel
        creation functions
        * glib.def: Renamed g_channel_error_quark() and
        g_channel_error_from_errno() to g_io_channel_error_quark() and
        g_io_channel_error_from_errno(); added new functions
        g_io_channel_get_buffered() and g_io_channel_set_buffered()
        * docs/reference/glib/glib-sections.txt: Modified iochannel
        section to reflect new functions and API changes
        * tests/iochannel-test.c: Fixed to work with API changes
        * tests/iochannel-test-infile: New file; input file
        for iochannel-test
        * tests/unicode-collate.c tests/unicode-normalize.c:
        Changed G_IO_FILE_MODE_READ to "r" to match API change
This commit is contained in:
Ron Steinke 2001-07-20 20:14:37 +00:00
parent c71a77a520
commit e070fdea39
18 changed files with 1302 additions and 508 deletions

View File

@ -1,3 +1,29 @@
Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c: API changes, fixes to
error handling, some internal restructuring
* glib/giochannel.h: API changes, documentation for
elements in GIOChannel structure
* glib/giounix.c: Matched API changes, implemented
backend to set is_readable, is_writeable, is_seekable
flags, added a test to catch large values of count
for which the behavior of write() is undefined
* glib/giowin32.c: Changed to match new prototypes for
io_close() and io_seek(), removed references to
G_IO_STATUS_INTR, set is_seekable flag in channel
creation functions
* glib.def: Renamed g_channel_error_quark() and
g_channel_error_from_errno() to g_io_channel_error_quark() and
g_io_channel_error_from_errno(); added new functions
g_io_channel_get_buffered() and g_io_channel_set_buffered()
* docs/reference/glib/glib-sections.txt: Modified iochannel
section to reflect new functions and API changes
* tests/iochannel-test.c: Fixed to work with API changes
* tests/iochannel-test-infile: New file; input file
for iochannel-test
* tests/unicode-collate.c tests/unicode-normalize.c:
Changed G_IO_FILE_MODE_READ to "r" to match API change
Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* gobject/glib-genmarshal.c: modified to create header files

View File

@ -1,3 +1,29 @@
Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c: API changes, fixes to
error handling, some internal restructuring
* glib/giochannel.h: API changes, documentation for
elements in GIOChannel structure
* glib/giounix.c: Matched API changes, implemented
backend to set is_readable, is_writeable, is_seekable
flags, added a test to catch large values of count
for which the behavior of write() is undefined
* glib/giowin32.c: Changed to match new prototypes for
io_close() and io_seek(), removed references to
G_IO_STATUS_INTR, set is_seekable flag in channel
creation functions
* glib.def: Renamed g_channel_error_quark() and
g_channel_error_from_errno() to g_io_channel_error_quark() and
g_io_channel_error_from_errno(); added new functions
g_io_channel_get_buffered() and g_io_channel_set_buffered()
* docs/reference/glib/glib-sections.txt: Modified iochannel
section to reflect new functions and API changes
* tests/iochannel-test.c: Fixed to work with API changes
* tests/iochannel-test-infile: New file; input file
for iochannel-test
* tests/unicode-collate.c tests/unicode-normalize.c:
Changed G_IO_FILE_MODE_READ to "r" to match API change
Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* gobject/glib-genmarshal.c: modified to create header files

View File

@ -1,3 +1,29 @@
Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c: API changes, fixes to
error handling, some internal restructuring
* glib/giochannel.h: API changes, documentation for
elements in GIOChannel structure
* glib/giounix.c: Matched API changes, implemented
backend to set is_readable, is_writeable, is_seekable
flags, added a test to catch large values of count
for which the behavior of write() is undefined
* glib/giowin32.c: Changed to match new prototypes for
io_close() and io_seek(), removed references to
G_IO_STATUS_INTR, set is_seekable flag in channel
creation functions
* glib.def: Renamed g_channel_error_quark() and
g_channel_error_from_errno() to g_io_channel_error_quark() and
g_io_channel_error_from_errno(); added new functions
g_io_channel_get_buffered() and g_io_channel_set_buffered()
* docs/reference/glib/glib-sections.txt: Modified iochannel
section to reflect new functions and API changes
* tests/iochannel-test.c: Fixed to work with API changes
* tests/iochannel-test-infile: New file; input file
for iochannel-test
* tests/unicode-collate.c tests/unicode-normalize.c:
Changed G_IO_FILE_MODE_READ to "r" to match API change
Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* gobject/glib-genmarshal.c: modified to create header files

View File

@ -1,3 +1,29 @@
Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c: API changes, fixes to
error handling, some internal restructuring
* glib/giochannel.h: API changes, documentation for
elements in GIOChannel structure
* glib/giounix.c: Matched API changes, implemented
backend to set is_readable, is_writeable, is_seekable
flags, added a test to catch large values of count
for which the behavior of write() is undefined
* glib/giowin32.c: Changed to match new prototypes for
io_close() and io_seek(), removed references to
G_IO_STATUS_INTR, set is_seekable flag in channel
creation functions
* glib.def: Renamed g_channel_error_quark() and
g_channel_error_from_errno() to g_io_channel_error_quark() and
g_io_channel_error_from_errno(); added new functions
g_io_channel_get_buffered() and g_io_channel_set_buffered()
* docs/reference/glib/glib-sections.txt: Modified iochannel
section to reflect new functions and API changes
* tests/iochannel-test.c: Fixed to work with API changes
* tests/iochannel-test-infile: New file; input file
for iochannel-test
* tests/unicode-collate.c tests/unicode-normalize.c:
Changed G_IO_FILE_MODE_READ to "r" to match API change
Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* gobject/glib-genmarshal.c: modified to create header files

View File

@ -1,3 +1,29 @@
Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c: API changes, fixes to
error handling, some internal restructuring
* glib/giochannel.h: API changes, documentation for
elements in GIOChannel structure
* glib/giounix.c: Matched API changes, implemented
backend to set is_readable, is_writeable, is_seekable
flags, added a test to catch large values of count
for which the behavior of write() is undefined
* glib/giowin32.c: Changed to match new prototypes for
io_close() and io_seek(), removed references to
G_IO_STATUS_INTR, set is_seekable flag in channel
creation functions
* glib.def: Renamed g_channel_error_quark() and
g_channel_error_from_errno() to g_io_channel_error_quark() and
g_io_channel_error_from_errno(); added new functions
g_io_channel_get_buffered() and g_io_channel_set_buffered()
* docs/reference/glib/glib-sections.txt: Modified iochannel
section to reflect new functions and API changes
* tests/iochannel-test.c: Fixed to work with API changes
* tests/iochannel-test-infile: New file; input file
for iochannel-test
* tests/unicode-collate.c tests/unicode-normalize.c:
Changed G_IO_FILE_MODE_READ to "r" to match API change
Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* gobject/glib-genmarshal.c: modified to create header files

View File

@ -1,3 +1,29 @@
Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c: API changes, fixes to
error handling, some internal restructuring
* glib/giochannel.h: API changes, documentation for
elements in GIOChannel structure
* glib/giounix.c: Matched API changes, implemented
backend to set is_readable, is_writeable, is_seekable
flags, added a test to catch large values of count
for which the behavior of write() is undefined
* glib/giowin32.c: Changed to match new prototypes for
io_close() and io_seek(), removed references to
G_IO_STATUS_INTR, set is_seekable flag in channel
creation functions
* glib.def: Renamed g_channel_error_quark() and
g_channel_error_from_errno() to g_io_channel_error_quark() and
g_io_channel_error_from_errno(); added new functions
g_io_channel_get_buffered() and g_io_channel_set_buffered()
* docs/reference/glib/glib-sections.txt: Modified iochannel
section to reflect new functions and API changes
* tests/iochannel-test.c: Fixed to work with API changes
* tests/iochannel-test-infile: New file; input file
for iochannel-test
* tests/unicode-collate.c tests/unicode-normalize.c:
Changed G_IO_FILE_MODE_READ to "r" to match API change
Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* gobject/glib-genmarshal.c: modified to create header files

View File

@ -1,3 +1,29 @@
Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c: API changes, fixes to
error handling, some internal restructuring
* glib/giochannel.h: API changes, documentation for
elements in GIOChannel structure
* glib/giounix.c: Matched API changes, implemented
backend to set is_readable, is_writeable, is_seekable
flags, added a test to catch large values of count
for which the behavior of write() is undefined
* glib/giowin32.c: Changed to match new prototypes for
io_close() and io_seek(), removed references to
G_IO_STATUS_INTR, set is_seekable flag in channel
creation functions
* glib.def: Renamed g_channel_error_quark() and
g_channel_error_from_errno() to g_io_channel_error_quark() and
g_io_channel_error_from_errno(); added new functions
g_io_channel_get_buffered() and g_io_channel_set_buffered()
* docs/reference/glib/glib-sections.txt: Modified iochannel
section to reflect new functions and API changes
* tests/iochannel-test.c: Fixed to work with API changes
* tests/iochannel-test-infile: New file; input file
for iochannel-test
* tests/unicode-collate.c tests/unicode-normalize.c:
Changed G_IO_FILE_MODE_READ to "r" to match API change
Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* gobject/glib-genmarshal.c: modified to create header files

View File

@ -1,3 +1,29 @@
Fri Jul 20 19:19:10 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* glib/giochannel.c: API changes, fixes to
error handling, some internal restructuring
* glib/giochannel.h: API changes, documentation for
elements in GIOChannel structure
* glib/giounix.c: Matched API changes, implemented
backend to set is_readable, is_writeable, is_seekable
flags, added a test to catch large values of count
for which the behavior of write() is undefined
* glib/giowin32.c: Changed to match new prototypes for
io_close() and io_seek(), removed references to
G_IO_STATUS_INTR, set is_seekable flag in channel
creation functions
* glib.def: Renamed g_channel_error_quark() and
g_channel_error_from_errno() to g_io_channel_error_quark() and
g_io_channel_error_from_errno(); added new functions
g_io_channel_get_buffered() and g_io_channel_set_buffered()
* docs/reference/glib/glib-sections.txt: Modified iochannel
section to reflect new functions and API changes
* tests/iochannel-test.c: Fixed to work with API changes
* tests/iochannel-test-infile: New file; input file
for iochannel-test
* tests/unicode-collate.c tests/unicode-normalize.c:
Changed G_IO_FILE_MODE_READ to "r" to match API change
Fri Jul 20 19:16:24 (UTC) 2001 Ron Steinke <rsteinke@w-link.net>
* gobject/glib-genmarshal.c: modified to create header files

View File

@ -594,7 +594,6 @@ g_io_channel_init
<SUBSECTION>
g_io_channel_new_file
GIOFileMode
g_io_channel_read_chars
g_io_channel_read_line
g_io_channel_read_line_string
@ -603,14 +602,14 @@ g_io_channel_write_chars
g_io_channel_flush
g_io_channel_seek_position
GSeekType
g_io_channel_close
g_io_channel_shutdown
<SUBSECTION>
GChannelStatus
GChannelError
G_CHANNEL_ERROR
g_channel_error_quark
g_channel_error_from_errno
GIOStatus
GIOChannelError
G_IO_CHANNEL_ERROR
g_io_channel_error_quark
g_io_channel_error_from_errno
<SUBSECTION>
g_io_channel_ref
@ -638,10 +637,10 @@ g_io_channel_set_line_term
G_IO_CHANNEL_UNIX_LINE_TERM
G_IO_CHANNEL_DOS_LINE_TERM
G_IO_CHANNEL_MACINTOSH_LINE_TERM
G_IO_CHANNEL_DEFAULT_LINE_TERM
g_io_channel_get_buffered
g_io_channel_set_buffered
g_io_channel_get_encoding
g_io_channel_set_encoding
G_IO_CHANNEL_ENCODE_RAW
<SUBSECTION Private>
g_io_channel_win32_new_fd
@ -656,6 +655,7 @@ g_io_channel_read
GIOError
g_io_channel_write
g_io_channel_seek
g_io_channel_close
</SECTION>
<SECTION>

View File

@ -51,8 +51,6 @@ EXPORTS
g_cache_new
g_cache_remove
g_cache_value_foreach
g_channel_error_quark
g_channel_error_from_errno
g_clear_error
g_completion_add_items
g_completion_clear_items
@ -186,9 +184,12 @@ EXPORTS
g_io_add_watch
g_io_add_watch_full
g_io_channel_close
g_io_channel_error_from_errno
g_io_channel_error_quark
g_io_channel_flush
g_io_channel_get_buffer_condition
g_io_channel_get_buffer_size
g_io_channel_get_buffered
g_io_channel_get_encoding
g_io_channel_get_flags
g_io_channel_get_line_term
@ -203,6 +204,7 @@ EXPORTS
g_io_channel_seek
g_io_channel_seek_position
g_io_channel_set_buffer_size
g_io_channel_set_buffered
g_io_channel_set_encoding
g_io_channel_set_flags
g_io_channel_set_line_term

File diff suppressed because it is too large Load Diff

View File

@ -47,26 +47,22 @@ typedef enum
G_IO_ERROR_UNKNOWN
} GIOError;
#define G_IO_CHANNEL_ERROR g_channel_error_quark()
#define G_IO_CHANNEL_ERROR g_io_channel_error_quark()
typedef enum
{
/* Derived from errno */
G_IO_CHANNEL_ERROR_ACCES,
G_IO_CHANNEL_ERROR_BADF,
G_IO_CHANNEL_ERROR_DEADLK,
G_IO_CHANNEL_ERROR_FAULT,
G_IO_CHANNEL_ERROR_FBIG,
G_IO_CHANNEL_ERROR_INVAL,
G_IO_CHANNEL_ERROR_IO,
G_IO_CHANNEL_ERROR_ISDIR,
G_IO_CHANNEL_ERROR_MFILE,
G_IO_CHANNEL_ERROR_NOLCK,
G_IO_CHANNEL_ERROR_NOSPC,
G_IO_CHANNEL_ERROR_PERM,
G_IO_CHANNEL_ERROR_NXIO,
G_IO_CHANNEL_ERROR_OVERFLOW,
G_IO_CHANNEL_ERROR_PIPE,
G_IO_CHANNEL_ERROR_SPIPE,
/* Other */
G_IO_CHANNEL_ERROR_ENCODE_RW,
G_IO_CHANNEL_ERROR_PCHAR_FLUSH,
/* Unconverted partial UTF-8 chars in buffer during flush */
G_IO_CHANNEL_ERROR_FAILED
} GIOChannelError;
@ -75,7 +71,6 @@ typedef enum
G_IO_STATUS_ERROR,
G_IO_STATUS_NORMAL,
G_IO_STATUS_EOF,
G_IO_STATUS_PARTIAL_CHARS, /* like EOF, but with unconverted data left */
G_IO_STATUS_AGAIN
} GIOStatus;
@ -99,7 +94,6 @@ typedef enum
#define G_IO_CHANNEL_UNIX_LINE_TERM "\n"
#define G_IO_CHANNEL_DOS_LINE_TERM "\r\n"
#define G_IO_CHANNEL_MACINTOSH_LINE_TERM "\r"
#define G_IO_CHANNEL_ENCODE_RAW "GIOChannelEncodeRaw"
typedef enum
{
@ -113,41 +107,30 @@ typedef enum
G_IO_FLAG_SET_MASK = G_IO_FLAG_APPEND | G_IO_FLAG_NONBLOCK,
} GIOFlags;
typedef enum
{
G_IO_FILE_MODE_READ,
G_IO_FILE_MODE_WRITE,
G_IO_FILE_MODE_APPEND,
G_IO_FILE_MODE_READ_WRITE,
G_IO_FILE_MODE_READ_WRITE_TRUNCATE,
G_IO_FILE_MODE_READ_WRITE_APPEND,
} GIOFileMode;
struct _GIOChannel
{
guint channel_flags;
guint ref_count;
GIOFuncs *funcs;
gchar *encoding;
GIConv read_cd;
GIConv write_cd;
gchar *line_term;
gchar *line_term; /* String which indicates the end of a line of text */
gsize buf_size;
GString *read_buf;
GString *encoded_read_buf;
GString *write_buf;
GString *read_buf; /* Raw data from the channel */
GString *encoded_read_buf; /* Channel data converted to UTF-8 */
GString *write_buf; /* Data ready to be written to the file */
gchar partial_write_buf[6]; /* UTF-8 partial characters, null terminated */
/* Group the flags together to save memory */
/* Group the flags together, immediately after partial_write_buf, to save memory */
gboolean use_buffer : 1;
gboolean do_encode : 1;
gboolean ready_to_read : 1;
gboolean ready_to_write : 1;
gboolean close_on_unref : 1;
gboolean seekable_cached : 1;
gboolean is_seekable : 1;
gboolean use_buffer : 1; /* The encoding uses the buffers */
gboolean do_encode : 1; /* The encoding uses the GIConv coverters */
gboolean close_on_unref : 1; /* Close the channel on final unref */
gboolean is_readable : 1; /* Cached GIOFlag */
gboolean is_writeable : 1; /* ditto */
gboolean is_seekable : 1; /* ditto */
};
typedef gboolean (*GIOFunc) (GIOChannel *source,
@ -229,6 +212,9 @@ GIOFlags g_io_channel_get_flags (GIOChannel *channel);
void g_io_channel_set_line_term (GIOChannel *channel,
const gchar *line_term);
G_CONST_RETURN gchar* g_io_channel_get_line_term (GIOChannel *channel);
void g_io_channel_set_buffered (GIOChannel *channel,
gboolean buffered);
gboolean g_io_channel_get_buffered (GIOChannel *channel);
GIOStatus g_io_channel_set_encoding (GIOChannel *channel,
const gchar *encoding,
GError **error);
@ -265,13 +251,13 @@ GIOStatus g_io_channel_seek_position (GIOChannel *channel,
GSeekType type,
GError **error);
GIOChannel* g_io_channel_new_file (const gchar *filename,
GIOFileMode mode,
const gchar *mode,
GError **error);
/* Error handling */
GQuark g_channel_error_quark (void);
GIOChannelError g_channel_error_from_errno (gint en);
GQuark g_io_channel_error_quark (void);
GIOChannelError g_io_channel_error_from_errno (gint en);
/* On Unix, IO channels created with this function for any file
* descriptor or socket.

View File

@ -177,6 +177,9 @@ g_io_unix_read (GIOChannel *channel,
GIOUnixChannel *unix_channel = (GIOUnixChannel *)channel;
gssize result;
if (count > SSIZE_MAX) /* At least according to the Debian manpage for read */
count = SSIZE_MAX;
retry:
result = read (unix_channel->fd, buf, count);
@ -196,7 +199,7 @@ g_io_unix_read (GIOChannel *channel,
#endif
default:
g_set_error (err, G_IO_CHANNEL_ERROR,
g_channel_error_from_errno (errno),
g_io_channel_error_from_errno (errno),
strerror (errno));
return G_IO_STATUS_ERROR;
}
@ -236,7 +239,7 @@ g_io_unix_write (GIOChannel *channel,
#endif
default:
g_set_error (err, G_IO_CHANNEL_ERROR,
g_channel_error_from_errno (errno),
g_io_channel_error_from_errno (errno),
strerror (errno));
return G_IO_STATUS_ERROR;
}
@ -278,7 +281,7 @@ g_io_unix_seek (GIOChannel *channel,
if (result < 0)
{
g_set_error (err, G_IO_CHANNEL_ERROR,
g_channel_error_from_errno (errno),
g_io_channel_error_from_errno (errno),
strerror (errno));
return G_IO_STATUS_ERROR;
}
@ -296,7 +299,7 @@ g_io_unix_close (GIOChannel *channel,
if (close (unix_channel->fd) < 0)
{
g_set_error (err, G_IO_CHANNEL_ERROR,
g_channel_error_from_errno (errno),
g_io_channel_error_from_errno (errno),
strerror (errno));
return G_IO_STATUS_ERROR;
}
@ -351,19 +354,6 @@ static const glong g_io_unix_fcntl_posix_flags[] = {
};
#define G_IO_UNIX_NUM_FCNTL_FLAGS G_N_ELEMENTS (g_io_unix_fcntl_flags)
static const GIOFlags g_io_unix_fcntl_flags_read_only[] = {
G_IO_FLAG_IS_READABLE,
G_IO_FLAG_IS_WRITEABLE,
};
static const glong g_io_unix_fcntl_posix_flags_read_only[] = {
O_RDONLY | O_RDWR,
O_WRONLY | O_RDWR,
};
/* Only need to map posix_flags -> flags for read only, not the
* other way around, so this works.
*/
#define G_IO_UNIX_NUM_FCNTL_FLAGS_READ_ONLY G_N_ELEMENTS (g_io_unix_fcntl_flags_read_only)
static GIOStatus
g_io_unix_set_flags (GIOChannel *channel,
GIOFlags flags,
@ -382,7 +372,7 @@ g_io_unix_set_flags (GIOChannel *channel,
if (fcntl (unix_channel->fd, F_SETFL, fcntl_flags) == -1)
{
g_set_error (err, G_IO_CHANNEL_ERROR,
g_channel_error_from_errno (errno),
g_io_channel_error_from_errno (errno),
g_strerror (errno));
return G_IO_STATUS_ERROR;
}
@ -397,103 +387,200 @@ g_io_unix_get_flags (GIOChannel *channel)
glong fcntl_flags;
gint loop;
GIOUnixChannel *unix_channel = (GIOUnixChannel *) channel;
struct stat buffer;
fcntl_flags = fcntl (unix_channel->fd, F_GETFL);
if (fcntl_flags == -1)
{
g_warning (G_STRLOC "Error while getting flags for FD: %s (%d)\n",
g_strerror (errno), errno);
return 0;
}
if (!channel->seekable_cached)
{
channel->seekable_cached = TRUE;
/* I'm not sure if fstat on a non-file (e.g., socket) works
* it should be safe to sat if it fails, the fd isn't seekable.
*/
if (fstat (unix_channel->fd, &buffer) == -1 ||
!S_ISREG (buffer.st_mode))
channel->is_seekable = FALSE;
else
channel->is_seekable = TRUE;
}
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];
for (loop = 0; loop < G_IO_UNIX_NUM_FCNTL_FLAGS_READ_ONLY; loop++)
if (fcntl_flags & g_io_unix_fcntl_posix_flags_read_only[loop])
flags |= g_io_unix_fcntl_flags_read_only[loop];
if (channel->is_seekable)
flags |= G_IO_FLAG_IS_SEEKABLE;
return flags;
}
GIOChannel *
g_io_channel_new_file (const gchar *filename,
GIOFileMode mode,
const gchar *mode,
GError **error)
{
FILE *f;
int fid;
gchar *mode_name;
int fid, flags;
GIOChannel *channel;
enum { /* Cheesy hack */
MODE_R = 1 << 0,
MODE_W = 1 << 1,
MODE_A = 1 << 2,
MODE_PLUS = 1 << 3,
} mode_num;
switch (mode)
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (mode != NULL, NULL);
g_return_val_if_fail ((error == NULL) || (*error == NULL), NULL);
switch (mode[0])
{
case G_IO_FILE_MODE_READ:
mode_name = "r";
case 'r':
mode_num = MODE_R;
break;
case G_IO_FILE_MODE_WRITE:
mode_name = "w";
case 'w':
mode_num = MODE_W;
break;
case G_IO_FILE_MODE_APPEND:
mode_name = "a";
break;
case G_IO_FILE_MODE_READ_WRITE:
mode_name = "r+";
break;
case G_IO_FILE_MODE_READ_WRITE_TRUNCATE:
mode_name = "w+";
break;
case G_IO_FILE_MODE_READ_WRITE_APPEND:
mode_name = "a+";
case 'a':
mode_num = MODE_A;
break;
default:
g_warning ("Invalid GIOFileMode %i.\n", mode);
g_warning ("Invalid GIOFileMode %s.\n", mode);
return NULL;
}
f = fopen (filename, mode_name);
if (!f)
switch (mode[1])
{
case '\0':
break;
case '+':
if (mode[2] == '\0')
{
mode_num |= MODE_PLUS;
break;
}
/* Fall through */
default:
g_warning ("Invalid GIOFileMode %s.\n", mode);
return NULL;
}
switch (mode_num)
{
case MODE_R:
flags = O_RDONLY;
break;
case MODE_W:
flags = O_WRONLY | O_TRUNC | O_CREAT;
break;
case MODE_A:
flags = O_WRONLY | O_APPEND | O_CREAT;
break;
case MODE_R | MODE_PLUS:
flags = O_RDWR;
break;
case MODE_W | MODE_PLUS:
flags = O_RDWR | O_TRUNC | O_CREAT;
break;
case MODE_A | MODE_PLUS:
flags = O_RDWR | O_APPEND | O_CREAT;
break;
default:
g_assert_not_reached ();
flags = 0;
}
fid = open (filename, flags);
if (fid < 0)
{
g_set_error (error, G_FILE_ERROR,
g_file_error_from_errno (errno),
strerror (errno));
return (GIOChannel *)NULL;
}
fid = fileno (f);
channel = g_io_channel_unix_new (fid);
channel = (GIOChannel *) g_new (GIOUnixChannel, 1);
channel->close_on_unref = TRUE;
channel->is_seekable = TRUE;
switch (mode_num)
{
case MODE_R:
channel->is_readable = TRUE;
channel->is_writeable = FALSE;
break;
case MODE_W:
case MODE_A:
channel->is_readable = FALSE;
channel->is_writeable = TRUE;
break;
case MODE_R | MODE_PLUS:
case MODE_W | MODE_PLUS:
case MODE_A | MODE_PLUS:
channel->is_readable = TRUE;
channel->is_writeable = TRUE;
break;
default:
g_assert_not_reached ();
}
g_io_channel_init (channel);
channel->funcs = &unix_channel_funcs;
((GIOUnixChannel *) channel)->fd = fid;
return channel;
}
GIOChannel *
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;
/* I'm not sure if fstat on a non-file (e.g., socket) works
* it should be safe to say if it fails, the fd isn't seekable.
*/
/* Newer UNIX versions support S_ISSOCK(), fstat() will probably
* succeed in most cases.
*/
if (fstat (unix_channel->fd, &buffer) == 0)
channel->is_seekable = S_ISREG (buffer.st_mode) || S_ISCHR (buffer.st_mode)
|| S_ISBLK (buffer.st_mode);
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 */
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;
}
unix_channel->fd = fd;
return channel;
}

View File

@ -699,20 +699,22 @@ g_io_win32_msg_write (GIOChannel *channel,
static GIOStatus
g_io_win32_no_seek (GIOChannel *channel,
gint offset,
glong offset,
GSeekType type,
GError **err)
{
g_set_error(err, G_IO_CHANNEL_ERROR, G_IO_CHANNEL_ERROR_SPIPE,
_("Seeking not allowed on this type of channel"));
g_assert_not_reached ();
return G_IO_STATUS_ERROR;
}
static void
g_io_win32_msg_close (GIOChannel *channel)
static GIOStatus
g_io_win32_msg_close (GIOChannel *channel,
GError **err)
{
/* Nothing to be done. Or should we set hwnd to some invalid value? */
return G_IO_STATUS_NORMAL;
}
static void
@ -794,7 +796,7 @@ g_io_win32_fd_read (GIOChannel *channel,
#endif
default:
g_set_error (err, G_IO_CHANNEL_ERROR,
g_channel_error_from_errno (errno),
g_io_channel_error_from_errno (errno),
strerror (errno));
return G_IO_STATUS_ERROR;
}
@ -832,7 +834,7 @@ g_io_win32_fd_write (GIOChannel *channel,
#endif
default:
g_set_error (err, G_IO_CHANNEL_ERROR,
g_channel_error_from_errno (errno),
g_io_channel_error_from_errno (errno),
strerror (errno));
return G_IO_STATUS_ERROR;
}
@ -845,7 +847,7 @@ g_io_win32_fd_write (GIOChannel *channel,
static GIOStatus
g_io_win32_fd_seek (GIOChannel *channel,
gint offset,
glong offset,
GSeekType type,
GError **err)
{
@ -874,7 +876,7 @@ g_io_win32_fd_seek (GIOChannel *channel,
if (result < 0)
{
g_set_error (err, G_IO_CHANNEL_ERROR,
g_channel_error_from_errno (errno),
g_io_channel_error_from_errno (errno),
strerror (errno));
return G_IO_STATUS_ERROR;
}
@ -882,8 +884,9 @@ g_io_win32_fd_seek (GIOChannel *channel,
return G_IO_STATUS_NORMAL;
}
static void
g_io_win32_fd_close (GIOChannel *channel)
static GIOStatus
g_io_win32_fd_close (GIOChannel *channel,
GError **err)
{
GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
@ -912,6 +915,10 @@ g_io_win32_fd_close (GIOChannel *channel)
win32_channel->fd = -1;
}
UNLOCK (win32_channel->mutex);
/* FIXME error detection? */
return G_IO_STATUS_NORMAL;
}
static GSource *
@ -935,7 +942,7 @@ g_io_win32_sock_read (GIOChannel *channel,
if (win32_channel->debug)
g_print ("g_io_win32_sock_read: sockfd:%d count:%d\n",
win32_channel->fd, count);
repeat:
result = recv (win32_channel->fd, buf, count, 0);
if (win32_channel->debug)
@ -954,7 +961,7 @@ g_io_win32_sock_read (GIOChannel *channel,
return G_IO_STATUS_AGAIN;
#ifdef WE_NEED_TO_HANDLE_WSAEINTR /* not anymore with wsock2 ? */
case WSAEINTR:
return G_IO_STATUS_INTR;
goto repeat;
#endif
default:
error = G_IO_CHANNEL_ERROR_FAILED;
@ -986,7 +993,7 @@ g_io_win32_sock_write (GIOChannel *channel,
if (win32_channel->debug)
g_print ("g_io_win32_sock_write: sockfd:%d count:%d\n",
win32_channel->fd, count);
repeat:
result = send (win32_channel->fd, buf, count, 0);
if (win32_channel->debug)
@ -1005,7 +1012,7 @@ g_io_win32_sock_write (GIOChannel *channel,
return G_IO_STATUS_AGAIN;
#ifdef WE_NEED_TO_HANDLE_WSAEINTR /* not anymore with wsock2 ? */
case WSAEINTR:
return G_IO_STATUS_INTR;
goto repeat;
#endif
default:
error = G_IO_CHANNEL_ERROR_FAILED;
@ -1023,8 +1030,9 @@ g_io_win32_sock_write (GIOChannel *channel,
}
}
static void
g_io_win32_sock_close (GIOChannel *channel)
static GIOStatus
g_io_win32_sock_close (GIOChannel *channel,
GError **err)
{
GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
@ -1049,6 +1057,10 @@ g_io_win32_sock_close (GIOChannel *channel)
win32_channel->fd = -1;
}
UNLOCK(win32_channel->mutex);
/* FIXME error detection? */
return G_IO_STATUS_NORMAL;
}
static GSource *
@ -1135,6 +1147,10 @@ g_io_channel_win32_new_messages (guint hwnd)
win32_channel->type = G_IO_WIN32_WINDOWS_MESSAGES;
win32_channel->hwnd = (HWND) hwnd;
/* FIXME set is_readable, is_writeable */
channel->is_seekable = FALSE;
return channel;
}
@ -1162,6 +1178,10 @@ g_io_channel_win32_new_fd (gint fd)
win32_channel->type = G_IO_WIN32_FILE_DESC;
win32_channel->fd = fd;
/* FIXME set is_readable, is_writeable */
channel->is_seekable = TRUE;
return channel;
}
@ -1187,6 +1207,10 @@ g_io_channel_win32_new_socket (int socket)
win32_channel->type = G_IO_WIN32_SOCKET;
win32_channel->fd = socket;
/* FIXME set is_readable, is_writeable */
channel->is_seekable = FALSE;
return channel;
}

View File

@ -0,0 +1,5 @@
Line one
Line two
Line three
/* Hello */
\x1234\x567890\x6666

View File

@ -19,43 +19,42 @@ gint main (gint argc, gchar * argv[])
GIOStatus status;
GIOFlags flags;
if (argc < 2)
{
g_print( "Usage: foo in-file\n" );
exit (1);
}
setbuf(stdout, NULL); /* For debugging */
gio_r = g_io_channel_new_file (argv[1], G_IO_FILE_MODE_READ, &gerr);
if(gerr) {
g_warning(gerr->message);
g_warning("Unable to open file %s", argv[1]);
g_free(gerr);
return 0;
}
gio_w = g_io_channel_new_file( "/var/tmp/fooOut.txt", G_IO_FILE_MODE_WRITE, &gerr);
if(gerr) {
g_warning(gerr->message);
g_free(gerr);
return 0;
}
gio_r = g_io_channel_new_file ("iochannel-test-infile", "r", &gerr);
if (gerr)
{
g_warning(gerr->message);
g_warning("Unable to open file %s", "iochannel-test-infile");
g_free(gerr);
return 0;
}
gio_w = g_io_channel_new_file( "iochannel-test-outfile", "w", &gerr);
if (gerr)
{
g_warning(gerr->message);
g_warning("Unable to open file %s", "iochannel-test-outfile");
g_free(gerr);
return 0;
}
g_io_channel_set_encoding (gio_r, encoding, &gerr);
if(gerr) {
g_warning(gerr->message);
g_free(gerr);
return 0;
}
if (gerr)
{
g_warning(gerr->message);
g_free(gerr);
return 0;
}
g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE);
status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr);
if(status == G_IO_STATUS_ERROR) {
g_warning(gerr->message);
g_error_free(gerr);
gerr = NULL;
}
if (status == G_IO_STATUS_ERROR)
{
g_warning(gerr->message);
g_error_free(gerr);
gerr = NULL;
}
flags = g_io_channel_get_flags (gio_r);
block = ! (flags & G_IO_FLAG_NONBLOCK);
if (block)
@ -106,9 +105,6 @@ gint main (gint argc, gchar * argv[])
{
case G_IO_STATUS_EOF:
break;
case G_IO_STATUS_PARTIAL_CHARS:
g_warning ("Partial characters at the end of input.");
break;
case G_IO_STATUS_ERROR:
g_warning (gerr->message);
g_error_free (gerr);
@ -123,11 +119,12 @@ gint main (gint argc, gchar * argv[])
status = g_io_channel_flush (gio_w, &gerr);
while (status == G_IO_STATUS_AGAIN);
if(status == G_IO_STATUS_ERROR) {
g_warning(gerr->message);
g_error_free(gerr);
gerr = NULL;
}
if (status == G_IO_STATUS_ERROR)
{
g_warning(gerr->message);
g_error_free(gerr);
gerr = NULL;
}
g_print ("read %d bytes, wrote %d bytes\n", rlength, wlength);

View File

@ -42,7 +42,7 @@ int main (int argc, char **argv)
if (argc == 2)
{
in = g_io_channel_new_file (argv[1], G_IO_FILE_MODE_READ, &error);
in = g_io_channel_new_file (argv[1], "r", &error);
if (!in)
{
fprintf (stderr, "Cannot open %s: %s\n", argv[1], error->message);

View File

@ -141,7 +141,7 @@ int main (int argc, char **argv)
if (argc == 3)
line_to_do = atoi(argv[2]);
in = g_io_channel_new_file (argv[1], G_IO_FILE_MODE_READ, &error);
in = g_io_channel_new_file (argv[1], "r", &error);
if (!in)
{
fprintf (stderr, "Cannot open %s: %s\n", argv[1], error->message);