Changeset 533
- Timestamp:
- 04/14/04 13:00:41 (5 years ago)
- Files:
-
- trunk/src/stream.c (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/stream.c
r502 r533 1 /* $Id: stream.c,v 1.2 3 2004/03/17 22:40:02jajcus Exp $ */1 /* $Id: stream.c,v 1.24 2004/04/14 11:00:41 jajcus Exp $ */ 2 2 3 3 /* … … 82 82 } 83 83 s->ioch=g_io_channel_unix_new(fd); 84 g_io_channel_set_encoding(s->ioch,NULL,NULL); 85 g_io_channel_set_buffered(s->ioch,0); 84 86 s->sa.sin_family=AF_INET; 85 87 s->sa.sin_port=htons(port); … … 195 197 int stream_io_read(GIOChannel *source,GIOCondition condition,gpointer data){ 196 198 Stream *s; 197 GIOError err; 198 guint br; 199 GIOStatus st; 200 GError *error=NULL; 201 gsize br; 199 202 200 203 s=(Stream *)data; … … 208 211 s->read_buf_len=1024; 209 212 } 210 err=g_io_channel_read(source,s->read_buf,s->read_buf_len,&br); 211 if (err==G_IO_ERROR_INVAL || br<1){ 213 st=g_io_channel_read_chars(source,s->read_buf,s->read_buf_len,&br,&error); 214 if (st!=G_IO_STATUS_NORMAL){ 215 g_warning("read: %i %s",st,error?error->message:"unknown"); 216 if (error) g_error_free(error); 217 error=NULL; 212 218 s->read_watch=0; 213 219 s->xs->f(XSTREAM_CLOSE,NULL,s); 214 220 return FALSE; 215 221 } 216 if (err==G_IO_ERROR_AGAIN) return TRUE; 217 if (err!=G_IO_ERROR_NONE){ 218 g_warning("read: %s",g_strerror(errno)); 219 return TRUE; 220 } 222 if (error) g_error_free(error); 223 error=NULL; 224 if (st==G_IO_STATUS_AGAIN) return TRUE; 221 225 s->read_buf[br]=0; 222 226 debug("IN: %s",s->read_buf); … … 228 232 Stream *s; 229 233 char * str; 230 GIOError err; 231 guint br; 234 GIOStatus st; 235 GError *error=NULL; 236 gsize br; 232 237 233 238 s=(Stream *)data; … … 235 240 236 241 if (s->write_buf && s->write_pos>=0 && s->write_len>=0){ 237 err=g_io_channel_write(source,242 st=g_io_channel_write_chars(source, 238 243 s->write_buf+s->write_pos, 239 244 s->write_len-s->write_pos, 240 &br); 241 if (err==G_IO_ERROR_INVAL){ 245 &br, 246 &error); 247 if (st==G_IO_STATUS_ERROR){ 248 g_warning("write error: %s",error?error->message:"unknwown"); 242 249 s->write_watch=0; 243 250 s->xs->f(XSTREAM_CLOSE,NULL,s); 251 if (error) g_error_free(error); 244 252 return FALSE; 245 253 } 246 if (err==G_IO_ERROR_AGAIN) return TRUE; 247 if (err!=G_IO_ERROR_NONE){ 248 g_warning("write: %s",g_strerror(errno)); 254 if (st==G_IO_STATUS_AGAIN) return TRUE; 255 if (st!=G_IO_STATUS_NORMAL){ 256 g_warning("write status: %i (%s)",st,error?error->message:"unknown"); 257 if (error) g_error_free(error); 249 258 return TRUE; 250 259 } 260 if (error) g_error_free(error); 261 error=NULL; 251 262 str=g_new(char,br+1); 252 263 g_assert(str!=NULL); … … 256 267 g_free(str); 257 268 s->write_pos+=br; 269 debug("write_pos: %i, write_len: %i, br: %i\n",s->write_pos,s->write_len,(int)br); 258 270 if (s->write_pos==s->write_len){ 259 271 s->write_watch=0; … … 268 280 int stream_write_bytes(Stream *s,const char *buf,int l){ 269 281 time_t stream_flush_timeout; 282 GIOStatus st; 283 GError *error=NULL; 270 284 271 285 if (!l) return 0; … … 285 299 if (!s->write_len && l>MAX_WRITE_BUF){ 286 300 int pos=0; 287 int written,err;301 gsize written; 288 302 char *str; 289 303 debug("Flushing data that don't fit into the write buffer."); 290 304 while(pos<l){ 291 err=g_io_channel_write(s->ioch,305 st=g_io_channel_write_chars(s->ioch, 292 306 (gchar *)buf+pos, 293 307 l-pos, 294 &written); 295 if (err!=G_IO_ERROR_AGAIN && err!=G_IO_ERROR_NONE){ 296 g_warning("write: %s",g_strerror(errno)); 308 &written, 309 &error); 310 if (st!=G_IO_STATUS_AGAIN && st!=G_IO_STATUS_NORMAL){ 311 g_warning("write: %i: %s",st,error?error->message:"unknown"); 312 if (error) g_error_free(error); 297 313 return -2; 298 314 } 315 if (error) g_error_free(error); 316 error=NULL; 299 317 str=g_new(char,written+1); 300 318 g_assert(str!=NULL); … … 371 389 char goodbye[]="</stream:stream>"; 372 390 guint i,l; 373 GIOError err; 374 guint br; 391 gsize br; 392 GIOStatus st; 393 GError *error=NULL; 375 394 376 395 i=0; 377 396 l=sizeof(goodbye); 378 397 do{ 379 err=g_io_channel_write(s->ioch,goodbye+i,l,&br); 398 st=g_io_channel_write_chars(s->ioch,goodbye+i,l,&br,&error); 399 if (error) g_error_free(error); 400 error=NULL; 380 401 l-=br; 381 402 i+=br; 382 }while( err==G_IO_ERROR_AGAIN||(err=G_IO_ERROR_NONE&& l>0));403 }while(st==G_IO_STATUS_AGAIN||(st=G_IO_STATUS_NORMAL && l>0)); 383 404 s->closing=1; 384 405 }
