mod.rs 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. use alloc::vec::Vec;
  2. use core::{fmt, ptr};
  3. use io::{self, Read, Write};
  4. pub use self::allocator::*;
  5. #[cfg(not(feature = "ralloc"))]
  6. #[path = "allocator/dlmalloc.rs"]
  7. mod allocator;
  8. #[cfg(feature = "ralloc")]
  9. #[path = "allocator/ralloc.rs"]
  10. mod allocator;
  11. pub use self::pal::{Pal, PalEpoll, PalPtrace, PalSignal, PalSocket};
  12. mod pal;
  13. pub use self::sys::{e, Sys};
  14. #[cfg(all(not(feature = "no_std"), target_os = "linux"))]
  15. #[path = "linux/mod.rs"]
  16. mod sys;
  17. #[cfg(all(not(feature = "no_std"), target_os = "redox"))]
  18. #[path = "redox/mod.rs"]
  19. mod sys;
  20. mod pte;
  21. pub use self::rlb::{Line, RawLineBuffer};
  22. pub mod rlb;
  23. use self::types::*;
  24. pub mod types;
  25. #[thread_local]
  26. #[allow(non_upper_case_globals)]
  27. #[no_mangle]
  28. pub static mut errno: c_int = 0;
  29. #[allow(non_upper_case_globals)]
  30. pub static mut argv: *mut *mut c_char = ptr::null_mut();
  31. #[allow(non_upper_case_globals)]
  32. pub static mut inner_argv: Vec<*mut c_char> = Vec::new();
  33. #[allow(non_upper_case_globals)]
  34. #[no_mangle]
  35. pub static mut environ: *mut *mut c_char = ptr::null_mut();
  36. #[allow(non_upper_case_globals)]
  37. pub static mut inner_environ: Vec<*mut c_char> = Vec::new();
  38. pub trait WriteByte: fmt::Write {
  39. fn write_u8(&mut self, byte: u8) -> fmt::Result;
  40. }
  41. impl<'a, W: WriteByte> WriteByte for &'a mut W {
  42. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  43. (**self).write_u8(byte)
  44. }
  45. }
  46. pub struct FileWriter(pub c_int);
  47. impl FileWriter {
  48. pub fn write(&mut self, buf: &[u8]) -> isize {
  49. Sys::write(self.0, buf)
  50. }
  51. }
  52. impl fmt::Write for FileWriter {
  53. fn write_str(&mut self, s: &str) -> fmt::Result {
  54. self.write(s.as_bytes());
  55. Ok(())
  56. }
  57. }
  58. impl WriteByte for FileWriter {
  59. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  60. self.write(&[byte]);
  61. Ok(())
  62. }
  63. }
  64. pub struct FileReader(pub c_int);
  65. impl FileReader {
  66. pub fn read(&mut self, buf: &mut [u8]) -> isize {
  67. Sys::read(self.0, buf)
  68. }
  69. }
  70. impl Read for FileReader {
  71. fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
  72. let i = Sys::read(self.0, buf);
  73. if i >= 0 {
  74. Ok(i as usize)
  75. } else {
  76. Err(io::Error::from_raw_os_error(-i as i32))
  77. }
  78. }
  79. }
  80. pub struct AllocStringWriter(pub *mut u8, pub usize);
  81. impl Write for AllocStringWriter {
  82. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  83. let ptr = unsafe { realloc(self.0 as *mut c_void, self.1 + buf.len() + 1) as *mut u8 };
  84. if ptr.is_null() {
  85. return Err(io::Error::new(
  86. io::ErrorKind::Other,
  87. "AllocStringWriter::write failed to allocate",
  88. ));
  89. }
  90. self.0 = ptr;
  91. unsafe {
  92. ptr::copy_nonoverlapping(buf.as_ptr(), self.0.add(self.1), buf.len());
  93. self.1 += buf.len();
  94. *self.0.add(self.1) = 0;
  95. }
  96. Ok(buf.len())
  97. }
  98. fn flush(&mut self) -> io::Result<()> {
  99. Ok(())
  100. }
  101. }
  102. impl fmt::Write for AllocStringWriter {
  103. fn write_str(&mut self, s: &str) -> fmt::Result {
  104. // can't fail
  105. self.write(s.as_bytes()).unwrap();
  106. Ok(())
  107. }
  108. }
  109. impl WriteByte for AllocStringWriter {
  110. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  111. // can't fail
  112. self.write(&[byte]).unwrap();
  113. Ok(())
  114. }
  115. }
  116. pub struct StringWriter(pub *mut u8, pub usize);
  117. impl Write for StringWriter {
  118. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  119. if self.1 > 1 {
  120. let copy_size = buf.len().min(self.1 - 1);
  121. unsafe {
  122. ptr::copy_nonoverlapping(buf.as_ptr(), self.0, copy_size);
  123. self.1 -= copy_size;
  124. self.0 = self.0.add(copy_size);
  125. *self.0 = 0;
  126. }
  127. Ok(copy_size)
  128. } else {
  129. Ok(0)
  130. }
  131. }
  132. fn flush(&mut self) -> io::Result<()> {
  133. Ok(())
  134. }
  135. }
  136. impl fmt::Write for StringWriter {
  137. fn write_str(&mut self, s: &str) -> fmt::Result {
  138. // can't fail
  139. self.write(s.as_bytes()).unwrap();
  140. Ok(())
  141. }
  142. }
  143. impl WriteByte for StringWriter {
  144. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  145. // can't fail
  146. self.write(&[byte]).unwrap();
  147. Ok(())
  148. }
  149. }
  150. pub struct UnsafeStringWriter(pub *mut u8);
  151. impl Write for UnsafeStringWriter {
  152. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  153. unsafe {
  154. ptr::copy_nonoverlapping(buf.as_ptr(), self.0, buf.len());
  155. self.0 = self.0.add(buf.len());
  156. *self.0 = b'\0';
  157. }
  158. Ok(buf.len())
  159. }
  160. fn flush(&mut self) -> io::Result<()> {
  161. Ok(())
  162. }
  163. }
  164. impl fmt::Write for UnsafeStringWriter {
  165. fn write_str(&mut self, s: &str) -> fmt::Result {
  166. // can't fail
  167. self.write(s.as_bytes()).unwrap();
  168. Ok(())
  169. }
  170. }
  171. impl WriteByte for UnsafeStringWriter {
  172. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  173. // can't fail
  174. self.write(&[byte]).unwrap();
  175. Ok(())
  176. }
  177. }
  178. pub struct UnsafeStringReader(pub *const u8);
  179. impl Read for UnsafeStringReader {
  180. fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
  181. unsafe {
  182. for i in 0..buf.len() {
  183. if *self.0 == 0 {
  184. return Ok(i);
  185. }
  186. buf[i] = *self.0;
  187. self.0 = self.0.offset(1);
  188. }
  189. Ok(buf.len())
  190. }
  191. }
  192. }
  193. pub struct CountingWriter<T> {
  194. pub inner: T,
  195. pub written: usize,
  196. }
  197. impl<T> CountingWriter<T> {
  198. pub fn new(writer: T) -> Self {
  199. Self {
  200. inner: writer,
  201. written: 0,
  202. }
  203. }
  204. }
  205. impl<T: fmt::Write> fmt::Write for CountingWriter<T> {
  206. fn write_str(&mut self, s: &str) -> fmt::Result {
  207. self.written += s.len();
  208. self.inner.write_str(s)
  209. }
  210. }
  211. impl<T: WriteByte> WriteByte for CountingWriter<T> {
  212. fn write_u8(&mut self, byte: u8) -> fmt::Result {
  213. self.written += 1;
  214. self.inner.write_u8(byte)
  215. }
  216. }
  217. impl<T: Write> Write for CountingWriter<T> {
  218. fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
  219. let res = self.inner.write(buf);
  220. if let Ok(written) = res {
  221. self.written += written;
  222. }
  223. res
  224. }
  225. fn write_all(&mut self, buf: &[u8]) -> io::Result<()> {
  226. match self.inner.write_all(&buf) {
  227. Ok(()) => (),
  228. Err(ref err) if err.kind() == io::ErrorKind::WriteZero => (),
  229. Err(err) => return Err(err),
  230. }
  231. self.written += buf.len();
  232. Ok(())
  233. }
  234. fn flush(&mut self) -> io::Result<()> {
  235. self.inner.flush()
  236. }
  237. }