-
- switch(indexpid=fork()) {
- case -1:
- errstr = newstralloc2(errstr, "couldn't fork: ", strerror(errno));
- rc = 2;
- goto failed;
- default:
- aclose(indexfd);
- indexfd = -1; /* redundant */
- break;
- case 0:
- if (dup2(indexfd, 0) == -1) {
- error("err dup2 in: %s", strerror(errno));
- }
- indexfd = open(indexfile_tmp, O_WRONLY | O_CREAT | O_TRUNC, 0600);
- if (indexfd == -1)
- error("err open %s: %s", indexfile_tmp, strerror(errno));
- if (dup2(indexfd,1) == -1)
- error("err dup2 out: %s", strerror(errno));
- safe_fd(-1, 0);
- execlp(COMPRESS_PATH, COMPRESS_PATH, COMPRESS_BEST_OPT, (char *)0);
- error("error: couldn't exec %s.", COMPRESS_PATH);
- }
- }
-
- NAUGHTY_BITS_INITIALIZE;
-
- maxfd = max(mesgfd, datafd) + 1;
- eof1 = eof2 = 0;
-
- FD_ZERO(&readset);
-
- /* Just process messages for now. Once we have done the header
- ** we will start processing data too.
- */
- FD_SET(mesgfd, &readset);
-
- if(datafd == -1) eof1 = 1; /* fake eof on data */
-
-#if DUMPER_SOCKET_BUFFERING
-
-#ifndef EST_PACKET_SIZE
-#define EST_PACKET_SIZE 512
-#endif
-#ifndef EST_MIN_WINDOW
-#define EST_MIN_WINDOW EST_PACKET_SIZE*4 /* leave room for 2k in transit */
-#endif
-
- else {
- recbuf = STREAM_BUFSIZE;
- if (setsockopt(datafd, SOL_SOCKET, SO_RCVBUF,
- (void *) &recbuf, sizeof_recbuf)) {
- const int errornumber = errno;
- fprintf(stderr, "%s: pid %ld setsockopt(SO_RCVBUF): %s\n",
- get_pname(), (long) getpid(), strerror(errornumber));
- }
- if (getsockopt(datafd, SOL_SOCKET, SO_RCVBUF,
- (void *) &recbuf, (void *)&sizeof_recbuf)) {
- const int errornumber = errno;
- fprintf(stderr, "%s: pid %ld getsockopt(SO_RCVBUF): %s\n",
- get_pname(), (long) getpid(), strerror(errornumber));
- recbuf = 0;
- }
-
- /* leave at least EST_MIN_WINDOW between lowwat and recbuf */
- if (recbuf-lowat < EST_MIN_WINDOW)
- lowat = recbuf-EST_MIN_WINDOW;
-
- /* if lowwat < ~512, don't bother */
- if (lowat < EST_PACKET_SIZE)
- recbuf = 0;
- fprintf(stderr, "%s: pid %ld receive size is %d, low water is %d\n",
- get_pname(), (long) getpid(), recbuf, lowat);
- }
-#endif
-
- 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;