Guest User

Untitled

a guest
Nov 24th, 2017
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.19 KB | None | 0 0
  1. libc_fn!(unsafe gethostent() -> Result<*const hostent> {
  2. if hostdb == 0 {
  3. hostdb = syscall::open("/etc/hosts", syscall::O_RDONLY).unwrap();
  4. }
  5.  
  6. let mut line = RawLineBuffer::new(hostdb);
  7. let mut host_aliases: [*const u8; MAXALIASES] = [0 as *const u8; MAXALIASES];
  8. let hostaddr: [usize; (MAXADDRS+mem::size_of::<u64>()-1)/mem::size_of::<u64>()] = [0; (MAXADDRS+mem::size_of::<u64>()-1)/mem::size_of::<u64>()];
  9. let mut host_addrs: [*mut libc::c_char;2] = [0 as *mut libc::c_char; 2];
  10.  
  11. let mut currentBlock = 0;
  12. let mut p : *mut u8 = null_mut();
  13. let mut cp : *mut u8 = null_mut();
  14. let mut q : *mut *mut u8;
  15.  
  16. 'loop1: loop {
  17. let mut r = line.next();
  18. //let _ = syscall::write(2, "loop 1\n".as_bytes());
  19. if r == None {
  20. //let _ = syscall::write(2, "r == None\n".as_bytes());
  21. currentBlock = 18;
  22. break;
  23. } else {
  24. //let _ = syscall::write(2, "unwrapping line\n".as_bytes());
  25. p = r.unwrap().unwrap().as_bytes().as_ptr() as *mut u8;
  26. //let _ = syscall::write(2, "line unwrapped successfully\n".as_bytes());
  27. //let _ = syscall::write(2, slice::from_raw_parts(p as *const u8, 1));
  28. }
  29. if *p as i32 == b'#' as i32 {
  30. continue;
  31. }
  32. cp = libc::strpbrk(p as *mut i8, ['#' as i8,'\n' as i8, '\0' as i8].as_ptr()) as *mut u8;
  33.  
  34. if cp == 0 as *mut u8 {
  35. continue;
  36. }
  37. *cp = b'\0';
  38. cp = libc::strpbrk(p as *mut i8, [' ' as i8,'\t' as i8,'\0' as i8].as_ptr()) as *mut u8;
  39. if !(cp == 0 as *mut u8) {
  40. currentBlock = 5;
  41. break;
  42. }
  43. }
  44. if currentBlock == 5 {
  45. //let _ = syscall::write(2, "currentBlock == 5\n".as_bytes());
  46. *{
  47. let _old = cp;
  48. cp = cp.offset(1);
  49. _old
  50. } = b'\0';
  51. let h_addr_list = host_addrs.as_mut_ptr();
  52. *h_addr_list.offset(0) = hostaddr.as_ptr() as *mut libc::c_char;
  53. *(*h_addr_list.offset(0) as *mut usize) =
  54. {
  55. let mut addr = mem::uninitialized();
  56. ::socket::inet_aton(p as *const i8, &mut addr) as usize;
  57. addr.s_addr.as_ptr() as usize
  58. };
  59. let h_length = mem::size_of::<usize> as i32;
  60. let h_addrtype = ::socket::AF_INET;
  61. 'loop6: loop {
  62. // let _ = syscall::write(2, "loop 6\n".as_bytes());
  63. if !*cp as i32 == b' ' as i32 || *cp as i32 == b'\t' as i32 {
  64. break;
  65. }
  66. cp = cp.offset(1);
  67. }
  68. let h_name = cp as *mut i8;
  69. let mut h_aliases: *mut *mut i8 = mem::uninitialized();
  70. q = {
  71. h_aliases = host_aliases.as_mut_ptr() as *mut *mut i8;
  72. h_aliases as *mut *mut u8
  73. };
  74. if cp != 0 as *mut u8{
  75. *{
  76. let _old = cp;
  77. cp = cp.offset(1);
  78. _old
  79. } = b'\0';
  80. }
  81. 'loop9: loop {
  82. // let _ = syscall::write(2, "loop 9\n".as_bytes());
  83. if !(!cp.is_null() && (*cp != 0)) {
  84. break;
  85. }
  86. if *cp as i32 == b' ' as i32 || cp as (i32) == b'\t' as i32 {
  87. cp = cp.offset(1);
  88. } else {
  89. if q < &host_aliases[MAXALIASES - 1 as usize] as *const *const u8 as *mut *mut u8{
  90. *{
  91. let _old = q;
  92. q = q.offset(1);
  93. _old
  94. } = cp;
  95. }
  96. if !(cp != 0 as *mut u8) {
  97. continue;
  98. }
  99. *{
  100. let _old = cp;
  101. cp = cp.offset(1);
  102. _old
  103. } = b'\0';
  104. }
  105. }
  106. *q = 0 as *mut u8;
  107. let _ = syscall::write(2, ::cstr_to_slice(h_name as *const c_char));
  108. let host = hostent {
  109. h_name: h_name as *const c_char,
  110. h_aliases: h_aliases as *const *const c_char,
  111. h_addrtype: h_addrtype,
  112. h_length: h_length,
  113. h_addr_list: h_addr_list as *const *const i8
  114. };
  115. Ok(&host as (*const hostent))
  116. } else {
  117. Err(Error::new(EIO))
  118. }
  119. });
Add Comment
Please, Sign In to add comment