int silc_fd_stream_write(SilcStream stream, const unsigned char *data, SilcUInt32 data_len) { SilcFDStream fd_stream = stream; int ret; if (!fd_stream->notifier) return -2; SILC_LOG_DEBUG(("Writing data to fd %d", fd_stream->fd2)); ret = silc_file_write(fd_stream->fd2, data, data_len); if (ret < 0) { if (errno == EAGAIN || errno == EINTR) { SILC_LOG_DEBUG(("Could not write immediately, will do it later")); silc_schedule_set_listen_fd(fd_stream->schedule, fd_stream->fd2, SILC_TASK_READ | SILC_TASK_WRITE, FALSE); return -1; } SILC_LOG_DEBUG(("Cannot write to fd: %s", strerror(errno))); silc_schedule_unset_listen_fd(fd_stream->schedule, fd_stream->fd2); fd_stream->error = errno; return -2; } SILC_LOG_DEBUG(("Wrote data %d bytes", ret)); if (fd_stream->fd1 == fd_stream->fd2) silc_schedule_set_listen_fd(fd_stream->schedule, fd_stream->fd2, SILC_TASK_READ, FALSE); else silc_schedule_unset_listen_fd(fd_stream->schedule, fd_stream->fd2); return ret; }
int silc_file_writefile(const char *filename, const char *buffer, SilcUInt32 len) { int fd; int flags = O_CREAT | O_WRONLY | O_TRUNC; #if defined(O_BINARY) flags |= O_BINARY; #endif /* O_BINARY */ if ((fd = open(filename, flags, 0644)) == -1) { SILC_LOG_ERROR(("Cannot open file %s for writing: %s", filename, silc_errno_string(silc_errno))); return -1; } if (silc_file_write(fd, buffer, len) == -1) { SILC_LOG_ERROR(("Cannot write to file %s: %s", filename, silc_errno_string(silc_errno))); silc_file_close(fd); return -1; } #ifdef SILC_UNIX fsync(fd); #endif /* SILC_UNIX */ return silc_file_close(fd); }
static void silc_client_ftp_data(SilcSFTP sftp, SilcSFTPStatus status, const unsigned char *data, SilcUInt32 data_len, void *context) { SilcClientFtpSession session = (SilcClientFtpSession)context; SILC_LOG_DEBUG(("Start")); if (status == SILC_SFTP_STATUS_EOF) { /* EOF received */ /* Close the handle */ silc_sftp_close(sftp, session->read_handle, NULL, NULL); session->read_handle = NULL; /* Close the real file descriptor */ silc_file_close(session->fd); return; } if (status != SILC_SFTP_STATUS_OK) { /* Call monitor callback */ if (session->monitor) (*session->monitor)(session->client, session->conn, SILC_CLIENT_FILE_MONITOR_ERROR, (status == SILC_SFTP_STATUS_NO_SUCH_FILE ? SILC_CLIENT_FILE_NO_SUCH_FILE : status == SILC_SFTP_STATUS_PERMISSION_DENIED ? SILC_CLIENT_FILE_PERMISSION_DENIED : SILC_CLIENT_FILE_ERROR), 0, 0, session->client_entry, session->session_id, session->filepath, session->monitor_context); /* Close the handle */ silc_sftp_close(sftp, session->read_handle, NULL, NULL); session->read_handle = NULL; /* Close the real file descriptor */ silc_file_close(session->fd); return; } /* Read more, until EOF is received */ session->read_offset += data_len; silc_sftp_read(sftp, session->read_handle, session->read_offset, SILC_PACKET_MAX_LEN - 1024, silc_client_ftp_data, session); /* Write the read data to the real file */ silc_file_write(session->fd, data, data_len); /* Call monitor callback */ if (session->monitor) (*session->monitor)(session->client, session->conn, SILC_CLIENT_FILE_MONITOR_RECEIVE, SILC_CLIENT_FILE_OK, session->read_offset, session->filesize, session->client_entry, session->session_id, session->filepath, session->monitor_context); }