@@ -66,6 +66,7 @@ using v8::HandleScope;
66
66
using v8::Int32;
67
67
using v8::Integer;
68
68
using v8::Isolate;
69
+ using v8::Just;
69
70
using v8::JustVoid;
70
71
using v8::Local;
71
72
using v8::Maybe;
@@ -89,6 +90,13 @@ constexpr char kPathSeparator = '/';
89
90
const char * const kPathSeparator = " \\ /" ;
90
91
#endif
91
92
93
+ // F_OK etc. constants
94
+ #ifdef _WIN32
95
+ #include " uv.h"
96
+ #else
97
+ #include < unistd.h>
98
+ #endif
99
+
92
100
// The access modes can be any of F_OK, R_OK, W_OK or X_OK. Some might not be
93
101
// available on specific systems. They can be used in combination as well
94
102
// (F_OK | R_OK | W_OK | X_OK).
@@ -872,41 +880,39 @@ void FromNamespacedPath(std::string* path) {
872
880
#endif
873
881
}
874
882
875
- static inline int GetValidMode (Environment* env,
876
- Local<Value> mode_v,
877
- std::string_view type) {
883
+ static inline Maybe< int > GetValidMode (Environment* env,
884
+ Local<Value> mode_v,
885
+ uv_fs_type type) {
878
886
if (!mode_v->IsInt32 () && !mode_v->IsNullOrUndefined ()) {
879
887
THROW_ERR_INVALID_ARG_TYPE (env, " mode must be int32 or null/undefined" );
880
- return - 1 ;
888
+ return Nothing< int >() ;
881
889
}
882
890
883
891
int min = kMinimumAccessMode ;
884
892
int max = kMaximumAccessMode ;
885
893
int def = F_OK;
886
894
887
- if (type == " copyFile" ) {
895
+ CHECK (type == UV_FS_ACCESS || type == UV_FS_COPYFILE);
896
+
897
+ if (type == UV_FS_COPYFILE) {
888
898
min = kMinimumCopyMode ;
889
899
max = kMaximumCopyMode ;
890
900
def = mode_v->IsNullOrUndefined () ? kDefaultCopyMode
891
901
: mode_v.As <Int32>()->Value ();
892
- } else if (type != " access" ) {
893
- THROW_ERR_INVALID_ARG_TYPE (
894
- env, " type must be equal to \" copyFile\" or \" access\" " );
895
- return -1 ;
896
902
}
897
903
898
904
if (mode_v->IsNullOrUndefined ()) {
899
- return def;
905
+ return Just ( def) ;
900
906
}
901
907
902
908
const int mode = mode_v.As <Int32>()->Value ();
903
909
if (mode < min || mode > max) {
904
910
THROW_ERR_OUT_OF_RANGE (
905
911
env, " mode is out of range: >= %d && <= %d" , min, max);
906
- return - 1 ;
912
+ return Nothing< int >() ;
907
913
}
908
914
909
- return mode;
915
+ return Just ( mode) ;
910
916
}
911
917
912
918
void AfterMkdirp (uv_fs_t * req) {
@@ -1028,8 +1034,9 @@ void Access(const FunctionCallbackInfo<Value>& args) {
1028
1034
const int argc = args.Length ();
1029
1035
CHECK_GE (argc, 2 );
1030
1036
1031
- int mode = GetValidMode (env, args[1 ], " access" );
1032
- if (mode == -1 ) return ;
1037
+ Maybe<int > maybe_mode = GetValidMode (env, args[1 ], UV_FS_ACCESS);
1038
+ int mode;
1039
+ if (!maybe_mode.To (&mode)) return ;
1033
1040
1034
1041
BufferValue path (isolate, args[0 ]);
1035
1042
CHECK_NOT_NULL (*path);
@@ -2141,8 +2148,9 @@ static void CopyFile(const FunctionCallbackInfo<Value>& args) {
2141
2148
const int argc = args.Length ();
2142
2149
CHECK_GE (argc, 3 );
2143
2150
2144
- const int flags = GetValidMode (env, args[2 ], " copyFile" );
2145
- if (flags == -1 ) return ;
2151
+ Maybe<int > maybe_mode = GetValidMode (env, args[2 ], UV_FS_COPYFILE);
2152
+ int mode;
2153
+ if (!maybe_mode.To (&mode)) return ;
2146
2154
2147
2155
BufferValue src (isolate, args[0 ]);
2148
2156
CHECK_NOT_NULL (*src);
@@ -2154,22 +2162,31 @@ static void CopyFile(const FunctionCallbackInfo<Value>& args) {
2154
2162
THROW_IF_INSUFFICIENT_PERMISSIONS (
2155
2163
env, permission::PermissionScope::kFileSystemWrite , dest.ToStringView ());
2156
2164
2157
- if (argc > 3 ) { // copyFile(src, dest, flags , req)
2165
+ if (argc > 3 ) { // copyFile(src, dest, mode , req)
2158
2166
FSReqBase* req_wrap_async = GetReqWrap (args, 3 );
2159
2167
FS_ASYNC_TRACE_BEGIN2 (UV_FS_COPYFILE,
2160
2168
req_wrap_async,
2161
2169
" src" ,
2162
2170
TRACE_STR_COPY (*src),
2163
2171
" dest" ,
2164
2172
TRACE_STR_COPY (*dest))
2165
- AsyncDestCall (env, req_wrap_async, args, " copyfile" ,
2166
- *dest, dest.length (), UTF8, AfterNoArgs,
2167
- uv_fs_copyfile, *src, *dest, flags);
2168
- } else { // copyFile(src, dest, flags)
2173
+ AsyncDestCall (env,
2174
+ req_wrap_async,
2175
+ args,
2176
+ " copyfile" ,
2177
+ *dest,
2178
+ dest.length (),
2179
+ UTF8,
2180
+ AfterNoArgs,
2181
+ uv_fs_copyfile,
2182
+ *src,
2183
+ *dest,
2184
+ mode);
2185
+ } else { // copyFile(src, dest, mode)
2169
2186
FSReqWrapSync req_wrap_sync (" copyfile" , *src, *dest);
2170
2187
FS_SYNC_TRACE_BEGIN (copyfile);
2171
2188
SyncCallAndThrowOnError (
2172
- env, &req_wrap_sync, uv_fs_copyfile, *src, *dest, flags );
2189
+ env, &req_wrap_sync, uv_fs_copyfile, *src, *dest, mode );
2173
2190
FS_SYNC_TRACE_END (copyfile);
2174
2191
}
2175
2192
}
0 commit comments