1 | #undef G_DISABLE_ASSERT |
---|
2 | #undef G_LOG_DOMAIN |
---|
3 | |
---|
4 | #include <sys/types.h> |
---|
5 | #include <sys/stat.h> |
---|
6 | #include <fcntl.h> |
---|
7 | #include <glib.h> |
---|
8 | #include <string.h> |
---|
9 | #include <stdio.h> |
---|
10 | #include <stdlib.h> |
---|
11 | |
---|
12 | #define BUFFER_SIZE 1024 |
---|
13 | |
---|
14 | gint main (gint argc, gchar * argv[]) |
---|
15 | { |
---|
16 | GIOChannel *gio_r, *gio_w ; |
---|
17 | GError *gerr = NULL; |
---|
18 | GString *buffer; |
---|
19 | char *filename; |
---|
20 | char *srcdir = getenv ("srcdir"); |
---|
21 | gint rlength = 0; |
---|
22 | glong wlength = 0; |
---|
23 | gsize length_out; |
---|
24 | gboolean block; |
---|
25 | const gchar encoding[] = "EUC-JP"; |
---|
26 | GIOStatus status; |
---|
27 | GIOFlags flags; |
---|
28 | |
---|
29 | if (!srcdir) |
---|
30 | srcdir = "."; |
---|
31 | filename = g_strconcat (srcdir, G_DIR_SEPARATOR_S, "iochannel-test-infile", NULL); |
---|
32 | |
---|
33 | setbuf(stdout, NULL); /* For debugging */ |
---|
34 | |
---|
35 | gio_r = g_io_channel_new_file (filename, "r", &gerr); |
---|
36 | if (gerr) |
---|
37 | { |
---|
38 | g_warning("Unable to open file %s: %s", filename, gerr->message); |
---|
39 | g_error_free(gerr); |
---|
40 | return 1; |
---|
41 | } |
---|
42 | gio_w = g_io_channel_new_file( "iochannel-test-outfile", "w", &gerr); |
---|
43 | if (gerr) |
---|
44 | { |
---|
45 | g_warning("Unable to open file %s: %s", "iochannel-test-outfile", gerr->message); |
---|
46 | g_error_free(gerr); |
---|
47 | return 1; |
---|
48 | } |
---|
49 | |
---|
50 | g_io_channel_set_encoding (gio_r, encoding, &gerr); |
---|
51 | if (gerr) |
---|
52 | { |
---|
53 | g_warning(gerr->message); |
---|
54 | g_error_free(gerr); |
---|
55 | return 1; |
---|
56 | } |
---|
57 | |
---|
58 | g_io_channel_set_buffer_size (gio_r, BUFFER_SIZE); |
---|
59 | |
---|
60 | status = g_io_channel_set_flags (gio_r, G_IO_FLAG_NONBLOCK, &gerr); |
---|
61 | if (status == G_IO_STATUS_ERROR) |
---|
62 | { |
---|
63 | g_warning(gerr->message); |
---|
64 | g_error_free(gerr); |
---|
65 | gerr = NULL; |
---|
66 | } |
---|
67 | flags = g_io_channel_get_flags (gio_r); |
---|
68 | block = ! (flags & G_IO_FLAG_NONBLOCK); |
---|
69 | if (block) |
---|
70 | g_print (" BLOCKING TRUE \n\n"); |
---|
71 | else |
---|
72 | g_print (" BLOCKING FALSE \n\n"); |
---|
73 | |
---|
74 | buffer = g_string_sized_new (BUFFER_SIZE); |
---|
75 | |
---|
76 | while (TRUE) |
---|
77 | { |
---|
78 | do |
---|
79 | status = g_io_channel_read_line_string (gio_r, buffer, NULL, &gerr); |
---|
80 | while (status == G_IO_STATUS_AGAIN); |
---|
81 | if (status != G_IO_STATUS_NORMAL) |
---|
82 | break; |
---|
83 | |
---|
84 | rlength += buffer->len; |
---|
85 | |
---|
86 | do |
---|
87 | status = g_io_channel_write_chars (gio_w, buffer->str, buffer->len, |
---|
88 | &length_out, &gerr); |
---|
89 | while (status == G_IO_STATUS_AGAIN); |
---|
90 | if (status != G_IO_STATUS_NORMAL) |
---|
91 | break; |
---|
92 | |
---|
93 | wlength += length_out; |
---|
94 | |
---|
95 | if (length_out < buffer->len) |
---|
96 | g_warning ("Only wrote part of the line."); |
---|
97 | |
---|
98 | g_print ("%s", buffer->str); |
---|
99 | g_string_truncate (buffer, 0); |
---|
100 | } |
---|
101 | |
---|
102 | switch (status) |
---|
103 | { |
---|
104 | case G_IO_STATUS_EOF: |
---|
105 | break; |
---|
106 | case G_IO_STATUS_ERROR: |
---|
107 | g_warning (gerr->message); |
---|
108 | g_error_free (gerr); |
---|
109 | gerr = NULL; |
---|
110 | break; |
---|
111 | default: |
---|
112 | g_warning ("Abnormal exit from write loop."); |
---|
113 | break; |
---|
114 | } |
---|
115 | |
---|
116 | do |
---|
117 | status = g_io_channel_flush (gio_w, &gerr); |
---|
118 | while (status == G_IO_STATUS_AGAIN); |
---|
119 | |
---|
120 | if (status == G_IO_STATUS_ERROR) |
---|
121 | { |
---|
122 | g_warning(gerr->message); |
---|
123 | g_error_free(gerr); |
---|
124 | gerr = NULL; |
---|
125 | } |
---|
126 | |
---|
127 | g_print ("read %d bytes, wrote %ld bytes\n", rlength, wlength); |
---|
128 | |
---|
129 | g_io_channel_unref(gio_r); |
---|
130 | g_io_channel_unref(gio_w); |
---|
131 | |
---|
132 | return 0; |
---|
133 | } |
---|