@@ -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,8 @@ 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 > mode = GetValidMode (env, args[1 ], UV_FS_ACCESS );
1038
+ if (mode. IsNothing () ) return ;
1033
1039
1034
1040
BufferValue path (isolate, args[0 ]);
1035
1041
CHECK_NOT_NULL (*path);
@@ -1041,12 +1047,20 @@ void Access(const FunctionCallbackInfo<Value>& args) {
1041
1047
CHECK_NOT_NULL (req_wrap_async);
1042
1048
FS_ASYNC_TRACE_BEGIN1 (
1043
1049
UV_FS_ACCESS, req_wrap_async, " path" , TRACE_STR_COPY (*path))
1044
- AsyncCall (env, req_wrap_async, args, " access" , UTF8, AfterNoArgs,
1045
- uv_fs_access, *path, mode);
1050
+ AsyncCall (env,
1051
+ req_wrap_async,
1052
+ args,
1053
+ " access" ,
1054
+ UTF8,
1055
+ AfterNoArgs,
1056
+ uv_fs_access,
1057
+ *path,
1058
+ mode.FromJust ());
1046
1059
} else { // access(path, mode)
1047
1060
FSReqWrapSync req_wrap_sync (" access" , *path);
1048
1061
FS_SYNC_TRACE_BEGIN (access);
1049
- SyncCallAndThrowOnError (env, &req_wrap_sync, uv_fs_access, *path, mode);
1062
+ SyncCallAndThrowOnError (
1063
+ env, &req_wrap_sync, uv_fs_access, *path, mode.FromJust ());
1050
1064
FS_SYNC_TRACE_END (access);
1051
1065
}
1052
1066
}
@@ -2141,8 +2155,8 @@ static void CopyFile(const FunctionCallbackInfo<Value>& args) {
2141
2155
const int argc = args.Length ();
2142
2156
CHECK_GE (argc, 3 );
2143
2157
2144
- const int flags = GetValidMode (env, args[2 ], " copyFile " );
2145
- if (flags == - 1 ) return ;
2158
+ Maybe< int > flags = GetValidMode (env, args[2 ], UV_FS_COPYFILE );
2159
+ if (flags. IsNothing () ) return ;
2146
2160
2147
2161
BufferValue src (isolate, args[0 ]);
2148
2162
CHECK_NOT_NULL (*src);
@@ -2162,14 +2176,23 @@ static void CopyFile(const FunctionCallbackInfo<Value>& args) {
2162
2176
TRACE_STR_COPY (*src),
2163
2177
" dest" ,
2164
2178
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);
2179
+ AsyncDestCall (env,
2180
+ req_wrap_async,
2181
+ args,
2182
+ " copyfile" ,
2183
+ *dest,
2184
+ dest.length (),
2185
+ UTF8,
2186
+ AfterNoArgs,
2187
+ uv_fs_copyfile,
2188
+ *src,
2189
+ *dest,
2190
+ flags.FromJust ());
2168
2191
} else { // copyFile(src, dest, flags)
2169
2192
FSReqWrapSync req_wrap_sync (" copyfile" , *src, *dest);
2170
2193
FS_SYNC_TRACE_BEGIN (copyfile);
2171
2194
SyncCallAndThrowOnError (
2172
- env, &req_wrap_sync, uv_fs_copyfile, *src, *dest, flags);
2195
+ env, &req_wrap_sync, uv_fs_copyfile, *src, *dest, flags. FromJust () );
2173
2196
FS_SYNC_TRACE_END (copyfile);
2174
2197
}
2175
2198
}
0 commit comments