Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Synchronet
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Main
Synchronet
Commits
9c5d941e
Commit
9c5d941e
authored
16 years ago
by
deuce
Browse files
Options
Downloads
Patches
Plain Diff
Move towards shared runtimes...
parent
a0cab686
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/sbbs3/js_global.c
+182
-10
182 additions, 10 deletions
src/sbbs3/js_global.c
with
182 additions
and
10 deletions
src/sbbs3/js_global.c
+
182
−
10
View file @
9c5d941e
...
...
@@ -227,6 +227,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
JSBool
success
;
JSBool
background
=
JS_FALSE
;
background_data_t
*
bg
;
jsrefcount
rc
;
*
rval
=
JSVAL_VOID
;
...
...
@@ -330,6 +331,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
,
NULL
,
NULL
,
JSPROP_ENUMERATE
|
JSPROP_READONLY
);
}
rc
=
JS_SuspendRequest
(
cx
);
errno
=
0
;
if
(
isfullpath
(
filename
))
strcpy
(
path
,
filename
);
...
...
@@ -338,6 +340,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
(
p
->
cfg
->
mods_dir
[
0
]
==
0
||
!
fexistcase
(
path
))
sprintf
(
path
,
"%s%s"
,
p
->
cfg
->
exec_dir
,
filename
);
}
JS_ResumeRequest
(
cx
,
rc
);
JS_ClearPendingException
(
exec_cx
);
...
...
@@ -384,14 +387,17 @@ static JSBool
js_yield
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
BOOL
forced
=
TRUE
;
jsrefcount
rc
;
if
(
argc
)
JS_ValueToBoolean
(
cx
,
argv
[
0
],
&
forced
);
rc
=
JS_SuspendRequest
(
cx
);
if
(
forced
)
{
YIELD
();
}
else
{
MAYBE_YIELD
();
}
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -401,10 +407,13 @@ js_mswait(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
int32
val
=
1
;
clock_t
start
=
msclock
();
jsrefcount
rc
;
if
(
argc
)
JS_ValueToInt32
(
cx
,
argv
[
0
],
&
val
);
rc
=
JS_SuspendRequest
(
cx
);
mswait
(
val
);
JS_ResumeRequest
(
cx
,
rc
);
JS_NewNumberValue
(
cx
,
msclock
()
-
start
,
rval
);
...
...
@@ -436,13 +445,16 @@ js_beep(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
int32
freq
=
500
;
int32
dur
=
500
;
jsrefcount
rc
;
if
(
argc
)
JS_ValueToInt32
(
cx
,
argv
[
0
],
&
freq
);
if
(
argc
>
1
)
JS_ValueToInt32
(
cx
,
argv
[
1
],
&
dur
);
rc
=
JS_SuspendRequest
(
cx
);
sbbs_beep
(
freq
,
dur
);
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -461,6 +473,7 @@ js_crc16(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char
*
p
;
size_t
len
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -468,7 +481,9 @@ js_crc16(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
&
len
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
INT_TO_JSVAL
(
crc16
(
p
,
len
));
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -477,6 +492,10 @@ js_crc32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char
*
p
;
size_t
len
;
uint32_t
cs
;
jsrefcount
rc
;
rc
=
JS_SuspendRequest
(
cx
);
JS_ResumeRequest
(
cx
,
rc
);
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -484,7 +503,10 @@ js_crc32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
&
len
))
==
NULL
)
return
(
JS_FALSE
);
JS_NewNumberValue
(
cx
,
crc32
(
p
,
len
),
rval
);
cs
=
crc32
(
p
,
len
);
rc
=
JS_SuspendRequest
(
cx
);
JS_NewNumberValue
(
cx
,
cs
,
rval
);
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -494,6 +516,7 @@ js_chksum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
ulong
sum
=
0
;
char
*
p
;
size_t
len
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -501,7 +524,9 @@ js_chksum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
&
len
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
while
(
len
--
)
sum
+=*
(
p
++
);
JS_ResumeRequest
(
cx
,
rc
);
JS_NewNumberValue
(
cx
,
sum
,
rval
);
return
(
JS_TRUE
);
...
...
@@ -839,6 +864,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
int
old_prefix_bytes
=
0
;
int
outbuf_size
=
0
;
JSString
*
js_str
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -870,6 +896,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
}
prefix
[
0
]
=
0
;
}
rc
=
JS_SuspendRequest
(
cx
);
outbuf
[
0
]
=
0
;
/* Get prefix from the first line (ouch) */
...
...
@@ -1071,6 +1098,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
}
}
JS_ResumeRequest
(
cx
,
rc
);
js_str
=
JS_NewStringCopyZ
(
cx
,
outbuf
);
free
(
outbuf
);
free
(
linebuf
);
...
...
@@ -1093,6 +1121,7 @@ js_quote_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
char
*
linebuf
;
char
*
prefix
=
" > "
;
JSString
*
js_str
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -1116,6 +1145,7 @@ js_quote_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
linebuf
=
(
char
*
)
alloca
(
len
*
2
+
2
))
==
NULL
)
/* (Hopefully) Room for ^A codes. ToDo */
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
outbuf
[
0
]
=
0
;
clen
=
0
;
for
(
i
=
l
=
0
;
inbuf
[
i
];
i
++
)
{
...
...
@@ -1139,6 +1169,7 @@ js_quote_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
}
if
(
l
)
/* remainder */
strncat
(
outbuf
,
linebuf
,
l
);
JS_ResumeRequest
(
cx
,
rc
);
js_str
=
JS_NewStringCopyZ
(
cx
,
outbuf
);
free
(
outbuf
);
...
...
@@ -1409,6 +1440,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
ulong
clear_screen
=
0
;
JSObject
*
stateobj
=
NULL
;
jsval
val
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -1472,6 +1504,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
if
((
tmpbuf
=
(
char
*
)
malloc
((
strlen
(
inbuf
)
*
10
)
+
1
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
for
(
i
=
j
=
0
;
inbuf
[
i
];
i
++
)
{
switch
(
inbuf
[
i
])
{
case
TAB
:
...
...
@@ -1549,6 +1582,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
if
((
outbuf
=
(
uchar
*
)
malloc
(
obsize
))
==
NULL
)
{
free
(
tmpbuf
);
rc
=
JS_SuspendRequest
(
cx
);
return
(
JS_FALSE
);
}
j
=
sprintf
(
outbuf
,
"<span style=
\"
%s
\"
>"
,
htmlansi
[
7
]);
...
...
@@ -1561,6 +1595,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
{
free
(
tmpbuf
);
free
(
outbuf
);
rc
=
JS_SuspendRequest
(
cx
);
return
(
JS_FALSE
);
}
outbuf
=
param
;
...
...
@@ -2014,12 +2049,15 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
}
}
strcpy
(
outbuf
+
j
,
"</span>"
);
rc
=
JS_SuspendRequest
(
cx
);
js_str
=
JS_NewStringCopyZ
(
cx
,
outbuf
);
free
(
outbuf
);
}
else
else
{
rc
=
JS_SuspendRequest
(
cx
);
js_str
=
JS_NewStringCopyZ
(
cx
,
tmpbuf
);
}
free
(
tmpbuf
);
/* assertion here, Feb-20-2006 */
if
(
js_str
==
NULL
)
...
...
@@ -2064,6 +2102,7 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
char
token
[
16
];
size_t
t
;
JSString
*
js_str
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2074,6 +2113,7 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
if
((
outbuf
=
(
char
*
)
malloc
(
strlen
(
inbuf
)
+
1
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
for
(
i
=
j
=
0
;
inbuf
[
i
];
i
++
)
{
if
(
inbuf
[
i
]
!=
'&'
)
{
outbuf
[
j
++
]
=
inbuf
[
i
];
...
...
@@ -2143,6 +2183,7 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva
}
outbuf
[
j
]
=
0
;
JS_ResumeRequest
(
cx
,
rc
);
js_str
=
JS_NewStringCopyZ
(
cx
,
outbuf
);
free
(
outbuf
);
...
...
@@ -2162,6 +2203,7 @@ js_b64_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
uchar
*
inbuf
;
uchar
*
outbuf
;
JSString
*
js_str
;
jsrefcount
rc
;
*
rval
=
JSVAL_NULL
;
...
...
@@ -2176,7 +2218,9 @@ js_b64_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
if
((
outbuf
=
(
char
*
)
malloc
(
len
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
res
=
b64_encode
(
outbuf
,
len
,
inbuf
,
inbuf_len
);
JS_ResumeRequest
(
cx
,
rc
);
if
(
res
<
1
)
{
free
(
outbuf
);
...
...
@@ -2200,6 +2244,7 @@ js_b64_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
uchar
*
inbuf
;
uchar
*
outbuf
;
JSString
*
js_str
;
jsrefcount
rc
;
*
rval
=
JSVAL_NULL
;
...
...
@@ -2214,7 +2259,9 @@ js_b64_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
if
((
outbuf
=
(
char
*
)
malloc
(
len
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
res
=
b64_decode
(
outbuf
,
len
,
inbuf
,
strlen
(
inbuf
));
JS_ResumeRequest
(
cx
,
rc
);
if
(
res
<
1
)
{
free
(
outbuf
);
...
...
@@ -2239,6 +2286,7 @@ js_md5_calc(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
char
*
inbuf
;
char
outbuf
[
64
];
JSString
*
js_str
;
jsrefcount
rc
;
*
rval
=
JSVAL_NULL
;
...
...
@@ -2251,12 +2299,14 @@ js_md5_calc(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval)
if
(
argc
>
1
&&
JSVAL_IS_BOOLEAN
(
argv
[
1
]))
hex
=
JSVAL_TO_BOOLEAN
(
argv
[
1
]);
rc
=
JS_SuspendRequest
(
cx
);
MD5_calc
(
digest
,
inbuf
,
inbuf_len
);
if
(
hex
)
MD5_hex
(
outbuf
,
digest
);
else
b64_encode
(
outbuf
,
sizeof
(
outbuf
),
digest
,
sizeof
(
digest
));
JS_ResumeRequest
(
cx
,
rc
);
js_str
=
JS_NewStringCopyZ
(
cx
,
outbuf
);
if
(
js_str
==
NULL
)
...
...
@@ -2373,6 +2423,7 @@ js_fullpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
char
path
[
MAX_PATH
+
1
];
char
*
str
;
JSString
*
js_str
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2381,7 +2432,9 @@ js_fullpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
return
(
JS_FALSE
);
SAFECOPY
(
path
,
str
);
rc
=
JS_SuspendRequest
(
cx
);
_fullpath
(
path
,
str
,
sizeof
(
path
));
JS_ResumeRequest
(
cx
,
rc
);
if
((
js_str
=
JS_NewStringCopyZ
(
cx
,
path
))
==
NULL
)
return
(
JS_FALSE
);
...
...
@@ -2441,6 +2494,8 @@ js_getfcase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
char
*
str
;
char
path
[
MAX_PATH
+
1
];
JSString
*
js_str
;
jsrefcount
rc
;
rc
=
JS_SuspendRequest
(
cx
);
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2449,13 +2504,17 @@ js_getfcase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
return
(
JS_FALSE
);
SAFECOPY
(
path
,
str
);
rc
=
JS_SuspendRequest
(
cx
);
if
(
fexistcase
(
path
))
{
JS_ResumeRequest
(
cx
,
rc
);
js_str
=
JS_NewStringCopyZ
(
cx
,
path
);
if
(
js_str
==
NULL
)
return
(
JS_FALSE
);
*
rval
=
STRING_TO_JSVAL
(
js_str
);
}
else
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2465,6 +2524,7 @@ js_dosfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
char
*
str
;
char
path
[
MAX_PATH
+
1
];
JSString
*
js_str
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2474,13 +2534,17 @@ js_dosfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
str
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
if
(
GetShortPathName
(
str
,
path
,
sizeof
(
path
)))
{
JS_ResumeRequest
(
cx
,
rc
);
js_str
=
JS_NewStringCopyZ
(
cx
,
path
);
if
(
js_str
==
NULL
)
return
(
JS_FALSE
);
*
rval
=
STRING_TO_JSVAL
(
js_str
);
}
else
JS_ResumeRequest
(
cx
,
rc
);
#else
/* No non-Windows equivalent */
...
...
@@ -2497,6 +2561,10 @@ js_cfgfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
char
*
path
;
char
*
fname
;
char
result
[
MAX_PATH
+
1
];
char
*
cstr
;
jsrefcount
rc
;
rc
=
JS_SuspendRequest
(
cx
);
JS_ResumeRequest
(
cx
,
rc
);
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2507,7 +2575,10 @@ js_cfgfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
fname
=
js_ValueToStringBytes
(
cx
,
argv
[
1
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
*
rval
=
STRING_TO_JSVAL
(
JS_NewStringCopyZ
(
cx
,
iniFileName
(
result
,
sizeof
(
result
),
path
,
fname
)));
rc
=
JS_SuspendRequest
(
cx
);
cstr
=
iniFileName
(
result
,
sizeof
(
result
),
path
,
fname
);
JS_ResumeRequest
(
cx
,
rc
);
*
rval
=
STRING_TO_JSVAL
(
JS_NewStringCopyZ
(
cx
,
cstr
));
return
(
JS_TRUE
);
}
...
...
@@ -2516,6 +2587,7 @@ static JSBool
js_fexist
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2523,7 +2595,9 @@ js_fexist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
fexist
(
p
));
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2531,6 +2605,7 @@ static JSBool
js_removecase
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2538,7 +2613,9 @@ js_removecase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
removecase
(
p
)
==
0
);
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2546,6 +2623,7 @@ static JSBool
js_remove
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2553,7 +2631,9 @@ js_remove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
remove
(
p
)
==
0
);
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2562,6 +2642,7 @@ js_rename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char
*
oldname
;
char
*
newname
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2572,7 +2653,9 @@ js_rename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
newname
=
js_ValueToStringBytes
(
cx
,
argv
[
1
],
NULL
))
==
NULL
)
return
(
JS_TRUE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
rename
(
oldname
,
newname
)
==
0
);
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2581,6 +2664,7 @@ js_fcopy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char
*
src
;
char
*
dest
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2591,7 +2675,9 @@ js_fcopy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
dest
=
js_ValueToStringBytes
(
cx
,
argv
[
1
],
NULL
))
==
NULL
)
return
(
JS_TRUE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
fcopy
(
src
,
dest
));
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2600,6 +2686,7 @@ js_fcompare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
char
*
fn1
;
char
*
fn2
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2610,7 +2697,9 @@ js_fcompare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
fn2
=
js_ValueToStringBytes
(
cx
,
argv
[
1
],
NULL
))
==
NULL
)
return
(
JS_TRUE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
fcompare
(
fn1
,
fn2
));
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2620,6 +2709,7 @@ js_backup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
char
*
fname
;
int32
level
=
5
;
BOOL
ren
=
FALSE
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2633,7 +2723,9 @@ js_backup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
(
argc
>
2
)
JS_ValueToBoolean
(
cx
,
argv
[
2
],
&
ren
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
backup
(
fname
,
level
,
ren
));
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2641,6 +2733,7 @@ static JSBool
js_isdir
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2648,7 +2741,9 @@ js_isdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
isdir
(
p
));
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2656,6 +2751,8 @@ static JSBool
js_fattr
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
jsrefcount
rc
;
int
attr
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2663,7 +2760,10 @@ js_fattr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
JS_NewNumberValue
(
cx
,
getfattr
(
p
),
rval
);
rc
=
JS_SuspendRequest
(
cx
);
attr
=
getfattr
(
p
);
JS_ResumeRequest
(
cx
,
rc
);
JS_NewNumberValue
(
cx
,
attr
,
rval
);
return
(
JS_TRUE
);
}
...
...
@@ -2671,6 +2771,8 @@ static JSBool
js_fdate
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
time_t
fd
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2678,7 +2780,10 @@ js_fdate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
JS_NewNumberValue
(
cx
,
fdate
(
p
),
rval
);
rc
=
JS_SuspendRequest
(
cx
);
fd
=
fdate
(
p
);
JS_ResumeRequest
(
cx
,
rc
);
JS_NewNumberValue
(
cx
,
fd
,
rval
);
return
(
JS_TRUE
);
}
...
...
@@ -2689,6 +2794,7 @@ js_utime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
int32
actime
;
int32
modtime
;
struct
utimbuf
ut
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2709,7 +2815,9 @@ js_utime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
ut
.
modtime
=
modtime
;
}
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
utime
(
fname
,
&
ut
)
==
0
);
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2719,6 +2827,8 @@ static JSBool
js_flength
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
long
fl
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2726,7 +2836,10 @@ js_flength(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
JS_NewNumberValue
(
cx
,
flength
(
p
),
rval
);
rc
=
JS_SuspendRequest
(
cx
);
fl
=
flength
(
p
);
JS_ResumeRequest
(
cx
,
rc
);
JS_NewNumberValue
(
cx
,
fl
,
rval
);
return
(
JS_TRUE
);
}
...
...
@@ -2735,6 +2848,7 @@ static JSBool
js_ftouch
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
fname
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2742,7 +2856,9 @@ js_ftouch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
fname
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
ftouch
(
fname
));
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2753,6 +2869,7 @@ js_fmutex(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
char
*
text
=
NULL
;
int32
max_age
=
0
;
uintN
argn
=
0
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2764,7 +2881,9 @@ js_fmutex(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
(
argc
>
argn
&&
JSVAL_IS_NUMBER
(
argv
[
argn
]))
JS_ValueToInt32
(
cx
,
argv
[
argn
++
],
&
max_age
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
fmutex
(
fname
,
text
,
max_age
));
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2772,6 +2891,7 @@ static JSBool
js_sound
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
jsrefcount
rc
;
if
(
!
argc
)
{
/* Stop playing sound */
#ifdef _WIN32
...
...
@@ -2787,11 +2907,13 @@ js_sound(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
#ifdef _WIN32
*
rval
=
BOOLEAN_TO_JSVAL
(
PlaySound
(
p
,
NULL
,
SND_ASYNC
|
SND_FILENAME
));
#else
*
rval
=
BOOLEAN_TO_JSVAL
(
JS_FALSE
);
#endif
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2807,6 +2929,7 @@ js_directory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
JSString
*
js_str
;
jsint
len
=
0
;
jsval
val
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2822,7 +2945,9 @@ js_directory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
array
=
JS_NewArrayObject
(
cx
,
0
,
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
glob
(
p
,
flags
,
NULL
,
&
g
);
JS_ResumeRequest
(
cx
,
rc
);
for
(
i
=
0
;
i
<
(
int
)
g
.
gl_pathc
;
i
++
)
{
if
((
js_str
=
JS_NewStringCopyZ
(
cx
,
g
.
gl_pathv
[
i
]))
==
NULL
)
break
;
...
...
@@ -2830,7 +2955,9 @@ js_directory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
(
!
JS_SetElement
(
cx
,
array
,
len
++
,
&
val
))
break
;
}
rc
=
JS_SuspendRequest
(
cx
);
globfree
(
&
g
);
JS_ResumeRequest
(
cx
,
rc
);
*
rval
=
OBJECT_TO_JSVAL
(
array
);
...
...
@@ -2845,6 +2972,7 @@ js_wildmatch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
char
*
fname
;
char
*
spec
=
"*"
;
uintN
argn
=
0
;
jsrefcount
rc
;
if
(
JSVAL_IS_BOOLEAN
(
argv
[
argn
]))
JS_ValueToBoolean
(
cx
,
argv
[
argn
++
],
&
case_sensitive
);
...
...
@@ -2859,10 +2987,12 @@ js_wildmatch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
(
argn
<
argc
&&
argv
[
argn
]
!=
JSVAL_VOID
)
JS_ValueToBoolean
(
cx
,
argv
[
argn
++
],
&
path
);
rc
=
JS_SuspendRequest
(
cx
);
if
(
case_sensitive
)
*
rval
=
BOOLEAN_TO_JSVAL
(
wildmatch
(
fname
,
spec
,
path
));
else
*
rval
=
BOOLEAN_TO_JSVAL
(
wildmatchi
(
fname
,
spec
,
path
));
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2873,6 +3003,8 @@ js_freediskspace(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
{
int32
unit
=
0
;
char
*
p
;
ulong
fd
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2883,7 +3015,10 @@ js_freediskspace(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
if
(
argc
>
1
)
JS_ValueToInt32
(
cx
,
argv
[
1
],
&
unit
);
JS_NewNumberValue
(
cx
,
getfreediskspace
(
p
,
unit
),
rval
);
rc
=
JS_SuspendRequest
(
cx
);
fd
=
getfreediskspace
(
p
,
unit
);
JS_ResumeRequest
(
cx
,
rc
);
JS_NewNumberValue
(
cx
,
fd
,
rval
);
return
(
JS_TRUE
);
}
...
...
@@ -2893,6 +3028,8 @@ js_disksize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
{
int32
unit
=
0
;
char
*
p
;
ulong
ds
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2903,7 +3040,10 @@ js_disksize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
(
argc
>
1
)
JS_ValueToInt32
(
cx
,
argv
[
1
],
&
unit
);
JS_NewNumberValue
(
cx
,
getdisksize
(
p
,
unit
),
rval
);
rc
=
JS_SuspendRequest
(
cx
);
ds
=
getdisksize
(
p
,
unit
);
JS_ResumeRequest
(
cx
,
rc
);
JS_NewNumberValue
(
cx
,
ds
,
rval
);
return
(
JS_TRUE
);
}
...
...
@@ -2927,6 +3067,7 @@ js_socket_select(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
SOCKET
*
index
;
jsval
val
;
int
len
=
0
;
jsrefcount
rc
;
*
rval
=
JSVAL_NULL
;
...
...
@@ -2970,18 +3111,24 @@ js_socket_select(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r
}
}
rc
=
JS_SuspendRequest
(
cx
);
if
(
select
(
maxsock
+
1
,
rd_set
,
wr_set
,
NULL
,
&
tv
)
>=
0
)
{
for
(
i
=
0
;
i
<
limit
;
i
++
)
{
if
(
index
[
i
]
!=
INVALID_SOCKET
&&
FD_ISSET
(
index
[
i
],
&
socket_set
))
{
val
=
INT_TO_JSVAL
(
i
);
if
(
!
JS_SetElement
(
cx
,
rarray
,
len
++
,
&
val
))
JS_ResumeRequest
(
cx
,
rc
);
if
(
!
JS_SetElement
(
cx
,
rarray
,
len
++
,
&
val
))
{
rc
=
JS_SuspendRequest
(
cx
);
break
;
}
rc
=
JS_SuspendRequest
(
cx
);
}
}
*
rval
=
OBJECT_TO_JSVAL
(
rarray
);
}
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -2990,6 +3137,7 @@ static JSBool
js_mkdir
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -2997,7 +3145,9 @@ js_mkdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
MKDIR
(
p
)
==
0
);
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -3005,6 +3155,7 @@ static JSBool
js_mkpath
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -3012,7 +3163,9 @@ js_mkpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
mkpath
(
p
)
==
0
);
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -3020,6 +3173,7 @@ static JSBool
js_rmdir
(
JSContext
*
cx
,
JSObject
*
obj
,
uintN
argc
,
jsval
*
argv
,
jsval
*
rval
)
{
char
*
p
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -3027,7 +3181,9 @@ js_rmdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
*
rval
=
BOOLEAN_TO_JSVAL
(
rmdir
(
p
)
==
0
);
JS_ResumeRequest
(
cx
,
rc
);
return
(
JS_TRUE
);
}
...
...
@@ -3041,6 +3197,7 @@ js_strftime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
time_t
t
;
struct
tm
tm
;
JSString
*
js_str
;
jsrefcount
rc
;
if
(
JSVAL_IS_VOID
(
argv
[
0
]))
return
(
JS_TRUE
);
...
...
@@ -3051,11 +3208,13 @@ js_strftime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval)
if
(
argc
>
1
)
JS_ValueToInt32
(
cx
,
argv
[
1
],
&
i
);
rc
=
JS_SuspendRequest
(
cx
);
strcpy
(
str
,
"-Invalid time-"
);
t
=
i
;
if
(
localtime_r
(
&
t
,
&
tm
)
==
NULL
)
memset
(
&
tm
,
0
,
sizeof
(
tm
));
strftime
(
str
,
sizeof
(
str
),
fmt
,
&
tm
);
JS_ResumeRequest
(
cx
,
rc
);
if
((
js_str
=
JS_NewStringCopyZ
(
cx
,
str
))
==
NULL
)
return
(
JS_FALSE
);
...
...
@@ -3070,6 +3229,7 @@ js_resolve_ip(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
struct
in_addr
addr
;
JSString
*
str
;
char
*
p
;
jsrefcount
rc
;
*
rval
=
JSVAL_NULL
;
...
...
@@ -3079,8 +3239,10 @@ js_resolve_ip(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
if
((
addr
.
s_addr
=
resolve_ip
(
p
))
==
INADDR_NONE
)
return
(
JS_TRUE
);
JS_ResumeRequest
(
cx
,
rc
);
if
((
str
=
JS_NewStringCopyZ
(
cx
,
inet_ntoa
(
addr
)))
==
NULL
)
return
(
JS_FALSE
);
...
...
@@ -3096,6 +3258,7 @@ js_resolve_host(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
struct
in_addr
addr
;
HOSTENT
*
h
;
char
*
p
;
jsrefcount
rc
;
*
rval
=
JSVAL_NULL
;
...
...
@@ -3105,8 +3268,10 @@ js_resolve_host(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv
if
((
p
=
js_ValueToStringBytes
(
cx
,
argv
[
0
],
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
addr
.
s_addr
=
inet_addr
(
p
);
h
=
gethostbyaddr
((
char
*
)
&
addr
,
sizeof
(
addr
),
AF_INET
);
JS_ResumeRequest
(
cx
,
rc
);
if
(
h
!=
NULL
&&
h
->
h_name
!=
NULL
)
*
rval
=
STRING_TO_JSVAL
(
JS_NewStringCopyZ
(
cx
,
h
->
h_name
));
...
...
@@ -3125,17 +3290,24 @@ js_list_named_queues(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsva
jsval
val
;
list_node_t
*
node
;
msg_queue_t
*
q
;
jsrefcount
rc
;
if
((
array
=
JS_NewArrayObject
(
cx
,
0
,
NULL
))
==
NULL
)
return
(
JS_FALSE
);
rc
=
JS_SuspendRequest
(
cx
);
for
(
node
=
listFirstNode
(
&
named_queues
);
node
!=
NULL
;
node
=
listNextNode
(
node
))
{
if
((
q
=
listNodeData
(
node
))
==
NULL
)
continue
;
JS_ResumeRequest
(
cx
,
rc
);
val
=
STRING_TO_JSVAL
(
JS_NewStringCopyZ
(
cx
,
q
->
name
));
if
(
!
JS_SetElement
(
cx
,
array
,
len
++
,
&
val
))
if
(
!
JS_SetElement
(
cx
,
array
,
len
++
,
&
val
))
{
rc
=
JS_SuspendRequest
(
cx
);
break
;
}
rc
=
JS_SuspendRequest
(
cx
);
}
JS_ResumeRequest
(
cx
,
rc
);
*
rval
=
OBJECT_TO_JSVAL
(
array
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment