Add hosts and hostname file
This commit is contained in:
		
							parent
							
								
									3e15eb059c
								
							
						
					
					
						commit
						15932a54b6
					
				| @ -6,11 +6,6 @@ targets: | |||||||
|   - target: /bin |   - target: /bin | ||||||
|     copy:  |     copy:  | ||||||
|       - from: ../flink-1.10.1 |       - from: ../flink-1.10.1 | ||||||
|   # copy hosts file |  | ||||||
|   - target: /etc |  | ||||||
|     copy:  |  | ||||||
|       - files:  |  | ||||||
|           - ../hosts |  | ||||||
|   # copy localtime |   # copy localtime | ||||||
|   - target: /etc |   - target: /etc | ||||||
|     copy:  |     copy:  | ||||||
|  | |||||||
| @ -1,4 +0,0 @@ | |||||||
| 127.0.0.1 occlum-node |  | ||||||
| 127.0.0.1 localhost |  | ||||||
| ::1 occlum-node |  | ||||||
| ::1 localhost |  | ||||||
| @ -42,8 +42,9 @@ enclave { | |||||||
|          *      EEXIST - The LibOS has already been initialized. |          *      EEXIST - The LibOS has already been initialized. | ||||||
|          *      EINVAL - The value of an argument are invalid. |          *      EINVAL - The value of an argument are invalid. | ||||||
|          */ |          */ | ||||||
|         public int occlum_ecall_init([in, string] const char* log_level, [in, string] const char* instance_dir, [in, string] const char* resolv_conf_ptr); |  | ||||||
| 
 | 
 | ||||||
|  |         public int occlum_ecall_init([in, string] const char* log_level, [in, string] const char* instance_dir, [in] const struct host_file_buffer* file_buffer); | ||||||
|  |          | ||||||
|         /* |         /* | ||||||
|          * Create a new LibOS process to do the task specified by the given  |          * Create a new LibOS process to do the task specified by the given  | ||||||
|          * arguments. |          * arguments. | ||||||
|  | |||||||
| @ -29,6 +29,13 @@ typedef struct itimerspec{ | |||||||
|     struct _timespec it_value; |     struct _timespec it_value; | ||||||
| } itimerspec_t; | } itimerspec_t; | ||||||
| 
 | 
 | ||||||
|  | // todo: more detailed description
 | ||||||
|  | struct host_file_buffer { | ||||||
|  |     const char* resolv_conf_ptr; | ||||||
|  |     const char* hosts_ptr; | ||||||
|  |     const char* hostname_ptr; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| #define FD_SETSIZE 1024 | #define FD_SETSIZE 1024 | ||||||
| typedef struct { | typedef struct { | ||||||
|     unsigned long fds_bits[FD_SETSIZE / 8 / sizeof(long)]; |     unsigned long fds_bits[FD_SETSIZE / 8 / sizeof(long)]; | ||||||
|  | |||||||
| @ -11,9 +11,9 @@ use crate::process::idle_reap_zombie_children; | |||||||
| use crate::process::{ProcessFilter, SpawnAttr}; | use crate::process::{ProcessFilter, SpawnAttr}; | ||||||
| use crate::signal::SigNum; | use crate::signal::SigNum; | ||||||
| use crate::time::up_time::init; | use crate::time::up_time::init; | ||||||
|  | use crate::util::host_file_util::{host_file_buffer, parse_host_file, write_host_file, HostFile}; | ||||||
| use crate::util::log::LevelFilter; | use crate::util::log::LevelFilter; | ||||||
| use crate::util::mem_util::from_untrusted::*; | use crate::util::mem_util::from_untrusted::*; | ||||||
| use crate::util::resolv_conf_util::{parse_resolv_conf, write_resolv_conf}; |  | ||||||
| use crate::util::sgx::allow_debug as sgx_allow_debug; | use crate::util::sgx::allow_debug as sgx_allow_debug; | ||||||
| use crate::vm::USER_SPACE_VM_MANAGER; | use crate::vm::USER_SPACE_VM_MANAGER; | ||||||
| use sgx_tse::*; | use sgx_tse::*; | ||||||
| @ -27,6 +27,8 @@ lazy_static! { | |||||||
|     pub static ref ENTRY_POINTS: RwLock<Vec<PathBuf>> = |     pub static ref ENTRY_POINTS: RwLock<Vec<PathBuf>> = | ||||||
|         RwLock::new(config::LIBOS_CONFIG.entry_points.clone()); |         RwLock::new(config::LIBOS_CONFIG.entry_points.clone()); | ||||||
|     pub static ref RESOLV_CONF_STR: RwLock<Option<String>> = RwLock::new(None); |     pub static ref RESOLV_CONF_STR: RwLock<Option<String>> = RwLock::new(None); | ||||||
|  |     pub static ref HOSTNAME_STR: RwLock<Option<String>> = RwLock::new(None); | ||||||
|  |     pub static ref HOSTS_STR: RwLock<Option<String>> = RwLock::new(None); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| macro_rules! ecall_errno { | macro_rules! ecall_errno { | ||||||
| @ -40,7 +42,7 @@ macro_rules! ecall_errno { | |||||||
| pub extern "C" fn occlum_ecall_init( | pub extern "C" fn occlum_ecall_init( | ||||||
|     log_level: *const c_char, |     log_level: *const c_char, | ||||||
|     instance_dir: *const c_char, |     instance_dir: *const c_char, | ||||||
|     resolv_conf_ptr: *const c_char, |     file_buffer: *const host_file_buffer, | ||||||
| ) -> i32 { | ) -> i32 { | ||||||
|     if HAS_INIT.load(Ordering::SeqCst) == true { |     if HAS_INIT.load(Ordering::SeqCst) == true { | ||||||
|         return ecall_errno!(EEXIST); |         return ecall_errno!(EEXIST); | ||||||
| @ -95,18 +97,46 @@ pub extern "C" fn occlum_ecall_init( | |||||||
|         unsafe { backtrace::enable_backtrace(&ENCLAVE_PATH, PrintFormat::Short) }; |         unsafe { backtrace::enable_backtrace(&ENCLAVE_PATH, PrintFormat::Short) }; | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|     match parse_resolv_conf(resolv_conf_ptr) { |     // Parse host file
 | ||||||
|  |     let resolv_conf_ptr = unsafe { (*file_buffer).resolv_conf_ptr }; | ||||||
|  |     match parse_host_file(HostFile::RESOLV_CONF, resolv_conf_ptr) { | ||||||
|         Err(e) => { |         Err(e) => { | ||||||
|             error!("failed to parse /etc/resolv.conf: {}", e.backtrace()); |             error!("failed to parse /etc/resolv.conf: {}", e.backtrace()); | ||||||
|         } |         } | ||||||
|         Ok(resolv_conf_str) => { |         Ok(resolv_conf_str) => { | ||||||
|             *RESOLV_CONF_STR.write().unwrap() = Some(resolv_conf_str); |             *RESOLV_CONF_STR.write().unwrap() = Some(resolv_conf_str); | ||||||
|             if let Err(e) = write_resolv_conf() { |             if let Err(e) = write_host_file(HostFile::RESOLV_CONF) { | ||||||
|                 error!("failed to write /etc/resolv.conf: {}", e.backtrace()); |                 error!("failed to write /etc/resolv.conf: {}", e.backtrace()); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     let hostname_ptr = unsafe { (*file_buffer).hostname_ptr }; | ||||||
|  |     match parse_host_file(HostFile::HOSTNAME, hostname_ptr) { | ||||||
|  |         Err(e) => { | ||||||
|  |             error!("failed to parse /etc/hostname: {}", e.backtrace()); | ||||||
|  |         } | ||||||
|  |         Ok(hostname_str) => { | ||||||
|  |             *HOSTNAME_STR.write().unwrap() = Some(hostname_str); | ||||||
|  |             if let Err(e) = write_host_file(HostFile::HOSTNAME) { | ||||||
|  |                 error!("failed to write /etc/hostname: {}", e.backtrace()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     let hosts_ptr = unsafe { (*file_buffer).hosts_ptr }; | ||||||
|  |     match parse_host_file(HostFile::HOSTS, hosts_ptr) { | ||||||
|  |         Err(e) => { | ||||||
|  |             error!("failed to parse /etc/hosts: {}", e.backtrace()); | ||||||
|  |         } | ||||||
|  |         Ok(hosts_str) => { | ||||||
|  |             *HOSTS_STR.write().unwrap() = Some(hosts_str); | ||||||
|  |             if let Err(e) = write_host_file(HostFile::HOSTS) { | ||||||
|  |                 error!("failed to write /etc/hosts: {}", e.backtrace()); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     0 |     0 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,10 +1,9 @@ | |||||||
| use std::path::PathBuf; |  | ||||||
| use std::sync::Once; |  | ||||||
| 
 |  | ||||||
| use config::{parse_key, parse_mac, ConfigMount, ConfigMountFsType, ConfigMountOptions}; | use config::{parse_key, parse_mac, ConfigMount, ConfigMountFsType, ConfigMountOptions}; | ||||||
| use rcore_fs_mountfs::MNode; | use rcore_fs_mountfs::MNode; | ||||||
|  | use std::path::PathBuf; | ||||||
|  | use std::sync::Once; | ||||||
|  | use util::host_file_util::{write_host_file, HostFile}; | ||||||
| use util::mem_util::from_user; | use util::mem_util::from_user; | ||||||
| use util::resolv_conf_util::write_resolv_conf; |  | ||||||
| 
 | 
 | ||||||
| use super::rootfs::{mount_nonroot_fs_according_to, open_root_fs_according_to, umount_nonroot_fs}; | use super::rootfs::{mount_nonroot_fs_according_to, open_root_fs_according_to, umount_nonroot_fs}; | ||||||
| use super::*; | use super::*; | ||||||
| @ -30,10 +29,19 @@ pub fn do_mount_rootfs( | |||||||
|         *rootfs = new_rootfs; |         *rootfs = new_rootfs; | ||||||
|         *ENTRY_POINTS.write().unwrap() = user_config.entry_points.to_owned(); |         *ENTRY_POINTS.write().unwrap() = user_config.entry_points.to_owned(); | ||||||
|     }); |     }); | ||||||
|  | 
 | ||||||
|     // Write resolv.conf file into mounted file system
 |     // Write resolv.conf file into mounted file system
 | ||||||
|     write_resolv_conf()?; |     write_host_file(HostFile::RESOLV_CONF)?; | ||||||
|     *RESOLV_CONF_STR.write().unwrap() = None; |     *RESOLV_CONF_STR.write().unwrap() = None; | ||||||
| 
 | 
 | ||||||
|  |     // Write hostname file into mounted file system
 | ||||||
|  |     write_host_file(HostFile::HOSTNAME)?; | ||||||
|  |     *HOSTNAME_STR.write().unwrap() = None; | ||||||
|  | 
 | ||||||
|  |     // Write hosts file into mounted file system
 | ||||||
|  |     write_host_file(HostFile::HOSTS)?; | ||||||
|  |     *HOSTS_STR.write().unwrap() = None; | ||||||
|  | 
 | ||||||
|     Ok(()) |     Ok(()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,6 +1,7 @@ | |||||||
| use super::*; | use super::*; | ||||||
|  | use crate::fs::{AccessMode, CreationFlags, FileMode, FsView}; | ||||||
| use std::ffi::{CStr, CString}; | use std::ffi::{CStr, CString}; | ||||||
| 
 | use std::str; | ||||||
| /// A sample of `struct utsname`
 | /// A sample of `struct utsname`
 | ||||||
| /// ```
 | /// ```
 | ||||||
| ///   sysname = Linux
 | ///   sysname = Linux
 | ||||||
| @ -25,7 +26,7 @@ pub struct utsname_t { | |||||||
| 
 | 
 | ||||||
| pub fn do_uname(name: &mut utsname_t) -> Result<()> { | pub fn do_uname(name: &mut utsname_t) -> Result<()> { | ||||||
|     copy_from_cstr_to_u8_array(&SYSNAME, &mut name.sysname); |     copy_from_cstr_to_u8_array(&SYSNAME, &mut name.sysname); | ||||||
|     copy_from_cstr_to_u8_array(&NODENAME, &mut name.nodename); |     obtain_nodename(&mut name.nodename); | ||||||
|     copy_from_cstr_to_u8_array(&RELEASE, &mut name.release); |     copy_from_cstr_to_u8_array(&RELEASE, &mut name.release); | ||||||
|     copy_from_cstr_to_u8_array(&VERSION, &mut name.version); |     copy_from_cstr_to_u8_array(&VERSION, &mut name.version); | ||||||
|     copy_from_cstr_to_u8_array(&MACHINE, &mut name.machine); |     copy_from_cstr_to_u8_array(&MACHINE, &mut name.machine); | ||||||
| @ -48,3 +49,32 @@ fn copy_from_cstr_to_u8_array(src: &CStr, dst: &mut [u8]) { | |||||||
|     dst[..len].copy_from_slice(&src[..len]); |     dst[..len].copy_from_slice(&src[..len]); | ||||||
|     dst[len] = 0; |     dst[len] = 0; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | fn obtain_nodename(dst: &mut [u8]) { | ||||||
|  |     const HOSTNAME_PATH: &'static str = "/etc/hostname"; | ||||||
|  | 
 | ||||||
|  |     let fs_view = FsView::new(); | ||||||
|  | 
 | ||||||
|  |     let hostname_file = match fs_view.open_file( | ||||||
|  |         HOSTNAME_PATH, | ||||||
|  |         AccessMode::O_RDONLY as u32, | ||||||
|  |         FileMode::from_bits(0o666).unwrap(), | ||||||
|  |     ) { | ||||||
|  |         Ok(file) => file, | ||||||
|  |         Err(e) => { | ||||||
|  |             // If failed to open hostname file, use "occlum-node" nodename.
 | ||||||
|  |             error!("failed to open /etc/hostname: {}", e.backtrace()); | ||||||
|  |             copy_from_cstr_to_u8_array(&NODENAME, dst); | ||||||
|  |             return; | ||||||
|  |         } | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     let mut nodename: [u8; 65] = [0; 65]; | ||||||
|  |     hostname_file.read(&mut nodename); | ||||||
|  | 
 | ||||||
|  |     // The \n need to be eliminated.
 | ||||||
|  |     let nodename_string = str::from_utf8(&nodename).unwrap().replace("\n", ""); | ||||||
|  |     let len = nodename_string.len(); | ||||||
|  |     dst[..len].copy_from_slice(&nodename_string.into_bytes()); | ||||||
|  |     dst[len] = 0; | ||||||
|  | } | ||||||
|  | |||||||
							
								
								
									
										77
									
								
								src/libos/src/util/host_file_util.rs
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										77
									
								
								src/libos/src/util/host_file_util.rs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | |||||||
|  | use super::*; | ||||||
|  | use crate::fs::{AccessMode, CreationFlags, FileMode, FsView}; | ||||||
|  | use resolv_conf::*; | ||||||
|  | use std::ffi::CStr; | ||||||
|  | use std::str; | ||||||
|  | 
 | ||||||
|  | #[repr(C)] | ||||||
|  | pub struct host_file_buffer { | ||||||
|  |     pub resolv_conf_ptr: *const c_char, | ||||||
|  |     pub hosts_ptr: *const c_char, | ||||||
|  |     pub hostname_ptr: *const c_char, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub enum HostFile { | ||||||
|  |     HOSTS, | ||||||
|  |     HOSTNAME, | ||||||
|  |     RESOLV_CONF, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn write_host_file(host_file: HostFile) -> Result<()> { | ||||||
|  |     let file_path: &str = match host_file { | ||||||
|  |         HostFile::HOSTS => "/etc/hosts", | ||||||
|  |         HostFile::HOSTNAME => "/etc/hostname", | ||||||
|  |         HostFile::RESOLV_CONF => "/etc/resolv.conf", | ||||||
|  |         _ => return_errno!(EINVAL, "Unsupported host file"), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     let fs_view = FsView::new(); | ||||||
|  |     // overwrite host file if existed in Occlum fs
 | ||||||
|  |     let enclave_file = fs_view.open_file( | ||||||
|  |         file_path, | ||||||
|  |         AccessMode::O_RDWR as u32 | CreationFlags::O_CREAT.bits() | CreationFlags::O_TRUNC.bits(), | ||||||
|  |         FileMode::from_bits(0o666).unwrap(), | ||||||
|  |     )?; | ||||||
|  | 
 | ||||||
|  |     let host_file_str = match host_file { | ||||||
|  |         HostFile::HOSTS => HOSTS_STR.read().unwrap(), | ||||||
|  |         HostFile::HOSTNAME => HOSTNAME_STR.read().unwrap(), | ||||||
|  |         HostFile::RESOLV_CONF => RESOLV_CONF_STR.read().unwrap(), | ||||||
|  |         _ => return_errno!(EINVAL, "Unsupported host file"), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     match &*host_file_str { | ||||||
|  |         Some(str) => { | ||||||
|  |             enclave_file.write(str.as_bytes()); | ||||||
|  |         } | ||||||
|  |         None => { | ||||||
|  |             warn!("The host file: {:?} does not exist", file_path); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |     Ok(()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | pub fn parse_host_file(host_file: HostFile, host_file_ptr: *const c_char) -> Result<String> { | ||||||
|  |     // Read host file
 | ||||||
|  |     let host_file_bytes = unsafe { CStr::from_ptr(host_file_ptr).to_bytes() }; | ||||||
|  |     let host_file_str = str::from_utf8(host_file_bytes) | ||||||
|  |         .map_err(|_| errno!(EINVAL, "host file contains non UTF-8 characters"))?; | ||||||
|  | 
 | ||||||
|  |     match host_file { | ||||||
|  |         HostFile::HOSTS => { | ||||||
|  |             // TODO: Parsing hosts
 | ||||||
|  |         } | ||||||
|  |         HostFile::HOSTNAME => { | ||||||
|  |             // TODO: Parsing hostname
 | ||||||
|  |         } | ||||||
|  |         HostFile::RESOLV_CONF => { | ||||||
|  |             // Parse and inspect host file
 | ||||||
|  |             if let Err(_) = resolv_conf::Config::parse(host_file_bytes) { | ||||||
|  |                 return_errno!(EINVAL, "malformated host /etc/resolv.conf"); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         _ => return_errno!(EINVAL, "Unsupported host file"), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     Ok(host_file_str.to_string()) | ||||||
|  | } | ||||||
| @ -1,9 +1,9 @@ | |||||||
| use super::*; | use super::*; | ||||||
| 
 | 
 | ||||||
| pub mod dirty; | pub mod dirty; | ||||||
|  | pub mod host_file_util; | ||||||
| pub mod log; | pub mod log; | ||||||
| pub mod mem_util; | pub mod mem_util; | ||||||
| pub mod mpx_util; | pub mod mpx_util; | ||||||
| pub mod resolv_conf_util; |  | ||||||
| pub mod sgx; | pub mod sgx; | ||||||
| pub mod sync; | pub mod sync; | ||||||
|  | |||||||
| @ -1,37 +0,0 @@ | |||||||
| use super::*; |  | ||||||
| use crate::fs::{AccessMode, CreationFlags, FileMode, FsView}; |  | ||||||
| use resolv_conf::*; |  | ||||||
| use std::ffi::CStr; |  | ||||||
| use std::str; |  | ||||||
| 
 |  | ||||||
| pub fn write_resolv_conf() -> Result<()> { |  | ||||||
|     const RESOLV_CONF_PATH: &'static str = "/etc/resolv.conf"; |  | ||||||
|     let fs_view = FsView::new(); |  | ||||||
|     // overwrite /etc/resolv.conf if existed
 |  | ||||||
|     let resolv_conf_file = fs_view.open_file( |  | ||||||
|         RESOLV_CONF_PATH, |  | ||||||
|         AccessMode::O_RDWR as u32 | CreationFlags::O_CREAT.bits() | CreationFlags::O_TRUNC.bits(), |  | ||||||
|         FileMode::from_bits(0o666).unwrap(), |  | ||||||
|     )?; |  | ||||||
|     let resolv_conf_str = RESOLV_CONF_STR.read().unwrap(); |  | ||||||
|     match &*resolv_conf_str { |  | ||||||
|         Some(str) => { |  | ||||||
|             resolv_conf_file.write(str.as_bytes()); |  | ||||||
|         } |  | ||||||
|         None => {} |  | ||||||
|     } |  | ||||||
|     Ok(()) |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| pub fn parse_resolv_conf(resolv_conf_ptr: *const c_char) -> Result<String> { |  | ||||||
|     // Read resolv.conf file from host
 |  | ||||||
|     let resolv_conf_bytes = unsafe { CStr::from_ptr(resolv_conf_ptr).to_bytes() }; |  | ||||||
|     let resolv_conf_str = str::from_utf8(resolv_conf_bytes) |  | ||||||
|         .map_err(|_| errno!(EINVAL, "/etc/resolv.conf contains non UTF-8 characters"))?; |  | ||||||
| 
 |  | ||||||
|     // Parse and inspect resolv.conf file
 |  | ||||||
|     if let Err(_) = resolv_conf::Config::parse(resolv_conf_bytes) { |  | ||||||
|         return_errno!(EINVAL, "malformated host /etc/resolv.conf"); |  | ||||||
|     } |  | ||||||
|     Ok(resolv_conf_str.to_string()) |  | ||||||
| } |  | ||||||
| @ -93,6 +93,13 @@ struct occlum_pal_create_process_args { | |||||||
|     int *pid; |     int *pid; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  | // todo: more detailed description
 | ||||||
|  | struct host_file_buffer { | ||||||
|  |     const char *resolv_conf_ptr; | ||||||
|  |     const char *hosts_ptr; | ||||||
|  |     const char *hostname_ptr; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
| /*
 | /*
 | ||||||
|  * The struct which consists of arguments needed by occlum_pal_exec |  * The struct which consists of arguments needed by occlum_pal_exec | ||||||
|  */ |  */ | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ | |||||||
| #include "Enclave_u.h" | #include "Enclave_u.h" | ||||||
| #include "pal_enclave.h" | #include "pal_enclave.h" | ||||||
| #include "pal_error.h" | #include "pal_error.h" | ||||||
| #include "pal_load_resolv_conf.h" | #include "pal_load_file.h" | ||||||
| #include "pal_interrupt_thread.h" | #include "pal_interrupt_thread.h" | ||||||
| #include "pal_log.h" | #include "pal_log.h" | ||||||
| #include "pal_sig_handler.h" | #include "pal_sig_handler.h" | ||||||
| @ -107,11 +107,24 @@ int occlum_pal_init(const struct occlum_pal_attr *attr) { | |||||||
|     eid = pal_get_enclave_id(); |     eid = pal_get_enclave_id(); | ||||||
| 
 | 
 | ||||||
|     int ecall_ret = 0; |     int ecall_ret = 0; | ||||||
|     const char *resolv_conf_ptr = pal_load_resolv_conf(); |     struct host_file_buffer file_buffer = { | ||||||
|  |         .hostname_ptr = pal_load_file("/etc/hostname"), | ||||||
|  |         .hosts_ptr = pal_load_file("/etc/hosts"), | ||||||
|  |         .resolv_conf_ptr = pal_load_file("/etc/resolv.conf"), | ||||||
|  |     }; | ||||||
|  | 
 | ||||||
|  |     const struct host_file_buffer *file_buffer_ptr = &file_buffer; | ||||||
|  | 
 | ||||||
|     sgx_status_t ecall_status = occlum_ecall_init(eid, &ecall_ret, attr->log_level, |     sgx_status_t ecall_status = occlum_ecall_init(eid, &ecall_ret, attr->log_level, | ||||||
|                                 resolved_path, resolv_conf_ptr); |                                 resolved_path, file_buffer_ptr); | ||||||
|     free((void *)resolv_conf_ptr); | 
 | ||||||
|     resolv_conf_ptr = NULL; |     free((void *)file_buffer.hostname_ptr); | ||||||
|  |     file_buffer.hostname_ptr = NULL; | ||||||
|  |     free((void *)file_buffer.hosts_ptr); | ||||||
|  |     file_buffer.hosts_ptr = NULL; | ||||||
|  |     free((void *)file_buffer.resolv_conf_ptr); | ||||||
|  |     file_buffer.resolv_conf_ptr = NULL; | ||||||
|  | 
 | ||||||
|     if (ecall_status != SGX_SUCCESS) { |     if (ecall_status != SGX_SUCCESS) { | ||||||
|         const char *sgx_err = pal_get_sgx_error_msg(ecall_status); |         const char *sgx_err = pal_get_sgx_error_msg(ecall_status); | ||||||
|         PAL_ERROR("Failed to do ECall with error code 0x%x: %s", ecall_status, sgx_err); |         PAL_ERROR("Failed to do ECall with error code 0x%x: %s", ecall_status, sgx_err); | ||||||
|  | |||||||
							
								
								
									
										24
									
								
								src/pal/src/pal_load_file.c
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										24
									
								
								src/pal/src/pal_load_file.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | |||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include "pal_log.h" | ||||||
|  | 
 | ||||||
|  | char *pal_load_file(const char *filename) { | ||||||
|  |     FILE *fp = fopen(filename, "rb"); | ||||||
|  | 
 | ||||||
|  |     if (fp == NULL) { | ||||||
|  |         PAL_WARN("Warning: Failed to open file: %s", filename); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  |     fseek(fp, 0, SEEK_END); | ||||||
|  |     long fsize = ftell(fp); | ||||||
|  |     fseek(fp, 0, SEEK_SET); | ||||||
|  |     char *file_buffer = malloc(fsize + 1); | ||||||
|  |     if (file_buffer == NULL) { | ||||||
|  |         PAL_WARN("Warning: Failed to malloc buffer for file: %s", filename); | ||||||
|  |         return NULL; | ||||||
|  |     } | ||||||
|  |     fread(file_buffer, 1, fsize, fp); | ||||||
|  |     file_buffer[fsize] = 0; | ||||||
|  |     fclose(fp); | ||||||
|  |     return file_buffer; | ||||||
|  | } | ||||||
							
								
								
									
										6
									
								
								src/pal/src/pal_load_file.h
									
									
									
									
									
										Normal file
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										6
									
								
								src/pal/src/pal_load_file.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,6 @@ | |||||||
|  | #ifndef __PAL_LOAD_FILE_H__ | ||||||
|  | #define __PAL_LOAD_FILE_H__ | ||||||
|  | 
 | ||||||
|  | char *pal_load_file(const char *filename); | ||||||
|  | 
 | ||||||
|  | #endif /* __PAL_LOAD_FILE_H__ */ | ||||||
| @ -1,24 +0,0 @@ | |||||||
| #include <stdio.h> |  | ||||||
| #include <stdlib.h> |  | ||||||
| #include "pal_log.h" |  | ||||||
| 
 |  | ||||||
| char *pal_load_resolv_conf(void) { |  | ||||||
|     FILE *fp = fopen("/etc/resolv.conf", "rb"); |  | ||||||
| 
 |  | ||||||
|     if (fp == NULL) { |  | ||||||
|         PAL_WARN("Warning: Failed to open /etc/resolv.conf file"); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
|     fseek(fp, 0, SEEK_END); |  | ||||||
|     long fsize = ftell(fp); |  | ||||||
|     fseek(fp, 0, SEEK_SET); |  | ||||||
|     char *resolv_conf_buffer = malloc(fsize + 1); |  | ||||||
|     if (resolv_conf_buffer == NULL) { |  | ||||||
|         PAL_WARN("Warning: Failed to malloc for /etc/resolv.conf buffer"); |  | ||||||
|         return NULL; |  | ||||||
|     } |  | ||||||
|     fread(resolv_conf_buffer, 1, fsize, fp); |  | ||||||
|     resolv_conf_buffer[fsize] = 0; |  | ||||||
|     fclose(fp); |  | ||||||
|     return resolv_conf_buffer; |  | ||||||
| } |  | ||||||
| @ -1,6 +0,0 @@ | |||||||
| #ifndef __PAL_LOAD_RESOLV_CONF_H__ |  | ||||||
| #define __PAL_LOAD_RESOLV_CONF_H__ |  | ||||||
| 
 |  | ||||||
| char *pal_load_resolv_conf(void); |  | ||||||
| 
 |  | ||||||
| #endif /* __PAL_LOAD_RESOLV_CONF_H__ */ |  | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user