diff --git a/doc/api/deprecations.md b/doc/api/deprecations.md
index 0172cd78383dfb..33e98c4cd4404d 100644
--- a/doc/api/deprecations.md
+++ b/doc/api/deprecations.md
@@ -2233,6 +2233,21 @@ like `dns.lookup(false)` due to backward compatibility.
This behavior is undocumented and is thought to be unused in real world apps.
It will become an error in future versions of Node.js.
+
+### DEP0119: process.binding('uv').errname() private API
+
+
+Type: Documentation-only (supports [`--pending-deprecation`][])
+
+Directly calling `process.binding('uv').errname()` is deprecated.
+Please make sure to use [`util.getSystemErrorName()`][] instead.
+
+
[`--pending-deprecation`]: cli.html#cli_pending_deprecation
[`Buffer.allocUnsafeSlow(size)`]: buffer.html#buffer_class_method_buffer_allocunsafeslow_size
[`Buffer.from(array)`]: buffer.html#buffer_class_method_buffer_from_array
@@ -2300,6 +2315,7 @@ It will become an error in future versions of Node.js.
[`util._extend()`]: util.html#util_util_extend_target_source
[`util.debug()`]: util.html#util_util_debug_string
[`util.error()`]: util.html#util_util_error_strings
+[`util.getSystemErrorName()`]: util.html#util_util_getsystemerrorname_err
[`util.inspect()`]: util.html#util_util_inspect_object_options
[`util.inspect.custom`]: util.html#util_util_inspect_custom
[`util.isArray()`]: util.html#util_util_isarray_object
diff --git a/src/env.cc b/src/env.cc
index 14a8b23a8441e9..4f98b5590cf941 100644
--- a/src/env.cc
+++ b/src/env.cc
@@ -134,6 +134,7 @@ Environment::Environment(IsolateData* isolate_data,
printed_error_(false),
abort_on_uncaught_exception_(false),
emit_env_nonstring_warning_(true),
+ emit_err_name_warning_(true),
makecallback_cntr_(0),
should_abort_on_uncaught_toggle_(isolate_, 1),
trace_category_state_(isolate_, kTraceCategoryCount),
diff --git a/src/env.h b/src/env.h
index 1eb333b0ef31d9..3daa48f9cbb70e 100644
--- a/src/env.h
+++ b/src/env.h
@@ -843,6 +843,12 @@ class Environment {
return current_value;
}
+ inline bool EmitErrNameWarning() {
+ bool current_value = emit_err_name_warning_;
+ emit_err_name_warning_ = false;
+ return current_value;
+ }
+
typedef void (*native_immediate_callback)(Environment* env, void* data);
// cb will be called as cb(env, data) on the next event loop iteration.
// obj will be kept alive between now and after the callback has run.
@@ -929,6 +935,7 @@ class Environment {
bool printed_error_;
bool abort_on_uncaught_exception_;
bool emit_env_nonstring_warning_;
+ bool emit_err_name_warning_;
size_t makecallback_cntr_;
std::vector destroy_async_id_list_;
diff --git a/src/uv.cc b/src/uv.cc
index 3d070a32bdb3b4..354acee4c01fc6 100644
--- a/src/uv.cc
+++ b/src/uv.cc
@@ -39,10 +39,17 @@ using v8::String;
using v8::Value;
-// TODO(joyeecheung): deprecate this function in favor of
-// lib/util.getSystemErrorName()
void ErrName(const FunctionCallbackInfo& args) {
Environment* env = Environment::GetCurrent(args);
+ if (env->options()->pending_deprecation && env->EmitErrNameWarning()) {
+ if (ProcessEmitDeprecationWarning(
+ env,
+ "Directly calling process.binding('uv').errname() is being"
+ " deprecated. "
+ "Please make sure to use util.getSystemErrorName() instead.",
+ "DEP0119").IsNothing())
+ return;
+ }
int err;
if (!args[0]->Int32Value(env->context()).To(&err)) return;
CHECK_LT(err, 0);
diff --git a/test/parallel/test-err-name-deprecation.js b/test/parallel/test-err-name-deprecation.js
new file mode 100644
index 00000000000000..d9af7e3804ec4a
--- /dev/null
+++ b/test/parallel/test-err-name-deprecation.js
@@ -0,0 +1,13 @@
+'use strict';
+const common = require('../common');
+
+// Flags: --pending-deprecation
+
+common.expectWarning(
+ 'DeprecationWarning',
+ 'Directly calling process.binding(\'uv\').errname() is being ' +
+ 'deprecated. Please make sure to use util.getSystemErrorName() instead.',
+ 'DEP0119'
+);
+
+process.binding('uv').errname(-1);