1// Copyright 2025 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
45use crate::bindings;
6use std::ffi::{CStr, CString};
7use zx::{AsHandleRef, Status};
89pub fn find_restricted_symbols(vmo: &zx::Vmo, driver_url: &str) -> Result<Vec<String>, Status> {
10let mut out_symbols: *mut bindings::restricted_symbols = std::ptr::null_mut();
11let mut out_symbols_size: usize = 0;
12let driver_url_c_str = CString::new(driver_url).unwrap();
13// SAFETY: We only look at the out symbols if the status is ok.
14Status::ok(unsafe {
15 bindings::restricted_symbols_find(
16 vmo.raw_handle(),
17 driver_url_c_str.as_ptr(),
18&mut out_symbols,
19&mut out_symbols_size,
20 )
21 })?;
2223let mut symbols = Vec::with_capacity(out_symbols_size);
24for i in 0..out_symbols_size {
25// SAFETY: We can retreieve valid strings for all indicies up until out_symbols_size.
26let symbol = unsafe { CStr::from_ptr(bindings::restricted_symbols_get(out_symbols, i)) };
27 symbols.push(symbol.to_str().unwrap().to_string());
28 }
2930// SAFETY: We can free a pointer retrieved via the find API.
31unsafe {
32 bindings::restricted_symbols_free(out_symbols);
33 }
3435Ok(symbols)
36}