- while(!(eof1 && eof2)) {
-
-#if DUMPER_SOCKET_BUFFERING
- /* Set socket buffering */
- if (recbuf>0 && !lowwatset) {
- if (setsockopt(datafd, SOL_SOCKET, SO_RCVLOWAT,
- (void *) &lowat, sizeof(lowat))) {
- const int errornumber = errno;
- fprintf(stderr,
- "%s: pid %ld setsockopt(SO_RCVLOWAT): %s\n",
- get_pname(), (long) getpid(), strerror(errornumber));
- }
- lowwatset = 1;
- lowwatset_count++;
- }
-#endif
-
- timeout.tv_sec = conf_dtimeout;
- timeout.tv_usec = 0;
- memcpy(&selectset, &readset, sizeof(fd_set));
-
- nfound = select(maxfd, (SELECT_ARG_TYPE *)(&selectset), NULL, NULL, &timeout);
-
- /* check for errors or timeout */
-
-#if DUMPER_SOCKET_BUFFERING
- if (nfound==0 && lowwatset) {
- const int zero = 0;
- /* Disable socket buffering and ... */
- if (setsockopt(datafd, SOL_SOCKET, SO_RCVLOWAT,
- (void *) &zero, sizeof(zero))) {
- const int errornumber = errno;
- fprintf(stderr,
- "%s: pid %ld setsockopt(SO_RCVLOWAT): %s\n",
- get_pname(), (long) getpid(), strerror(errornumber));
- }
- lowwatset = 0;
-
- /* ... try once more */
- timeout.tv_sec = conf_dtimeout;
- timeout.tv_usec = 0;
- memcpy(&selectset, &readset, sizeof(fd_set));
- nfound = select(maxfd, (SELECT_ARG_TYPE *)(&selectset), NULL, NULL, &timeout);
- }
-#endif
-
- if(nfound == 0) {
- errstr = newstralloc(errstr, "data timeout");
- rc = 2;
- goto failed;
- }
- if(nfound == -1) {
- errstr = newstralloc2(errstr, "select: ", strerror(errno));
- rc = 2;
- goto failed;
- }
-
- /* read/write any data */
-
- if(datafd >= 0 && FD_ISSET(datafd, &selectset)) {
- size1 = read(datafd, datain, datalimit - datain);
- if(size1 < 0) {
- errstr = newstralloc2(errstr, "data read: ", strerror(errno));
- rc = 2;
- goto failed;
- }
- if(update_dataptr(&outfd, size1)) {
- rc = 2;
- goto failed;
- }
- if(size1 == 0) {
- eof1 = 1;
- FD_CLR(datafd, &readset);
- aclose(datafd);
- }
- }
-
- if(mesgfd >= 0 && FD_ISSET(mesgfd, &selectset)) {
- size2 = read(mesgfd, mesgbuf, sizeof(mesgbuf)-1);
- switch(size2) {
- case -1:
- errstr = newstralloc2(errstr, "mesg read: ", strerror(errno));
- rc = 2;
- goto failed;
- case 0:
- eof2 = 1;
- process_dumpeof();
- FD_CLR(mesgfd, &readset);
- aclose(mesgfd);
- break;
- default:
- mesgbuf[size2] = '\0';
- add_msg_data(mesgbuf, size2);
- }
-
- if (got_info_endline && !header_done) { /* time to do the header */
- make_tapeheader(&file, F_DUMPFILE);
- if (write_tapeheader(outfd, &file)) {
- int save_errno = errno;
- errstr = newstralloc2(errstr, "write_tapeheader: ",
- strerror(errno));
- if(save_errno == ENOSPC) {
- putresult(NO_ROOM, "%s %lu\n", handle,
- use+split_size-dumpsize);
- use = 0; /* force RQ_MORE_DISK */
- split_size = dumpsize;
- rc = 1;
- }
- else {
- rc = 2;
- }
- goto failed;
- }
- dumpsize += DISK_BLOCK_KB;
- filesize += DISK_BLOCK_KB;
- nb_header_block++;
- header_done = 1;
- strncat(cont_filename,filename,sizeof(cont_filename));
- cont_filename[sizeof(cont_filename)-1] = '\0';
-
- if (datafd != -1)
- FD_SET(datafd, &readset); /* now we can read the data */
- }
- }
- } /* end while */
-
-#if DUMPER_SOCKET_BUFFERING
- if(lowwatset_count > 1) {
- fprintf(stderr, "%s: pid %ld low water set %d times\n",
- get_pname(), (long) getpid(), lowwatset_count);