feat(unstable): add Deno.getUid (#13496)

This commit is contained in:
Yoshiya Hinosawa 2022-01-31 14:44:19 +09:00 committed by GitHub
parent 245f69256b
commit 49a0db0d2a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 57 additions and 6 deletions

View File

@ -133,6 +133,18 @@ declare namespace Deno {
*/
export function networkInterfaces(): NetworkInterfaceInfo[];
/** **Unstable** new API. yet to be vetted.
*
* Returns the user id of the process on POSIX platforms. Returns null on windows.
*
* ```ts
* console.log(Deno.getUid());
* ```
*
* Requires `allow-env` permission.
*/
export function getUid(): number | null;
/** All possible types for interfacing with foreign functions */
export type NativeType =
| "void"

View File

@ -202,3 +202,13 @@ Deno.test({ permissions: { env: true } }, function systemMemoryInfo() {
assert(info.swapTotal >= 0);
assert(info.swapFree >= 0);
});
Deno.test({ permissions: { env: true } }, function getUid() {
if (Deno.build.os === "windows") {
assertEquals(Deno.getUid(), null);
} else {
const uid = Deno.getUid();
assert(typeof uid === "number");
assert(uid > 0);
}
});

View File

@ -28,6 +28,10 @@
return core.opSync("op_network_interfaces");
}
function getUid() {
return core.opSync("op_getuid");
}
// This is an internal only method used by the test harness to override the
// behavior of exit when the exit sanitizer is enabled.
let exitHandler = null;
@ -87,12 +91,13 @@
window.__bootstrap.os = {
env,
execPath,
setExitHandler,
exit,
osRelease,
systemMemoryInfo,
getUid,
hostname,
loadavg,
networkInterfaces,
osRelease,
setExitHandler,
systemMemoryInfo,
};
})(this);

View File

@ -122,6 +122,7 @@
osRelease: __bootstrap.os.osRelease,
systemMemoryInfo: __bootstrap.os.systemMemoryInfo,
networkInterfaces: __bootstrap.os.networkInterfaces,
getUid: __bootstrap.os.getUid,
applySourceMap: __bootstrap.errorStack.opApplySourceMap,
formatDiagnostics: __bootstrap.errorStack.opFormatDiagnostics,
sleepSync: __bootstrap.timers.sleepSync,

View File

@ -17,16 +17,17 @@ use std::sync::Arc;
pub fn init(maybe_exit_code: Option<Arc<AtomicI32>>) -> Extension {
Extension::builder()
.ops(vec![
("op_exit", op_sync(op_exit)),
("op_env", op_sync(op_env)),
("op_exec_path", op_sync(op_exec_path)),
("op_set_env", op_sync(op_set_env)),
("op_get_env", op_sync(op_get_env)),
("op_exit", op_sync(op_exit)),
("op_delete_env", op_sync(op_delete_env)),
("op_get_env", op_sync(op_get_env)),
("op_getuid", op_sync(op_getuid)),
("op_hostname", op_sync(op_hostname)),
("op_loadavg", op_sync(op_loadavg)),
("op_network_interfaces", op_sync(op_network_interfaces)),
("op_os_release", op_sync(op_os_release)),
("op_set_env", op_sync(op_set_env)),
("op_set_exit_code", op_sync(op_set_exit_code)),
("op_system_memory_info", op_sync(op_system_memory_info)),
])
@ -237,3 +238,25 @@ fn op_system_memory_info(
Err(_) => Ok(None),
}
}
#[cfg(not(windows))]
fn op_getuid(
state: &mut OpState,
_: (),
_: (),
) -> Result<Option<u32>, AnyError> {
super::check_unstable(state, "Deno.getUid");
state.borrow_mut::<Permissions>().env.check_all()?;
unsafe { Ok(Some(libc::getuid())) }
}
#[cfg(windows)]
fn op_getuid(
state: &mut OpState,
_: (),
_: (),
) -> Result<Option<u32>, AnyError> {
super::check_unstable(state, "Deno.getUid");
state.borrow_mut::<Permissions>().env.check_all()?;
Ok(None)
}