/* Free a buffered I/O handle */ int stream_close(StreamHandle_t * streamP, int reallyClose) { int rc; int retval = 0; assert(streamP != NULL); if (streamP->str_direction == STREAM_DIRECTION_WRITE && streamP->str_bufoff > 0) { rc = OS_WRITE(streamP->str_fd, streamP->str_buffer, streamP->str_bufoff); if (rc < 0) { retval = -1; } } if (reallyClose) { rc = OS_CLOSE(streamP->str_fd); if (rc < 0) { retval = -1; } } streamP->str_fd = INVALID_FD; IH_LOCK; DLL_INSERT_TAIL(streamP, streamAvailHead, streamAvailTail, str_next, str_prev); IH_UNLOCK; return retval; }
/* fseek for buffered I/O handles */ int stream_seek(StreamHandle_t * streamP, afs_foff_t offset, int whence) { int rc; int retval = 0; if (streamP->str_direction == STREAM_DIRECTION_WRITE && streamP->str_bufoff > 0) { rc = OS_WRITE(streamP->str_fd, streamP->str_buffer, streamP->str_bufoff); if (rc < 0) { streamP->str_error = errno; retval = -1; } } streamP->str_bufoff = 0; streamP->str_buflen = 0; streamP->str_eof = 0; streamP->str_direction = STREAM_DIRECTION_NONE; if (OS_SEEK(streamP->str_fd, offset, whence) < 0) { streamP->str_error = errno; retval = -1; } return retval; }
ssize_t ih_pwrite(int fd, const void * buf, size_t count, afs_foff_t offset) { afs_foff_t code; code = OS_SEEK(fd, offset, 0); if (code < 0) return code; return OS_WRITE(fd, buf, count); }
/* fwrite for buffered I/O handles */ afs_sfsize_t stream_write(void *ptr, afs_fsize_t size, afs_fsize_t nitems, StreamHandle_t * streamP) { char *p; afs_sfsize_t rc; afs_fsize_t nbytes, bytesWritten, bytesToWrite; /* Need to seek before changing direction */ if (streamP->str_direction == STREAM_DIRECTION_NONE) { streamP->str_direction = STREAM_DIRECTION_WRITE; streamP->str_bufoff = 0; streamP->str_buflen = STREAM_HANDLE_BUFSIZE; } else { assert(streamP->str_direction == STREAM_DIRECTION_WRITE); } nbytes = size * nitems; bytesWritten = 0; p = (char *)ptr; while (nbytes > 0) { if (streamP->str_buflen == 0) { rc = OS_WRITE(streamP->str_fd, streamP->str_buffer, STREAM_HANDLE_BUFSIZE); if (rc < 0) { streamP->str_error = errno; bytesWritten = 0; break; } streamP->str_bufoff = 0; streamP->str_buflen = STREAM_HANDLE_BUFSIZE; } bytesToWrite = nbytes; if (bytesToWrite > streamP->str_buflen) { bytesToWrite = streamP->str_buflen; } memcpy(streamP->str_buffer + streamP->str_bufoff, p, bytesToWrite); p += bytesToWrite; streamP->str_bufoff += bytesToWrite; streamP->str_buflen -= bytesToWrite; bytesWritten += bytesToWrite; nbytes -= bytesToWrite; } return (bytesWritten / size); }
/* fflush for buffered I/O handles */ int stream_flush(StreamHandle_t * streamP) { int rc; int retval = 0; if (streamP->str_direction == STREAM_DIRECTION_WRITE && streamP->str_bufoff > 0) { rc = OS_WRITE(streamP->str_fd, streamP->str_buffer, streamP->str_bufoff); if (rc < 0) { streamP->str_error = errno; retval = -1; } streamP->str_bufoff = 0; streamP->str_buflen = STREAM_HANDLE_BUFSIZE; } return retval; }