int silc_fd_stream_read(SilcStream stream, unsigned char *buf, SilcUInt32 buf_len) { SilcFDStream fd_stream = stream; int len = 0; if (!fd_stream->notifier) return -2; SILC_LOG_DEBUG(("Reading data from fd %d", fd_stream->fd1)); len = silc_file_read(fd_stream->fd1, buf, buf_len); if (len < 0) { if (errno == EAGAIN || errno == EINTR) { SILC_LOG_DEBUG(("Could not read immediately, will do it later")); silc_schedule_set_listen_fd(fd_stream->schedule, fd_stream->fd1, SILC_TASK_READ, FALSE); return -1; } SILC_LOG_DEBUG(("Cannot read from fd: %d:%s", fd_stream->fd1, strerror(errno))); silc_schedule_unset_listen_fd(fd_stream->schedule, fd_stream->fd1); fd_stream->error = errno; return -2; } SILC_LOG_DEBUG(("Read %d bytes", len)); if (!len) silc_schedule_unset_listen_fd(fd_stream->schedule, fd_stream->fd1); return len; }
char *silc_file_readfile(const char *filename, SilcUInt32 *return_len, SilcStack stack) { int fd; unsigned char *buffer; int filelen; fd = silc_file_open(filename, O_RDONLY); if (fd < 0) { if (silc_errno == SILC_ERR_NO_SUCH_FILE) return NULL; SILC_LOG_ERROR(("Cannot open file %s: %s", filename, silc_errno_string(silc_errno))); return NULL; } filelen = lseek(fd, (off_t)0L, SEEK_END); if (filelen < 0) { silc_set_errno_posix(errno); silc_file_close(fd); return NULL; } if (lseek(fd, (off_t)0L, SEEK_SET) < 0) { silc_set_errno_posix(errno); silc_file_close(fd); return NULL; } buffer = silc_calloc(filelen + 1, sizeof(*buffer)); if (!buffer) { silc_set_errno_posix(errno); silc_file_close(fd); return NULL; } if ((silc_file_read(fd, buffer, filelen)) == -1) { memset(buffer, 0, sizeof(buffer)); silc_file_close(fd); SILC_LOG_ERROR(("Cannot read from file %s: %s", filename, silc_errno_string(silc_errno))); return NULL; } silc_file_close(fd); buffer[filelen] = EOF; if (return_len) *return_len = filelen; return (char *)buffer; }
char *silc_file_readfile(const char *filename, SilcUInt32 *return_len) { int fd; char *buffer; int filelen; fd = silc_file_open(filename, O_RDONLY); if (fd < 0) { if (errno == ENOENT) return NULL; SILC_LOG_ERROR(("Cannot open file %s: %s", filename, strerror(errno))); return NULL; } filelen = lseek(fd, (off_t)0L, SEEK_END); if (filelen < 0) { silc_file_close(fd); return NULL; } if (lseek(fd, (off_t)0L, SEEK_SET) < 0) { silc_file_close(fd); return NULL; } if (filelen < 0) { SILC_LOG_ERROR(("Cannot open file %s: %s", filename, strerror(errno))); silc_file_close(fd); return NULL; } buffer = silc_calloc(filelen + 1, sizeof(char)); if ((silc_file_read(fd, buffer, filelen)) == -1) { memset(buffer, 0, sizeof(buffer)); silc_file_close(fd); SILC_LOG_ERROR(("Cannot read from file %s: %s", filename, strerror(errno))); return NULL; } silc_file_close(fd); buffer[filelen] = EOF; if (return_len) *return_len = filelen; return buffer; }