Changeset 1257:0822da400485 in roaraudio
- Timestamp:
- 02/27/09 02:58:17 (15 years ago)
- Branch:
- default
- Phase:
- public
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
include/libroar/vio_cmd.h
r1256 r1257 41 41 #define ROAR_VIO_CMD_OPTS_NONBLOCK 0x01 42 42 #define ROAR_VIO_CMD_OPTS_ON_DEMAND 0x02 43 44 #define ROAR_VIO_CMD_BUFSIZE 1024 43 45 44 46 struct roar_vio_cmd_child { -
libroar/vio_cmd.c
r1256 r1257 78 78 calls->inst = (void*) state; 79 79 80 if ( reader != NULL ) 81 if ( roar_vio_cmd_fork(&(state->reader)) == -1 ) 82 return roar_vio_cmd_close(calls); 83 84 if ( writer != NULL ) 85 if ( roar_vio_cmd_fork(&(state->writer)) == -1 ) 86 return roar_vio_cmd_close(calls); 80 if ( !(options & ROAR_VIO_CMD_OPTS_ON_DEMAND) ) { 81 if ( reader != NULL ) 82 if ( roar_vio_cmd_fork(&(state->reader)) == -1 ) 83 return roar_vio_cmd_close(calls); 84 85 if ( writer != NULL ) 86 if ( roar_vio_cmd_fork(&(state->writer)) == -1 ) 87 return roar_vio_cmd_close(calls); 88 } 87 89 88 90 return 0; … … 195 197 ssize_t roar_vio_cmd_read (struct roar_vio_calls * vio, void *buf, size_t count) { 196 198 struct roar_vio_cmd_state * state = (struct roar_vio_cmd_state *)vio->inst; 199 fd_set rfhs[1], wfhs[1]; 200 struct timeval tv; 201 size_t done = 0; 202 int max_fh; 203 int ret; 204 char tbuf[ROAR_VIO_CMD_BUFSIZE]; 205 char * tp = NULL; 206 size_t tlen = 0; 197 207 198 208 if ( !state->reader.opened ) { … … 207 217 } 208 218 209 return -1; 219 while (done < count) { 220 if ( state->options & ROAR_VIO_CMD_OPTS_NONBLOCK ) { 221 tv.tv_sec = 0; 222 tv.tv_usec = 1; 223 } else { 224 tv.tv_sec = 3600; 225 tv.tv_usec = 0; 226 } 227 228 FD_ZERO(rfhs); 229 FD_ZERO(wfhs); 230 231 FD_SET(state->reader.in, rfhs); 232 FD_SET(state->reader.out, wfhs); 233 234 max_fh = state->reader.in > state->reader.out ? state->reader.in : state->reader.out; 235 236 if ( (ret = select(max_fh + 1, rfhs, wfhs, rfhs, &tv)) == -1 ) 237 return -1; 238 239 if ( ret > 0 ) { 240 if ( FD_ISSET(state->reader.in, rfhs) ) { 241 if ( (ret = read(state->reader.in, buf+done, count-done)) == -1 ) 242 break; 243 244 if ( ret == 0 ) 245 break; 246 247 done += ret; 248 } 249 250 if ( FD_ISSET(state->reader.out, wfhs) ) { 251 if ( !tlen ) { 252 tp = tbuf; 253 if ( (tlen = roar_vio_read(state->next, tp, ROAR_VIO_CMD_BUFSIZE)) == -1 ) 254 tlen = 0; 255 } 256 257 if ( tlen ) { 258 if ( (ret = write(state->reader.out, tp, tlen)) > 0 ) { 259 tlen -= ret; 260 tp += ret; 261 } 262 } 263 } 264 } 265 266 if ( state->options & ROAR_VIO_CMD_OPTS_NONBLOCK ) 267 break; 268 } 269 270 if ( tlen ) { /* we have some data to write to the child... */ 271 // TODO: try to write it out... 272 return -1; 273 } 274 275 return done; 210 276 } 211 277 … … 235 301 if ( state == ROAR_SOCKET_BLOCK ) 236 302 self->options -= ROAR_VIO_CMD_OPTS_NONBLOCK; 303 304 roar_vio_nonblock(self->next, state); // this should help, but may not nessessery. 237 305 238 306 return 0;
Note: See TracChangeset
for help on using the changeset viewer.