Node updated. Some todos.
This commit is contained in:
13
Scripts/node_modules/bare-os/CMakeLists.txt
generated
vendored
Normal file
13
Scripts/node_modules/bare-os/CMakeLists.txt
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
||||
cmake_minimum_required(VERSION 3.25)
|
||||
|
||||
project(bare_os C)
|
||||
|
||||
include(bare)
|
||||
|
||||
add_bare_module(bare_os)
|
||||
|
||||
target_sources(
|
||||
${bare_os}
|
||||
PRIVATE
|
||||
binding.c
|
||||
)
|
||||
201
Scripts/node_modules/bare-os/LICENSE
generated
vendored
Normal file
201
Scripts/node_modules/bare-os/LICENSE
generated
vendored
Normal file
@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
11
Scripts/node_modules/bare-os/README.md
generated
vendored
Normal file
11
Scripts/node_modules/bare-os/README.md
generated
vendored
Normal file
@ -0,0 +1,11 @@
|
||||
# bare-os
|
||||
|
||||
Operating system utilities for Javascript.
|
||||
|
||||
```
|
||||
npm i bare-os
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
Apache-2.0
|
||||
788
Scripts/node_modules/bare-os/binding.c
generated
vendored
Normal file
788
Scripts/node_modules/bare-os/binding.c
generated
vendored
Normal file
@ -0,0 +1,788 @@
|
||||
#include <assert.h>
|
||||
#include <bare.h>
|
||||
#include <js.h>
|
||||
#include <stdlib.h>
|
||||
#include <utf.h>
|
||||
#include <uv.h>
|
||||
|
||||
static uv_rwlock_t bare_os_env_lock;
|
||||
|
||||
static uv_once_t bare_os_env_lock_guard = UV_ONCE_INIT;
|
||||
|
||||
static void
|
||||
bare_os__on_env_lock_init (void) {
|
||||
int err = uv_rwlock_init(&bare_os_env_lock);
|
||||
assert(err == 0);
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_type (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
uv_utsname_t buffer;
|
||||
err = uv_os_uname(&buffer);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) buffer.sysname, -1, &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_version (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
uv_utsname_t buffer;
|
||||
err = uv_os_uname(&buffer);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) buffer.version, -1, &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_release (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
uv_utsname_t buffer;
|
||||
err = uv_os_uname(&buffer);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) buffer.release, -1, &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_machine (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
uv_utsname_t buffer;
|
||||
err = uv_os_uname(&buffer);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) buffer.machine, -1, &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_exec_path (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t len = 4096;
|
||||
char exec_path[4096];
|
||||
|
||||
err = uv_exepath(exec_path, &len);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) exec_path, len, &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_pid (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_uint32(env, uv_os_getpid(), &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_ppid (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_uint32(env, uv_os_getppid(), &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_cwd (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t len = 4096;
|
||||
char cwd[4096];
|
||||
|
||||
err = uv_cwd(cwd, &len);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) cwd, len, &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_chdir (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t argc = 1;
|
||||
js_value_t *argv[1];
|
||||
|
||||
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
||||
assert(err == 0);
|
||||
|
||||
assert(argc == 1);
|
||||
|
||||
utf8_t dir[4096];
|
||||
err = js_get_value_string_utf8(env, argv[0], dir, 4096, NULL);
|
||||
assert(err == 0);
|
||||
|
||||
err = uv_chdir((char *) dir);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_tmpdir (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t len = 4096;
|
||||
char tmpdir[4096];
|
||||
|
||||
err = uv_os_tmpdir(tmpdir, &len);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) tmpdir, len, &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_homedir (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t len = 4096;
|
||||
char homedir[4096];
|
||||
|
||||
err = uv_os_homedir(homedir, &len);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) homedir, len, &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_hostname (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t len = UV_MAXHOSTNAMESIZE;
|
||||
char hostname[UV_MAXHOSTNAMESIZE];
|
||||
|
||||
err = uv_os_gethostname(hostname, &len);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) hostname, len, &result);
|
||||
if (err < 0) return NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_kill (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t argc = 2;
|
||||
js_value_t *argv[2];
|
||||
|
||||
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
||||
assert(err == 0);
|
||||
|
||||
assert(argc == 2);
|
||||
|
||||
uint32_t pid;
|
||||
err = js_get_value_uint32(env, argv[0], &pid);
|
||||
assert(err == 0);
|
||||
|
||||
uint32_t signum;
|
||||
err = js_get_value_uint32(env, argv[1], &signum);
|
||||
assert(err == 0);
|
||||
|
||||
err = uv_kill(pid, signum);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_resource_usage (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
uv_rusage_t usage;
|
||||
err = uv_getrusage(&usage);
|
||||
assert(err == 0);
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_object(env, &result);
|
||||
assert(err == 0);
|
||||
|
||||
#define V(name, property) \
|
||||
{ \
|
||||
uv_timeval_t time = usage.ru_##property; \
|
||||
\
|
||||
js_value_t *value; \
|
||||
err = js_create_int64(env, time.tv_sec * 1e6 + time.tv_usec, &value); \
|
||||
assert(err == 0); \
|
||||
\
|
||||
err = js_set_named_property(env, result, name, value); \
|
||||
assert(err == 0); \
|
||||
}
|
||||
|
||||
V("userCPUTime", utime)
|
||||
V("systemCPUTime", stime)
|
||||
#undef V
|
||||
|
||||
#define V(name, property) \
|
||||
{ \
|
||||
js_value_t *value; \
|
||||
err = js_create_int64(env, usage.ru_##property, &value); \
|
||||
assert(err == 0); \
|
||||
\
|
||||
err = js_set_named_property(env, result, name, value); \
|
||||
assert(err == 0); \
|
||||
}
|
||||
|
||||
V("maxRSS", maxrss)
|
||||
V("sharedMemorySize", ixrss)
|
||||
V("unsharedDataSize", idrss)
|
||||
V("unsharedStackSize", isrss)
|
||||
V("minorPageFault", minflt)
|
||||
V("majorPageFault", majflt)
|
||||
V("swappedOut", nswap)
|
||||
V("fsRead", inblock)
|
||||
V("fsWrite", oublock)
|
||||
V("ipcSent", msgsnd)
|
||||
V("ipcReceived", msgrcv)
|
||||
V("signalsCount", nsignals)
|
||||
V("voluntaryContextSwitches", nvcsw)
|
||||
V("involuntaryContextSwitches", nivcsw)
|
||||
#undef V
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_get_process_title (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
char title[256];
|
||||
err = uv_get_process_title(title, 256);
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_string_utf8(env, (utf8_t *) title, -1, &result);
|
||||
assert(err == 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_set_process_title (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t argc = 1;
|
||||
js_value_t *argv[1];
|
||||
|
||||
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
||||
assert(err == 0);
|
||||
|
||||
assert(argc == 1);
|
||||
|
||||
utf8_t data[256];
|
||||
err = js_get_value_string_utf8(env, argv[0], data, 256, NULL);
|
||||
assert(err == 0);
|
||||
|
||||
err = uv_set_process_title((char *) data);
|
||||
assert(err == 0);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_get_env_keys (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
uv_env_item_t *items;
|
||||
int len;
|
||||
|
||||
uv_rwlock_rdlock(&bare_os_env_lock);
|
||||
|
||||
err = uv_os_environ(&items, &len);
|
||||
|
||||
uv_rwlock_rdunlock(&bare_os_env_lock);
|
||||
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
js_value_t *result;
|
||||
err = js_create_array_with_length(env, len, &result);
|
||||
assert(err == 0);
|
||||
|
||||
for (int i = 0; i < len; i++) {
|
||||
uv_env_item_t *item = &items[i];
|
||||
|
||||
js_value_t *val;
|
||||
err = js_create_string_utf8(env, (utf8_t *) item->name, -1, &val);
|
||||
assert(err == 0);
|
||||
|
||||
err = js_set_element(env, result, i, val);
|
||||
assert(err == 0);
|
||||
}
|
||||
|
||||
uv_os_free_environ(items, len);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_get_env (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t argc = 1;
|
||||
js_value_t *argv[1];
|
||||
|
||||
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
||||
assert(err == 0);
|
||||
|
||||
assert(argc == 1);
|
||||
|
||||
size_t name_len;
|
||||
err = js_get_value_string_utf8(env, argv[0], NULL, 0, &name_len);
|
||||
assert(err == 0);
|
||||
|
||||
name_len += 1 /* NULL */;
|
||||
|
||||
utf8_t *name = malloc(name_len);
|
||||
err = js_get_value_string_utf8(env, argv[0], name, name_len, &name_len);
|
||||
assert(err == 0);
|
||||
|
||||
uv_rwlock_rdlock(&bare_os_env_lock);
|
||||
|
||||
size_t value_len = 256;
|
||||
char *value = malloc(value_len);
|
||||
err = uv_os_getenv((char *) name, value, &value_len);
|
||||
|
||||
js_value_t *result;
|
||||
|
||||
if (err == UV_ENOENT) {
|
||||
err = js_get_undefined(env, &result);
|
||||
assert(err == 0);
|
||||
} else {
|
||||
if (err == UV_ENOBUFS) {
|
||||
value = realloc(value, value_len);
|
||||
|
||||
err = uv_os_getenv((char *) name, value, &value_len);
|
||||
assert(err == 0);
|
||||
} else if (err < 0) {
|
||||
uv_rwlock_rdunlock(&bare_os_env_lock);
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
free(name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
err = js_create_string_utf8(env, (utf8_t *) value, value_len, &result);
|
||||
assert(err == 0);
|
||||
}
|
||||
|
||||
uv_rwlock_rdunlock(&bare_os_env_lock);
|
||||
|
||||
free(name);
|
||||
free(value);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_has_env (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t argc = 1;
|
||||
js_value_t *argv[1];
|
||||
|
||||
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
||||
assert(err == 0);
|
||||
|
||||
assert(argc == 1);
|
||||
|
||||
size_t name_len;
|
||||
err = js_get_value_string_utf8(env, argv[0], NULL, 0, &name_len);
|
||||
assert(err == 0);
|
||||
|
||||
utf8_t *name = malloc(++name_len);
|
||||
err = js_get_value_string_utf8(env, argv[0], name, name_len, &name_len);
|
||||
assert(err == 0);
|
||||
|
||||
uv_rwlock_rdlock(&bare_os_env_lock);
|
||||
|
||||
size_t value_len = 1;
|
||||
char value[1];
|
||||
err = uv_os_getenv((char *) name, value, &value_len);
|
||||
|
||||
uv_rwlock_rdunlock(&bare_os_env_lock);
|
||||
|
||||
if (err != 0 && err != UV_ENOENT && err != UV_ENOBUFS) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
free(name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
free(name);
|
||||
|
||||
js_value_t *result;
|
||||
err = js_get_boolean(env, err != UV_ENOENT, &result);
|
||||
assert(err == 0);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_set_env (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t argc = 2;
|
||||
js_value_t *argv[2];
|
||||
|
||||
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
||||
assert(err == 0);
|
||||
|
||||
assert(argc == 2);
|
||||
|
||||
size_t name_len;
|
||||
err = js_get_value_string_utf8(env, argv[0], NULL, 0, &name_len);
|
||||
assert(err == 0);
|
||||
|
||||
utf8_t *name = malloc(++name_len);
|
||||
err = js_get_value_string_utf8(env, argv[0], name, name_len, &name_len);
|
||||
assert(err == 0);
|
||||
|
||||
size_t value_len;
|
||||
err = js_get_value_string_utf8(env, argv[1], NULL, 0, &value_len);
|
||||
assert(err == 0);
|
||||
|
||||
utf8_t *value = malloc(++value_len);
|
||||
err = js_get_value_string_utf8(env, argv[1], value, value_len, &value_len);
|
||||
assert(err == 0);
|
||||
|
||||
uv_rwlock_wrlock(&bare_os_env_lock);
|
||||
|
||||
err = uv_os_setenv((char *) name, (char *) value);
|
||||
|
||||
uv_rwlock_wrunlock(&bare_os_env_lock);
|
||||
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
free(name);
|
||||
free(value);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
free(name);
|
||||
free(value);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_unset_env (js_env_t *env, js_callback_info_t *info) {
|
||||
int err;
|
||||
|
||||
size_t argc = 1;
|
||||
js_value_t *argv[1];
|
||||
|
||||
err = js_get_callback_info(env, info, &argc, argv, NULL, NULL);
|
||||
assert(err == 0);
|
||||
|
||||
assert(argc == 1);
|
||||
|
||||
size_t name_len;
|
||||
err = js_get_value_string_utf8(env, argv[0], NULL, 0, &name_len);
|
||||
assert(err == 0);
|
||||
|
||||
utf8_t *name = malloc(++name_len);
|
||||
err = js_get_value_string_utf8(env, argv[0], name, name_len, &name_len);
|
||||
assert(err == 0);
|
||||
|
||||
uv_rwlock_wrlock(&bare_os_env_lock);
|
||||
|
||||
err = uv_os_unsetenv((char *) name);
|
||||
|
||||
uv_rwlock_wrunlock(&bare_os_env_lock);
|
||||
|
||||
if (err < 0) {
|
||||
js_throw_error(env, uv_err_name(err), uv_strerror(err));
|
||||
free(name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
free(name);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static js_value_t *
|
||||
bare_os_exports (js_env_t *env, js_value_t *exports) {
|
||||
uv_once(&bare_os_env_lock_guard, bare_os__on_env_lock_init);
|
||||
|
||||
int err;
|
||||
|
||||
#define V(name, str) \
|
||||
{ \
|
||||
js_value_t *val; \
|
||||
err = js_create_string_utf8(env, (utf8_t *) str, -1, &val); \
|
||||
assert(err == 0); \
|
||||
err = js_set_named_property(env, exports, name, val); \
|
||||
assert(err == 0); \
|
||||
}
|
||||
|
||||
V("platform", BARE_PLATFORM)
|
||||
V("arch", BARE_ARCH)
|
||||
#undef V
|
||||
|
||||
#define V(name, fn) \
|
||||
{ \
|
||||
js_value_t *val; \
|
||||
err = js_create_function(env, name, -1, fn, NULL, &val); \
|
||||
assert(err == 0); \
|
||||
err = js_set_named_property(env, exports, name, val); \
|
||||
assert(err == 0); \
|
||||
}
|
||||
|
||||
V("type", bare_os_type)
|
||||
V("version", bare_os_version)
|
||||
V("release", bare_os_release)
|
||||
V("machine", bare_os_machine)
|
||||
V("execPath", bare_os_exec_path)
|
||||
V("pid", bare_os_pid)
|
||||
V("ppid", bare_os_ppid)
|
||||
V("cwd", bare_os_cwd)
|
||||
V("chdir", bare_os_chdir)
|
||||
V("tmpdir", bare_os_tmpdir)
|
||||
V("homedir", bare_os_homedir)
|
||||
V("hostname", bare_os_hostname)
|
||||
V("kill", bare_os_kill)
|
||||
V("resourceUsage", bare_os_resource_usage)
|
||||
V("getProcessTitle", bare_os_get_process_title)
|
||||
V("setProcessTitle", bare_os_set_process_title)
|
||||
V("getEnvKeys", bare_os_get_env_keys)
|
||||
V("getEnv", bare_os_get_env)
|
||||
V("hasEnv", bare_os_get_env)
|
||||
V("setEnv", bare_os_set_env)
|
||||
V("unsetEnv", bare_os_unset_env)
|
||||
#undef V
|
||||
|
||||
js_value_t *signals;
|
||||
err = js_create_object(env, &signals);
|
||||
assert(err == 0);
|
||||
|
||||
err = js_set_named_property(env, exports, "signals", signals);
|
||||
assert(err == 0);
|
||||
|
||||
#define V(name) \
|
||||
{ \
|
||||
js_value_t *val; \
|
||||
err = js_create_uint32(env, name, &val); \
|
||||
assert(err == 0); \
|
||||
err = js_set_named_property(env, signals, #name, val); \
|
||||
assert(err == 0); \
|
||||
}
|
||||
|
||||
#ifdef SIGHUP
|
||||
V(SIGHUP);
|
||||
#endif
|
||||
#ifdef SIGINT
|
||||
V(SIGINT);
|
||||
#endif
|
||||
#ifdef SIGQUIT
|
||||
V(SIGQUIT);
|
||||
#endif
|
||||
#ifdef SIGILL
|
||||
V(SIGILL);
|
||||
#endif
|
||||
#ifdef SIGTRAP
|
||||
V(SIGTRAP);
|
||||
#endif
|
||||
#ifdef SIGABRT
|
||||
V(SIGABRT);
|
||||
#endif
|
||||
#ifdef SIGIOT
|
||||
V(SIGIOT);
|
||||
#endif
|
||||
#ifdef SIGBUS
|
||||
V(SIGBUS);
|
||||
#endif
|
||||
#ifdef SIGFPE
|
||||
V(SIGFPE);
|
||||
#endif
|
||||
#ifdef SIGKILL
|
||||
V(SIGKILL);
|
||||
#endif
|
||||
#ifdef SIGUSR1
|
||||
V(SIGUSR1);
|
||||
#endif
|
||||
#ifdef SIGSEGV
|
||||
V(SIGSEGV);
|
||||
#endif
|
||||
#ifdef SIGUSR2
|
||||
V(SIGUSR2);
|
||||
#endif
|
||||
#ifdef SIGPIPE
|
||||
V(SIGPIPE);
|
||||
#endif
|
||||
#ifdef SIGALRM
|
||||
V(SIGALRM);
|
||||
#endif
|
||||
#ifdef SIGTERM
|
||||
V(SIGTERM);
|
||||
#endif
|
||||
#ifdef SIGCHLD
|
||||
V(SIGCHLD);
|
||||
#endif
|
||||
#ifdef SIGSTKFLT
|
||||
V(SIGSTKFLT);
|
||||
#endif
|
||||
#ifdef SIGCONT
|
||||
V(SIGCONT);
|
||||
#endif
|
||||
#ifdef SIGSTOP
|
||||
V(SIGSTOP);
|
||||
#endif
|
||||
#ifdef SIGTSTP
|
||||
V(SIGTSTP);
|
||||
#endif
|
||||
#ifdef SIGBREAK
|
||||
V(SIGBREAK);
|
||||
#endif
|
||||
#ifdef SIGTTIN
|
||||
V(SIGTTIN);
|
||||
#endif
|
||||
#ifdef SIGTTOU
|
||||
V(SIGTTOU);
|
||||
#endif
|
||||
#ifdef SIGURG
|
||||
V(SIGURG);
|
||||
#endif
|
||||
#ifdef SIGXCPU
|
||||
V(SIGXCPU);
|
||||
#endif
|
||||
#ifdef SIGXFSZ
|
||||
V(SIGXFSZ);
|
||||
#endif
|
||||
#ifdef SIGVTALRM
|
||||
V(SIGVTALRM);
|
||||
#endif
|
||||
#ifdef SIGPROF
|
||||
V(SIGPROF);
|
||||
#endif
|
||||
#ifdef SIGWINCH
|
||||
V(SIGWINCH);
|
||||
#endif
|
||||
#ifdef SIGIO
|
||||
V(SIGIO);
|
||||
#endif
|
||||
#ifdef SIGPOLL
|
||||
V(SIGPOLL);
|
||||
#endif
|
||||
#ifdef SIGLOST
|
||||
V(SIGLOST);
|
||||
#endif
|
||||
#ifdef SIGPWR
|
||||
V(SIGPWR);
|
||||
#endif
|
||||
#ifdef SIGINFO
|
||||
V(SIGINFO);
|
||||
#endif
|
||||
#ifdef SIGSYS
|
||||
V(SIGSYS);
|
||||
#endif
|
||||
#ifdef SIGUNUSED
|
||||
V(SIGUNUSED);
|
||||
#endif
|
||||
#undef V
|
||||
|
||||
js_value_t *errnos;
|
||||
err = js_create_object(env, &errnos);
|
||||
assert(err == 0);
|
||||
|
||||
err = js_set_named_property(env, exports, "errnos", errnos);
|
||||
assert(err == 0);
|
||||
|
||||
#define V(name, msg) \
|
||||
{ \
|
||||
js_value_t *val; \
|
||||
err = js_create_int32(env, UV_##name, &val); \
|
||||
assert(err == 0); \
|
||||
err = js_set_named_property(env, errnos, #name, val); \
|
||||
assert(err == 0); \
|
||||
}
|
||||
|
||||
UV_ERRNO_MAP(V);
|
||||
#undef V
|
||||
|
||||
return exports;
|
||||
}
|
||||
|
||||
BARE_MODULE(bare_os, bare_os_exports)
|
||||
1
Scripts/node_modules/bare-os/binding.js
generated
vendored
Normal file
1
Scripts/node_modules/bare-os/binding.js
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
module.exports = require.addon()
|
||||
59
Scripts/node_modules/bare-os/index.js
generated
vendored
Normal file
59
Scripts/node_modules/bare-os/index.js
generated
vendored
Normal file
@ -0,0 +1,59 @@
|
||||
const binding = require('./binding')
|
||||
const errors = require('./lib/errors')
|
||||
const constants = require('./lib/constants')
|
||||
|
||||
exports.constants = constants
|
||||
|
||||
exports.EOL = binding.platform === 'win32' ? '\r\n' : '\n'
|
||||
|
||||
exports.platform = function platform () {
|
||||
return binding.platform
|
||||
}
|
||||
|
||||
exports.arch = function arch () {
|
||||
return binding.arch
|
||||
}
|
||||
|
||||
exports.type = binding.type
|
||||
exports.version = binding.version
|
||||
exports.release = binding.release
|
||||
exports.machine = binding.machine
|
||||
exports.execPath = binding.execPath
|
||||
exports.pid = binding.pid
|
||||
exports.ppid = binding.ppid
|
||||
exports.cwd = binding.cwd
|
||||
exports.chdir = binding.chdir
|
||||
exports.tmpdir = binding.tmpdir
|
||||
exports.homedir = binding.homedir
|
||||
exports.hostname = binding.hostname
|
||||
|
||||
exports.kill = function kill (pid, signal = constants.signals.SIGTERM) {
|
||||
if (typeof signal === 'string') {
|
||||
if (signal in constants.signals === false) {
|
||||
throw errors.UNKNOWN_SIGNAL('Unknown signal: ' + signal)
|
||||
}
|
||||
|
||||
signal = constants.signals[signal]
|
||||
}
|
||||
|
||||
binding.kill(pid, signal)
|
||||
}
|
||||
|
||||
exports.resourceUsage = binding.resourceUsage
|
||||
exports.getProcessTitle = binding.getProcessTitle
|
||||
|
||||
exports.setProcessTitle = function setProcessTitle (title) {
|
||||
if (typeof title !== 'string') title = title.toString()
|
||||
|
||||
if (title.length >= 256) {
|
||||
throw errors.TITLE_OVERFLOW('Process title is too long')
|
||||
}
|
||||
|
||||
binding.setProcessTitle(title)
|
||||
}
|
||||
|
||||
exports.getEnvKeys = binding.getEnvKeys
|
||||
exports.getEnv = binding.getEnv
|
||||
exports.hasEnv = binding.hasEnv
|
||||
exports.setEnv = binding.setEnv
|
||||
exports.unsetEnv = binding.unsetEnv
|
||||
6
Scripts/node_modules/bare-os/lib/constants.js
generated
vendored
Normal file
6
Scripts/node_modules/bare-os/lib/constants.js
generated
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
const binding = require('../binding')
|
||||
|
||||
module.exports = {
|
||||
signals: binding.signals,
|
||||
errnos: binding.errnos
|
||||
}
|
||||
22
Scripts/node_modules/bare-os/lib/errors.js
generated
vendored
Normal file
22
Scripts/node_modules/bare-os/lib/errors.js
generated
vendored
Normal file
@ -0,0 +1,22 @@
|
||||
module.exports = class OSError extends Error {
|
||||
constructor (msg, code, fn = OSError) {
|
||||
super(`${code}: ${msg}`)
|
||||
this.code = code
|
||||
|
||||
if (Error.captureStackTrace) {
|
||||
Error.captureStackTrace(this, fn)
|
||||
}
|
||||
}
|
||||
|
||||
get name () {
|
||||
return 'OSError'
|
||||
}
|
||||
|
||||
static UNKNOWN_SIGNAL (msg) {
|
||||
return new OSError(msg, 'UNKNOWN_SIGNAL', OSError.UNKNOWN_SIGNAL)
|
||||
}
|
||||
|
||||
static TITLE_OVERFLOW (msg) {
|
||||
return new OSError(msg, 'TITLE_OVERFLOW', OSError.TITLE_OVERFLOW)
|
||||
}
|
||||
}
|
||||
37
Scripts/node_modules/bare-os/package.json
generated
vendored
Normal file
37
Scripts/node_modules/bare-os/package.json
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
"name": "bare-os",
|
||||
"version": "2.4.4",
|
||||
"description": "Operating system utilities for Javascript",
|
||||
"exports": {
|
||||
".": "./index.js",
|
||||
"./package": "./package.json",
|
||||
"./constants": "./lib/constants.js",
|
||||
"./errors": "./lib/errors.js"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"binding.c",
|
||||
"binding.js",
|
||||
"CMakeLists.txt",
|
||||
"lib",
|
||||
"prebuilds"
|
||||
],
|
||||
"addon": true,
|
||||
"scripts": {
|
||||
"test": "standard && bare test.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "git+https://github.com/holepunchto/bare-os.git"
|
||||
},
|
||||
"author": "Holepunch",
|
||||
"license": "Apache-2.0",
|
||||
"bugs": {
|
||||
"url": "https://github.com/holepunchto/bare-os/issues"
|
||||
},
|
||||
"homepage": "https://github.com/holepunchto/bare-os#readme",
|
||||
"devDependencies": {
|
||||
"brittle": "^3.1.1",
|
||||
"standard": "^17.0.0"
|
||||
}
|
||||
}
|
||||
BIN
Scripts/node_modules/bare-os/prebuilds/android-arm/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/android-arm/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/android-arm64/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/android-arm64/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/android-ia32/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/android-ia32/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/android-x64/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/android-x64/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/darwin-arm64/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/darwin-arm64/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/darwin-x64/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/darwin-x64/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/ios-arm64-simulator/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/ios-arm64-simulator/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/ios-arm64/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/ios-arm64/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/ios-x64-simulator/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/ios-x64-simulator/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/linux-arm64/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/linux-arm64/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/linux-x64/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/linux-x64/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/win32-arm64/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/win32-arm64/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
BIN
Scripts/node_modules/bare-os/prebuilds/win32-x64/bare-os.bare
generated
vendored
Normal file
BIN
Scripts/node_modules/bare-os/prebuilds/win32-x64/bare-os.bare
generated
vendored
Normal file
Binary file not shown.
Reference in New Issue
Block a user