Commit 935dea2f authored by Kevin Koltzau's avatar Kevin Koltzau Committed by Alexandre Julliard

Fix warnings and errors in 64bit.

parent f5acfaad
......@@ -50,7 +50,15 @@ typedef unsigned short MSVCRT_wint_t;
typedef unsigned short MSVCRT_wctype_t;
typedef unsigned short MSVCRT__ino_t;
typedef unsigned long MSVCRT__fsize_t;
#ifdef _WIN64
typedef unsigned __int64 MSVCRT_size_t;
typedef __int64 MSVCRT_intptr_t;
typedef unsigned __int64 MSVCRT_uintptr_t;
#else
typedef unsigned int MSVCRT_size_t;
typedef int MSVCRT_intptr_t;
typedef unsigned int MSVCRT_uintptr_t;
#endif
typedef unsigned int MSVCRT__dev_t;
typedef int MSVCRT__off_t;
typedef long MSVCRT_clock_t;
......@@ -584,7 +592,7 @@ int _write(int,const void*,unsigned int);
int _getch(void);
int _vsnwprintf(MSVCRT_wchar_t*,MSVCRT_size_t,const MSVCRT_wchar_t*,va_list);
int _ismbstrail(const unsigned char* start, const unsigned char* str);
int _spawnve(int,const char*,const char* const *,const char* const *);
MSVCRT_intptr_t _spawnve(int,const char*,const char* const *,const char* const *);
void _searchenv(const char*,const char*,char*);
int _getdrive(void);
char* _strdup(const char*);
......
......@@ -35,14 +35,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
/* INTERNAL: Spawn a child process */
static int msvcrt_spawn(int flags, const char* exe, char* cmdline, char* env)
static MSVCRT_intptr_t msvcrt_spawn(int flags, const char* exe, char* cmdline, char* env)
{
STARTUPINFOA si;
PROCESS_INFORMATION pi;
if (sizeof(HANDLE) != sizeof(int))
WARN("This call is unsuitable for your architecture\n");
if ((unsigned)flags > MSVCRT__P_DETACH)
{
*MSVCRT__errno() = MSVCRT_EINVAL;
......@@ -69,7 +66,7 @@ static int msvcrt_spawn(int flags, const char* exe, char* cmdline, char* env)
GetExitCodeProcess(pi.hProcess,&pi.dwProcessId);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return (int)pi.dwProcessId;
return pi.dwProcessId;
case MSVCRT__P_DETACH:
CloseHandle(pi.hProcess);
pi.hProcess = 0;
......@@ -77,7 +74,7 @@ static int msvcrt_spawn(int flags, const char* exe, char* cmdline, char* env)
case MSVCRT__P_NOWAIT:
case MSVCRT__P_NOWAITO:
CloseHandle(pi.hThread);
return (int)pi.hProcess;
return (MSVCRT_intptr_t)pi.hProcess;
case MSVCRT__P_OVERLAY:
MSVCRT__exit(0);
}
......@@ -186,7 +183,7 @@ static char* msvcrt_valisttos(const char* arg0, va_list alist, char delim)
/*********************************************************************
* _cwait (MSVCRT.@)
*/
int _cwait(int *status, int pid, int action)
MSVCRT_intptr_t _cwait(int *status, MSVCRT_intptr_t pid, int action)
{
HANDLE hPid = (HANDLE)pid;
int doserrno;
......@@ -201,7 +198,7 @@ int _cwait(int *status, int pid, int action)
GetExitCodeProcess(hPid, &stat);
*status = (int)stat;
}
return (int)pid;
return pid;
}
doserrno = GetLastError();
......@@ -222,11 +219,11 @@ int _cwait(int *status, int pid, int action)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _execl(const char* name, const char* arg0, ...)
MSVCRT_intptr_t _execl(const char* name, const char* arg0, ...)
{
va_list ap;
char * args;
int ret;
MSVCRT_intptr_t ret;
va_start(ap, arg0);
args = msvcrt_valisttos(arg0, ap, ' ');
......@@ -241,7 +238,7 @@ int _execl(const char* name, const char* arg0, ...)
/*********************************************************************
* _execle (MSVCRT.@)
*/
int _execle(const char* name, const char* arg0, ...)
MSVCRT_intptr_t _execle(const char* name, const char* arg0, ...)
{
FIXME("stub\n");
return -1;
......@@ -253,11 +250,11 @@ int _execle(const char* name, const char* arg0, ...)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _execlp(const char* name, const char* arg0, ...)
MSVCRT_intptr_t _execlp(const char* name, const char* arg0, ...)
{
va_list ap;
char * args;
int ret;
MSVCRT_intptr_t ret;
char fullname[MAX_PATH];
_searchenv(name, "PATH", fullname);
......@@ -275,7 +272,7 @@ int _execlp(const char* name, const char* arg0, ...)
/*********************************************************************
* _execlpe (MSVCRT.@)
*/
int _execlpe(const char* name, const char* arg0, ...)
MSVCRT_intptr_t _execlpe(const char* name, const char* arg0, ...)
{
FIXME("stub\n");
return -1;
......@@ -287,7 +284,7 @@ int _execlpe(const char* name, const char* arg0, ...)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _execv(const char* name, char* const* argv)
MSVCRT_intptr_t _execv(const char* name, char* const* argv)
{
return _spawnve(MSVCRT__P_OVERLAY, name, (const char* const*) argv, NULL);
}
......@@ -298,7 +295,7 @@ int _execv(const char* name, char* const* argv)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _execve(const char* name, char* const* argv, const char* const* envv)
MSVCRT_intptr_t _execve(const char* name, char* const* argv, const char* const* envv)
{
return _spawnve(MSVCRT__P_OVERLAY, name, (const char* const*) argv, envv);
}
......@@ -309,7 +306,7 @@ int _execve(const char* name, char* const* argv, const char* const* envv)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _execvpe(const char* name, char* const* argv, const char* const* envv)
MSVCRT_intptr_t _execvpe(const char* name, char* const* argv, const char* const* envv)
{
char fullname[MAX_PATH];
......@@ -324,7 +321,7 @@ int _execvpe(const char* name, char* const* argv, const char* const* envv)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _execvp(const char* name, char* const* argv)
MSVCRT_intptr_t _execvp(const char* name, char* const* argv)
{
return _execvpe(name, argv, NULL);
}
......@@ -335,11 +332,11 @@ int _execvp(const char* name, char* const* argv)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _spawnl(int flags, const char* name, const char* arg0, ...)
MSVCRT_intptr_t _spawnl(int flags, const char* name, const char* arg0, ...)
{
va_list ap;
char * args;
int ret;
MSVCRT_intptr_t ret;
va_start(ap, arg0);
args = msvcrt_valisttos(arg0, ap, ' ');
......@@ -354,12 +351,12 @@ int _spawnl(int flags, const char* name, const char* arg0, ...)
/*********************************************************************
* _spawnle (MSVCRT.@)
*/
int _spawnle(int flags, const char* name, const char* arg0, ...)
MSVCRT_intptr_t _spawnle(int flags, const char* name, const char* arg0, ...)
{
va_list ap;
char *args, *envs = NULL;
const char * const *envp;
int ret;
MSVCRT_intptr_t ret;
va_start(ap, arg0);
args = msvcrt_valisttos(arg0, ap, ' ');
......@@ -385,11 +382,11 @@ int _spawnle(int flags, const char* name, const char* arg0, ...)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _spawnlp(int flags, const char* name, const char* arg0, ...)
MSVCRT_intptr_t _spawnlp(int flags, const char* name, const char* arg0, ...)
{
va_list ap;
char * args;
int ret;
MSVCRT_intptr_t ret;
char fullname[MAX_PATH];
_searchenv(name, "PATH", fullname);
......@@ -407,12 +404,12 @@ int _spawnlp(int flags, const char* name, const char* arg0, ...)
/*********************************************************************
* _spawnlpe (MSVCRT.@)
*/
int _spawnlpe(int flags, const char* name, const char* arg0, ...)
MSVCRT_intptr_t _spawnlpe(int flags, const char* name, const char* arg0, ...)
{
va_list ap;
char *args, *envs = NULL;
const char * const *envp;
int ret;
MSVCRT_intptr_t ret;
char fullname[MAX_PATH];
_searchenv(name, "PATH", fullname);
......@@ -440,13 +437,13 @@ int _spawnlpe(int flags, const char* name, const char* arg0, ...)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _spawnve(int flags, const char* name, const char* const* argv,
MSVCRT_intptr_t _spawnve(int flags, const char* name, const char* const* argv,
const char* const* envv)
{
char * args = msvcrt_argvtos(argv,' ');
char * envs = msvcrt_argvtos(envv,0);
const char *fullname = name;
int ret = -1;
MSVCRT_intptr_t ret = -1;
FIXME(":not translating name %s to locate program\n",fullname);
TRACE(":call (%s), params (%s), env (%s)\n",debugstr_a(name),debugstr_a(args),
......@@ -469,7 +466,7 @@ int _spawnve(int flags, const char* name, const char* const* argv,
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _spawnv(int flags, const char* name, const char* const* argv)
MSVCRT_intptr_t _spawnv(int flags, const char* name, const char* const* argv)
{
return _spawnve(flags, name, argv, NULL);
}
......@@ -480,7 +477,7 @@ int _spawnv(int flags, const char* name, const char* const* argv)
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _spawnvpe(int flags, const char* name, const char* const* argv,
MSVCRT_intptr_t _spawnvpe(int flags, const char* name, const char* const* argv,
const char* const* envv)
{
char fullname[MAX_PATH];
......@@ -494,7 +491,7 @@ int _spawnvpe(int flags, const char* name, const char* const* argv,
* Like on Windows, this function does not handle arguments with spaces
* or double-quotes.
*/
int _spawnvp(int flags, const char* name, const char* const* argv)
MSVCRT_intptr_t _spawnvp(int flags, const char* name, const char* const* argv)
{
return _spawnvpe(flags, name, argv, NULL);
}
......@@ -635,15 +632,15 @@ int MSVCRT_system(const char* cmd)
/*********************************************************************
* _loaddll (MSVCRT.@)
*/
int _loaddll(const char* dllname)
MSVCRT_intptr_t _loaddll(const char* dllname)
{
return (int)LoadLibraryA(dllname);
return (MSVCRT_intptr_t)LoadLibraryA(dllname);
}
/*********************************************************************
* _unloaddll (MSVCRT.@)
*/
int _unloaddll(int dll)
int _unloaddll(MSVCRT_intptr_t dll)
{
if (FreeLibrary((HMODULE)dll))
return 0;
......@@ -658,7 +655,7 @@ int _unloaddll(int dll)
/*********************************************************************
* _getdllprocaddr (MSVCRT.@)
*/
void *_getdllprocaddr(int dll, const char *name, int ordinal)
void *_getdllprocaddr(MSVCRT_intptr_t dll, const char *name, int ordinal)
{
if (name)
{
......
......@@ -57,7 +57,7 @@ char* _strdup(const char* str)
/*********************************************************************
* _strnset (MSVCRT.@)
*/
char* _strnset(char* str, int value, unsigned int len)
char* _strnset(char* str, int value, MSVCRT_size_t len)
{
if (len > 0 && str)
while (*str && len--)
......
......@@ -81,6 +81,8 @@ static void test_types(void)
CHECK_TYPE(_ino_t);
CHECK_TYPE(_fsize_t);
CHECK_TYPE(size_t);
CHECK_TYPE(intptr_t);
CHECK_TYPE(uintptr_t);
CHECK_TYPE(_dev_t);
CHECK_TYPE(_off_t);
CHECK_TYPE(clock_t);
......
......@@ -70,7 +70,7 @@ static DWORD CALLBACK _beginthread_trampoline(LPVOID arg)
/*********************************************************************
* _beginthread (MSVCRT.@)
*/
unsigned long _beginthread(
MSVCRT_uintptr_t _beginthread(
MSVCRT__beginthread_start_routine_t start_address, /* [in] Start address of routine that begins execution of new thread */
unsigned int stack_size, /* [in] Stack size for new thread or 0 */
void *arglist) /* [in] Argument list to be passed to new thread or NULL */
......@@ -88,14 +88,14 @@ unsigned long _beginthread(
trampoline->arglist = arglist;
/* FIXME */
return (unsigned long)CreateThread(NULL, stack_size, _beginthread_trampoline,
return (MSVCRT_uintptr_t)CreateThread(NULL, stack_size, _beginthread_trampoline,
trampoline, 0, NULL);
}
/*********************************************************************
* _beginthreadex (MSVCRT.@)
*/
unsigned long _beginthreadex(
MSVCRT_uintptr_t _beginthreadex(
void *security, /* [in] Security descriptor for new thread; must be NULL for Windows 9x applications */
unsigned int stack_size, /* [in] Stack size for new thread or 0 */
MSVCRT__beginthreadex_start_routine_t start_address, /* [in] Start address of routine that begins execution of new thread */
......@@ -106,7 +106,7 @@ unsigned long _beginthreadex(
TRACE("(%p, %d, %p, %p, %d, %p)\n", security, stack_size, start_address, arglist, initflag, thrdaddr);
/* FIXME */
return (unsigned long)CreateThread(security, stack_size,
return (MSVCRT_uintptr_t)CreateThread(security, stack_size,
(LPTHREAD_START_ROUTINE) start_address,
arglist, initflag, (LPDWORD) thrdaddr);
}
......
......@@ -49,28 +49,28 @@ extern "C" {
typedef void (*_beginthread_start_routine_t)(void *);
typedef unsigned int (__stdcall *_beginthreadex_start_routine_t)(void *);
unsigned long _beginthread(_beginthread_start_routine_t,unsigned int,void*);
unsigned long _beginthreadex(void*,unsigned int,_beginthreadex_start_routine_t,void*,unsigned int,unsigned int*);
int _cwait(int*,int,int);
uintptr_t _beginthread(_beginthread_start_routine_t,unsigned int,void*);
uintptr_t _beginthreadex(void*,unsigned int,_beginthreadex_start_routine_t,void*,unsigned int,unsigned int*);
intptr_t _cwait(int*,intptr_t,int);
void _endthread(void);
void _endthreadex(unsigned int);
int _execl(const char*,const char*,...);
int _execle(const char*,const char*,...);
int _execlp(const char*,const char*,...);
int _execlpe(const char*,const char*,...);
int _execv(const char*,char* const *);
int _execve(const char*,char* const *,const char* const *);
int _execvp(const char*,char* const *);
int _execvpe(const char*,char* const *,const char* const *);
intptr_t _execl(const char*,const char*,...);
intptr_t _execle(const char*,const char*,...);
intptr_t _execlp(const char*,const char*,...);
intptr_t _execlpe(const char*,const char*,...);
intptr_t _execv(const char*,char* const *);
intptr_t _execve(const char*,char* const *,const char* const *);
intptr_t _execvp(const char*,char* const *);
intptr_t _execvpe(const char*,char* const *,const char* const *);
int _getpid(void);
int _spawnl(int,const char*,const char*,...);
int _spawnle(int,const char*,const char*,...);
int _spawnlp(int,const char*,const char*,...);
int _spawnlpe(int,const char*,const char*,...);
int _spawnv(int,const char*,const char* const *);
int _spawnve(int,const char*,const char* const *,const char* const *);
int _spawnvp(int,const char*,const char* const *);
int _spawnvpe(int,const char*,const char* const *,const char* const *);
intptr_t _spawnl(int,const char*,const char*,...);
intptr_t _spawnle(int,const char*,const char*,...);
intptr_t _spawnlp(int,const char*,const char*,...);
intptr_t _spawnlpe(int,const char*,const char*,...);
intptr_t _spawnv(int,const char*,const char* const *);
intptr_t _spawnve(int,const char*,const char* const *,const char* const *);
intptr_t _spawnvp(int,const char*,const char* const *);
intptr_t _spawnvpe(int,const char*,const char* const *,const char* const *);
void _c_exit(void);
void _cexit(void);
......@@ -81,22 +81,22 @@ int system(const char*);
#ifndef _WPROCESS_DEFINED
#define _WPROCESS_DEFINED
int _wexecl(const wchar_t*,const wchar_t*,...);
int _wexecle(const wchar_t*,const wchar_t*,...);
int _wexeclp(const wchar_t*,const wchar_t*,...);
int _wexeclpe(const wchar_t*,const wchar_t*,...);
int _wexecv(const wchar_t*,const wchar_t* const *);
int _wexecve(const wchar_t*,const wchar_t* const *,const wchar_t* const *);
int _wexecvp(const wchar_t*,const wchar_t* const *);
int _wexecvpe(const wchar_t*,const wchar_t* const *,const wchar_t* const *);
int _wspawnl(int,const wchar_t*,const wchar_t*,...);
int _wspawnle(int,const wchar_t*,const wchar_t*,...);
int _wspawnlp(int,const wchar_t*,const wchar_t*,...);
int _wspawnlpe(int,const wchar_t*,const wchar_t*,...);
int _wspawnv(int,const wchar_t*,const wchar_t* const *);
int _wspawnve(int,const wchar_t*,const wchar_t* const *,const wchar_t* const *);
int _wspawnvp(int,const wchar_t*,const wchar_t* const *);
int _wspawnvpe(int,const wchar_t*,const wchar_t* const *,const wchar_t* const *);
intptr_t _wexecl(const wchar_t*,const wchar_t*,...);
intptr_t _wexecle(const wchar_t*,const wchar_t*,...);
intptr_t _wexeclp(const wchar_t*,const wchar_t*,...);
intptr_t _wexeclpe(const wchar_t*,const wchar_t*,...);
intptr_t _wexecv(const wchar_t*,const wchar_t* const *);
intptr_t _wexecve(const wchar_t*,const wchar_t* const *,const wchar_t* const *);
intptr_t _wexecvp(const wchar_t*,const wchar_t* const *);
intptr_t _wexecvpe(const wchar_t*,const wchar_t* const *,const wchar_t* const *);
intptr_t _wspawnl(int,const wchar_t*,const wchar_t*,...);
intptr_t _wspawnle(int,const wchar_t*,const wchar_t*,...);
intptr_t _wspawnlp(int,const wchar_t*,const wchar_t*,...);
intptr_t _wspawnlpe(int,const wchar_t*,const wchar_t*,...);
intptr_t _wspawnv(int,const wchar_t*,const wchar_t* const *);
intptr_t _wspawnve(int,const wchar_t*,const wchar_t* const *,const wchar_t* const *);
intptr_t _wspawnvp(int,const wchar_t*,const wchar_t* const *);
intptr_t _wspawnvpe(int,const wchar_t*,const wchar_t* const *,const wchar_t* const *);
int _wsystem(const wchar_t*);
#endif /* _WPROCESS_DEFINED */
......@@ -114,26 +114,26 @@ int _wsystem(const wchar_t*);
#define WAIT_CHILD _WAIT_CHILD
#define WAIT_GRANDCHILD _WAIT_GRANDCHILD
static inline int cwait(int *status, int pid, int action) { return _cwait(status, pid, action); }
static inline intptr_t cwait(int *status, intptr_t pid, int action) { return _cwait(status, pid, action); }
static inline int getpid(void) { return _getpid(); }
static inline int execv(const char* name, char* const* argv) { return _execv(name, argv); }
static inline int execve(const char* name, char* const* argv, const char* const* envv) { return _execve(name, argv, envv); }
static inline int execvp(const char* name, char* const* argv) { return _execvp(name, argv); }
static inline int execvpe(const char* name, char* const* argv, const char* const* envv) { return _execvpe(name, argv, envv); }
static inline int spawnv(int flags, const char* name, const char* const* argv) { return _spawnv(flags, name, argv); }
static inline int spawnve(int flags, const char* name, const char* const* argv, const char* const* envv) { return _spawnve(flags, name, argv, envv); }
static inline int spawnvp(int flags, const char* name, const char* const* argv) { return _spawnvp(flags, name, argv); }
static inline int spawnvpe(int flags, const char* name, const char* const* argv, const char* const* envv) { return _spawnvpe(flags, name, argv, envv); }
static inline intptr_t execv(const char* name, char* const* argv) { return _execv(name, argv); }
static inline intptr_t execve(const char* name, char* const* argv, const char* const* envv) { return _execve(name, argv, envv); }
static inline intptr_t execvp(const char* name, char* const* argv) { return _execvp(name, argv); }
static inline intptr_t execvpe(const char* name, char* const* argv, const char* const* envv) { return _execvpe(name, argv, envv); }
static inline intptr_t spawnv(int flags, const char* name, const char* const* argv) { return _spawnv(flags, name, argv); }
static inline intptr_t spawnve(int flags, const char* name, const char* const* argv, const char* const* envv) { return _spawnve(flags, name, argv, envv); }
static inline intptr_t spawnvp(int flags, const char* name, const char* const* argv) { return _spawnvp(flags, name, argv); }
static inline intptr_t spawnvpe(int flags, const char* name, const char* const* argv, const char* const* envv) { return _spawnvpe(flags, name, argv, envv); }
#if defined(__GNUC__) && (__GNUC__ < 4)
extern int execl(const char*,const char*,...) __attribute__((alias("_execl")));
extern int execle(const char*,const char*,...) __attribute__((alias("_execle")));
extern int execlp(const char*,const char*,...) __attribute__((alias("_execlp")));
extern int execlpe(const char*,const char*,...) __attribute__((alias("_execlpe")));
extern int spawnl(int,const char*,const char*,...) __attribute__((alias("_spawnl")));
extern int spawnle(int,const char*,const char*,...) __attribute__((alias("_spawnle")));
extern int spawnlp(int,const char*,const char*,...) __attribute__((alias("_spawnlp")));
extern int spawnlpe(int,const char*,const char*,...) __attribute__((alias("_spawnlpe")));
extern intptr_t execl(const char*,const char*,...) __attribute__((alias("_execl")));
extern intptr_t execle(const char*,const char*,...) __attribute__((alias("_execle")));
extern intptr_t execlp(const char*,const char*,...) __attribute__((alias("_execlp")));
extern intptr_t execlpe(const char*,const char*,...) __attribute__((alias("_execlpe")));
extern intptr_t spawnl(int,const char*,const char*,...) __attribute__((alias("_spawnl")));
extern intptr_t spawnle(int,const char*,const char*,...) __attribute__((alias("_spawnle")));
extern intptr_t spawnlp(int,const char*,const char*,...) __attribute__((alias("_spawnlp")));
extern intptr_t spawnlpe(int,const char*,const char*,...) __attribute__((alias("_spawnlpe")));
#else
#define execl _execl
#define execle _execle
......
......@@ -30,13 +30,39 @@ typedef unsigned short wchar_t;
#endif
#endif
#ifndef _INTPTR_T_DEFINED
#ifdef _WIN64
typedef __int64 intptr_t;
#else
typedef int intptr_t;
#endif
#define _INTPTR_T_DEFINED
#endif
#ifndef _UINTPTR_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 uintptr_t;
#else
typedef unsigned int uintptr_t;
#endif
#define _UINTPTR_T_DEFINED
#endif
#ifndef _PTRDIFF_T_DEFINED
#ifdef _WIN64
typedef __int64 ptrdiff_t;
#else
typedef int ptrdiff_t;
#endif
#define _PTRDIFF_T_DEFINED
#endif
#ifndef _SIZE_T_DEFINED
#ifdef _WIN64
typedef unsigned __int64 size_t;
#else
typedef unsigned int size_t;
#endif
#define _SIZE_T_DEFINED
#endif
......@@ -48,7 +74,11 @@ typedef unsigned int size_t;
#endif
#endif
#ifdef _WIN64
#define offsetof(s,m) (size_t)((ptrdiff_t)&(((s*)NULL)->m))
#else
#define offsetof(s,m) (size_t)&(((s*)NULL)->m)
#endif
#ifdef __cplusplus
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment