1 --- p910nd-0.7/p910nd.c.orig 2007-09-29 17:03:03.000000000 -0700
2 +++ p910nd-0.7.new/p910nd.c 2007-09-29 17:06:53.000000000 -0700
7 -ssize_t safe_write(int fd, char *buf, size_t count)
22 +void initBuffer( Buffer_t *b, int infd, int outfd, int detectEof )
24 + b->detectEof = detectEof;
36 +void prepBuffer( Buffer_t *b, fd_set *readfds, fd_set *writefds )
40 - while (offset < count) {
41 - ssize_t n = write(fd, buf + offset, count - offset);
43 - if (n < 0 && errno != EINTR)
48 + if (!b->err && b->bytes != 0) {
49 + FD_SET(b->outfd, writefds);
51 + if (!b->eof && b->bytes < sizeof(b->buffer)) {
52 + FD_SET(b->infd, readfds);
57 +ssize_t readBuffer( Buffer_t *b )
61 + if (b->bytes == 0 || b->err) {
62 + b->startidx = b->endidx = 0;
63 + avail = sizeof(b->buffer);
64 + } else if (b->bytes == sizeof(b->buffer)) {
66 + } else if (b->endidx > b->startidx) {
67 + avail = sizeof(b->buffer) - b->endidx;
69 + avail = b->startidx - b->endidx;
72 + result = read(b->infd, b->buffer+b->endidx, avail);
74 + b->endidx += result;
75 + b->totalin += result;
77 + if (b->endidx == sizeof(b->buffer))
79 + } else if (result < 0 || b->detectEof) {
86 +ssize_t writeBuffer( Buffer_t *b )
90 + if (b->bytes == 0 || b->err) {
92 + } else if (b->endidx > b->startidx) {
93 + avail = b->endidx - b->startidx;
95 + avail = sizeof(b->buffer) - b->startidx;
98 + result = write(b->outfd, b->buffer + b->startidx, avail);
100 + syslog(LOG_ERR, "write: %m\n");
103 + b->startidx += result;
104 + b->totalout += result;
105 + b->bytes -= result;
106 + if (b->startidx == sizeof(b->buffer))
113 /* Copy network socket to FILE f until EOS */
114 int copy_stream(int fd, int lp)
116 - int nread, rcvd = 0, sent = 0;
120 + initBuffer( &inbuffer, fd, lp, 1 );
126 + struct timeval now;
127 + struct timeval then;
128 + struct timeval timeout;
130 + Buffer_t outbuffer;
131 + initBuffer ( &outbuffer, lp, fd, 0 );
135 + FD_ZERO(&writefds);
136 + FD_SET(lp, &readfds);
137 + FD_SET(fd, &readfds);
138 + while ( (FD_ISSET(fd, &readfds)) ||
139 + (FD_ISSET(lp, &writefds))) {
140 int maxfd = lp > fd ? lp : fd;
142 - FD_SET(lp, &readfds);
143 - FD_SET(fd, &readfds);
144 - result = select(maxfd + 1, &readfds, 0, 0, 0);
146 + gettimeofday(&now,0);
147 + // If timer expired, clear timer
148 + // else don't try reading from printer
149 + if ((now.tv_sec > then.tv_sec) ||
150 + (now.tv_sec == then.tv_sec &&
151 + now.tv_usec > then.tv_usec)) {
154 + timeout.tv_sec = then.tv_sec;
155 + timeout.tv_usec = then.tv_usec;
156 + FD_CLR(lp, &readfds);
160 + result = select(maxfd + 1, &readfds, &writefds, 0, &timeout);
162 + result = select(maxfd + 1, &readfds, &writefds, 0, 0);
168 if (FD_ISSET(fd, &readfds)) {
169 - nread = read(fd, buffer, sizeof(buffer));
172 - if (safe_write(lp, buffer, nread) < 0) {
173 - syslog(LOG_ERR, "write: %m\n");
177 + result = readBuffer(&inbuffer);
179 if (FD_ISSET(lp, &readfds)) {
180 - nread = read(lp, buffer, sizeof(buffer));
182 - safe_write(fd, buffer, nread);
184 + result = readBuffer(&outbuffer);
185 + // Pace the printer data more slowly
187 + gettimeofday(&then,0);
189 + then.tv_usec += 100000;
190 + if (then.tv_usec > 1000000) {
191 + then.tv_usec -= 1000000;
197 + if (FD_ISSET(lp, &writefds)) {
198 + result = writeBuffer(&inbuffer);
200 + if (FD_ISSET(fd, &writefds)) {
201 + result = writeBuffer(&outbuffer);
202 + /* If socket write error, stop reading from it */
207 + FD_ZERO(&writefds);
208 + prepBuffer( &inbuffer, &readfds, &writefds );
209 + prepBuffer( &outbuffer, &readfds, &writefds );
211 syslog(LOG_NOTICE, "Finished job: %d bytes received, %d bytes sent\n",
214 + outbuffer.totalout);
217 - while ((nread = read(fd, buffer, sizeof(buffer))) > 0) {
218 - if (safe_write(lp, buffer, nread) < 0) {
219 - syslog(LOG_ERR, "write: %m\n");
223 + while ((result = readBuffer( &inbuffer)) > 0) {
224 + (void)writeBuffer( &inbuffer);
226 - syslog(LOG_NOTICE, "Finished job: %d bytes received\n", rcvd);
228 + syslog(LOG_NOTICE, "Finished job: %d bytes received\n", inbuffer.totalout);