mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-21 17:52:12 +03:00
Issue #13933: Remove transmute_mut from IO
The IO libraries casted self to mut so they can pass it to seek(SEEK_CUR, 0).
Fix this by introducing a private seek function that takes &self
- of course one should be careful with it if he lacks an
exclusive reference to self.
This commit is contained in:
@@ -90,6 +90,25 @@ pub fn fd(&self) -> fd_t { self.inner.fd }
|
||||
pub fn handle(&self) -> libc::HANDLE {
|
||||
unsafe { libc::get_osfhandle(self.fd()) as libc::HANDLE }
|
||||
}
|
||||
|
||||
// A version of seek that takes &self so that tell can call it
|
||||
// - the private seek should of course take &mut self.
|
||||
fn seek_common(&self, pos: i64, style: io::SeekStyle) -> Result<u64, IoError> {
|
||||
let whence = match style {
|
||||
io::SeekSet => libc::FILE_BEGIN,
|
||||
io::SeekEnd => libc::FILE_END,
|
||||
io::SeekCur => libc::FILE_CURRENT,
|
||||
};
|
||||
unsafe {
|
||||
let mut newpos = 0;
|
||||
match libc::SetFilePointerEx(self.handle(), pos, &mut newpos,
|
||||
whence) {
|
||||
0 => Err(super::last_error()),
|
||||
_ => Ok(newpos as u64),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
impl io::Reader for FileDesc {
|
||||
@@ -151,26 +170,13 @@ fn pwrite(&mut self, buf: &[u8], mut offset: u64) -> Result<(), IoError> {
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn seek(&mut self, pos: i64, style: io::SeekStyle) -> Result<u64, IoError> {
|
||||
let whence = match style {
|
||||
io::SeekSet => libc::FILE_BEGIN,
|
||||
io::SeekEnd => libc::FILE_END,
|
||||
io::SeekCur => libc::FILE_CURRENT,
|
||||
};
|
||||
unsafe {
|
||||
let mut newpos = 0;
|
||||
match libc::SetFilePointerEx(self.handle(), pos, &mut newpos,
|
||||
whence) {
|
||||
0 => Err(super::last_error()),
|
||||
_ => Ok(newpos as u64),
|
||||
}
|
||||
}
|
||||
self.seek_common(pos, style)
|
||||
}
|
||||
|
||||
fn tell(&self) -> Result<u64, IoError> {
|
||||
// This transmute is fine because our seek implementation doesn't
|
||||
// actually use the mutable self at all.
|
||||
// FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
|
||||
unsafe { mem::transmute::<&_, &mut FileDesc>(self).seek(0, io::SeekCur) }
|
||||
self.seek_common(0, io::SeekCur)
|
||||
}
|
||||
|
||||
fn fsync(&mut self) -> Result<(), IoError> {
|
||||
|
||||
@@ -377,7 +377,7 @@ fn base_write(&mut self, buf: &[u8], offset: i64) -> Result<(), IoError> {
|
||||
let r = FsRequest::write(&self.loop_, self.fd, buf, offset);
|
||||
r.map_err(uv_error_to_io_error)
|
||||
}
|
||||
fn seek_common(&mut self, pos: i64, whence: c_int) ->
|
||||
fn seek_common(&self, pos: i64, whence: c_int) ->
|
||||
Result<u64, IoError>{
|
||||
unsafe {
|
||||
match libc::lseek(self.fd, pos as libc::off_t, whence) {
|
||||
@@ -446,10 +446,8 @@ fn seek(&mut self, pos: i64, whence: io::SeekStyle) -> Result<u64, IoError> {
|
||||
}
|
||||
fn tell(&self) -> Result<u64, IoError> {
|
||||
use libc::SEEK_CUR;
|
||||
// this is temporary
|
||||
// FIXME #13933: Remove/justify all `&T` to `&mut T` transmutes
|
||||
let self_ = unsafe { mem::transmute::<&_, &mut FileWatcher>(self) };
|
||||
self_.seek_common(0, SEEK_CUR)
|
||||
|
||||
self.seek_common(0, SEEK_CUR)
|
||||
}
|
||||
fn fsync(&mut self) -> Result<(), IoError> {
|
||||
let _m = self.fire_homing_missile();
|
||||
|
||||
Reference in New Issue
Block a user