Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mariadb
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
mariadb
Commits
9ad3c1cd
Commit
9ad3c1cd
authored
Jun 03, 2003
by
hf@deer.(none)
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
SCRUM:
splittiln common client's parts
parent
02d3d7e8
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
43 additions
and
55 deletions
+43
-55
include/sql_common.h
include/sql_common.h
+0
-4
libmysql/client_settings.h
libmysql/client_settings.h
+0
-3
libmysql/libmysql.c
libmysql/libmysql.c
+1
-5
libmysqld/lib_sql.cc
libmysqld/lib_sql.cc
+1
-1
mysys/default.c
mysys/default.c
+0
-2
sql-common/client.c
sql-common/client.c
+32
-33
sql/client_settings.h
sql/client_settings.h
+7
-7
sql/repl_failsafe.cc
sql/repl_failsafe.cc
+1
-0
sql/slave.cc
sql/slave.cc
+1
-0
No files found.
include/sql_common.h
View file @
9ad3c1cd
...
@@ -15,9 +15,6 @@
...
@@ -15,9 +15,6 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef _sql_common_h
#define _sql_common_h
extern
const
char
*
unknown_sqlstate
;
extern
const
char
*
unknown_sqlstate
;
#ifdef __cplusplus
#ifdef __cplusplus
...
@@ -50,4 +47,3 @@ my_bool mysql_reconnect(MYSQL *mysql);
...
@@ -50,4 +47,3 @@ my_bool mysql_reconnect(MYSQL *mysql);
#define protocol_41(A) ((A)->server_capabilities & CLIENT_PROTOCOL_41)
#define protocol_41(A) ((A)->server_capabilities & CLIENT_PROTOCOL_41)
#endif
#endif
#endif
/* _sql_common_h */
libmysql/client_settings.h
View file @
9ad3c1cd
...
@@ -15,8 +15,6 @@
...
@@ -15,8 +15,6 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef _client_settings_h
#define _client_settings_h
static
my_bool
mysql_client_init
=
0
;
static
my_bool
mysql_client_init
=
0
;
extern
uint
mysql_port
;
extern
uint
mysql_port
;
extern
my_string
mysql_unix_port
;
extern
my_string
mysql_unix_port
;
...
@@ -58,4 +56,3 @@ my_bool send_file_to_server(MYSQL *mysql, const char *filename);
...
@@ -58,4 +56,3 @@ my_bool send_file_to_server(MYSQL *mysql, const char *filename);
#define set_sigpipe(mysql)
#define set_sigpipe(mysql)
#define reset_sigpipe(mysql)
#define reset_sigpipe(mysql)
#endif
#endif
#endif
/* _client_settings_h */
libmysql/libmysql.c
View file @
9ad3c1cd
...
@@ -99,7 +99,6 @@ TYPELIB sql_protocol_typelib = {array_elements(sql_protocol_names_lib)-1,"",
...
@@ -99,7 +99,6 @@ TYPELIB sql_protocol_typelib = {array_elements(sql_protocol_names_lib)-1,"",
be changed
be changed
*/
*/
#define MAX_LONG_DATA_LENGTH 8192
#define MAX_LONG_DATA_LENGTH 8192
/*#define protocol_41(A) ((A)->server_capabilities & CLIENT_PROTOCOL_41)*/
#define unsigned_field(A) ((A)->flags & UNSIGNED_FLAG)
#define unsigned_field(A) ((A)->flags & UNSIGNED_FLAG)
static
void
append_wild
(
char
*
to
,
char
*
end
,
const
char
*
wild
);
static
void
append_wild
(
char
*
to
,
char
*
end
,
const
char
*
wild
);
...
@@ -157,10 +156,6 @@ void STDCALL mysql_thread_end()
...
@@ -157,10 +156,6 @@ void STDCALL mysql_thread_end()
#define reset_sigpipe(mysql)
#define reset_sigpipe(mysql)
#endif
#endif
/* TO DELETE
#define _libmysql_c
#include "../sql-common/client.c"
*/
static
MYSQL
*
spawn_init
(
MYSQL
*
parent
,
const
char
*
host
,
static
MYSQL
*
spawn_init
(
MYSQL
*
parent
,
const
char
*
host
,
unsigned
int
port
,
unsigned
int
port
,
const
char
*
user
,
const
char
*
user
,
...
@@ -987,6 +982,7 @@ mysql_query(MYSQL *mysql, const char *query)
...
@@ -987,6 +982,7 @@ mysql_query(MYSQL *mysql, const char *query)
return
mysql_real_query
(
mysql
,
query
,
(
uint
)
strlen
(
query
));
return
mysql_real_query
(
mysql
,
query
,
(
uint
)
strlen
(
query
));
}
}
static
MYSQL
*
spawn_init
(
MYSQL
*
parent
,
const
char
*
host
,
static
MYSQL
*
spawn_init
(
MYSQL
*
parent
,
const
char
*
host
,
unsigned
int
port
,
const
char
*
user
,
unsigned
int
port
,
const
char
*
user
,
const
char
*
passwd
)
const
char
*
passwd
)
...
...
libmysqld/lib_sql.cc
View file @
9ad3c1cd
...
@@ -183,7 +183,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
...
@@ -183,7 +183,7 @@ int STDCALL mysql_server_init(int argc, char **argv, char **groups)
MY_INIT
((
char
*
)
"mysql_embedded"
);
// init my_sys library & pthreads
MY_INIT
((
char
*
)
"mysql_embedded"
);
// init my_sys library & pthreads
}
}
if
(
init_common_variables
(
"my"
,
argc
,
argv
,
(
const
char
**
)
groups
))
if
(
init_common_variables
(
"my"
,
*
argcp
,
*
argvp
,
(
const
char
**
)
groups
))
{
{
mysql_server_end
();
mysql_server_end
();
return
1
;
return
1
;
...
...
mysys/default.c
View file @
9ad3c1cd
...
@@ -174,8 +174,6 @@ void load_defaults(const char *conf_file, const char **groups,
...
@@ -174,8 +174,6 @@ void load_defaults(const char *conf_file, const char **groups,
res
=
(
char
**
)
(
ptr
+
sizeof
(
alloc
));
res
=
(
char
**
)
(
ptr
+
sizeof
(
alloc
));
/* copy name + found arguments + command line arguments to new array */
/* copy name + found arguments + command line arguments to new array */
res
[
0
]
=*
argc
?
argv
[
0
][
0
]
:
(
char
*
)
""
;
memcpy
((
gptr
)
(
res
+
1
),
args
.
buffer
,
args
.
elements
*
sizeof
(
char
*
));
memcpy
((
gptr
)
(
res
+
1
),
args
.
buffer
,
args
.
elements
*
sizeof
(
char
*
));
/* Skipp --defaults-file and --defaults-extra-file */
/* Skipp --defaults-file and --defaults-extra-file */
(
*
argc
)
-=
args_used
;
(
*
argc
)
-=
args_used
;
...
...
sql-common/client.c
View file @
9ad3c1cd
...
@@ -14,6 +14,27 @@
...
@@ -14,6 +14,27 @@
along with this program; if not, write to the Free Software
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
/*
This file is included by both libmysql.c (the MySQL client C API)
and the mysqld server to connect to another MYSQL server.
The differences for the two cases are:
- Things that only works for the client:
- Trying to automaticly determinate user name if not supplied to
mysql_real_connect()
- Support for reading local file with LOAD DATA LOCAL
- SHARED memory handling
- Protection against sigpipe
- Prepared statements
- Things that only works for the server
- Alarm handling on connect
In all other cases, the code should be idential for the client and
server.
*/
#include <my_global.h>
#include <my_global.h>
#if defined(MYSQL_SERVER) || defined(HAVE_EXTERNAL_CLIENT)
#if defined(MYSQL_SERVER) || defined(HAVE_EXTERNAL_CLIENT)
...
@@ -207,10 +228,8 @@ HANDLE create_named_pipe(NET *net, uint connect_timeout, char **arg_host,
...
@@ -207,10 +228,8 @@ HANDLE create_named_pipe(NET *net, uint connect_timeout, char **arg_host,
my_bool
testing_named_pipes
=
0
;
my_bool
testing_named_pipes
=
0
;
char
*
host
=
*
arg_host
,
*
unix_socket
=
*
arg_unix_socket
;
char
*
host
=
*
arg_host
,
*
unix_socket
=
*
arg_unix_socket
;
#ifdef MYSQL_CLIENT
if
(
!
unix_socket
||
(
unix_socket
)[
0
]
==
0x00
)
if
(
!
unix_socket
||
(
unix_socket
)[
0
]
==
0x00
)
unix_socket
=
mysql_unix_port
;
unix_socket
=
mysql_unix_port
;
#endif
if
(
!
host
||
!
strcmp
(
host
,
LOCAL_HOST
))
if
(
!
host
||
!
strcmp
(
host
,
LOCAL_HOST
))
host
=
LOCAL_HOST_NAMEDPIPE
;
host
=
LOCAL_HOST_NAMEDPIPE
;
...
@@ -1285,7 +1304,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
...
@@ -1285,7 +1304,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
/*
/*
Grab a socket and connect it to the server
Grab a socket and connect it to the server
*/
*/
#if
defined(MYSQL_CLIENT) && defined(HAVE_SMEM)
#if
def HAVE_SMEM
if
((
!
mysql
->
options
.
protocol
||
if
((
!
mysql
->
options
.
protocol
||
mysql
->
options
.
protocol
==
MYSQL_PROTOCOL_MEMORY
)
&&
mysql
->
options
.
protocol
==
MYSQL_PROTOCOL_MEMORY
)
&&
(
!
host
||
!
strcmp
(
host
,
LOCAL_HOST
)))
(
!
host
||
!
strcmp
(
host
,
LOCAL_HOST
)))
...
@@ -1314,22 +1333,14 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
...
@@ -1314,22 +1333,14 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
}
else
}
else
#endif
/* HAVE_SMEM */
#endif
/* HAVE_SMEM */
#if defined(HAVE_SYS_UN_H)
#if defined(HAVE_SYS_UN_H)
if
(
if
((
!
mysql
->
options
.
protocol
||
#ifdef MYSQL_CLIENT
(
!
mysql
->
options
.
protocol
||
mysql
->
options
.
protocol
==
MYSQL_PROTOCOL_SOCKET
)
&&
mysql
->
options
.
protocol
==
MYSQL_PROTOCOL_SOCKET
)
&&
(
unix_socket
||
mysql_unix_port
)
&&
(
unix_socket
||
mysql_unix_port
)
&&
#endif
#ifdef MYSQL_SERVER
unix_socket
&&
#endif
(
!
host
||
!
strcmp
(
host
,
LOCAL_HOST
)))
(
!
host
||
!
strcmp
(
host
,
LOCAL_HOST
)))
{
{
host
=
LOCAL_HOST
;
host
=
LOCAL_HOST
;
#ifdef MYSQL_CLIENT
if
(
!
unix_socket
)
if
(
!
unix_socket
)
unix_socket
=
mysql_unix_port
;
unix_socket
=
mysql_unix_port
;
#endif
host_info
=
(
char
*
)
ER
(
CR_LOCALHOST_CONNECTION
);
host_info
=
(
char
*
)
ER
(
CR_LOCALHOST_CONNECTION
);
DBUG_PRINT
(
"info"
,(
"Using UNIX sock '%s'"
,
unix_socket
));
DBUG_PRINT
(
"info"
,(
"Using UNIX sock '%s'"
,
unix_socket
));
if
((
sock
=
socket
(
AF_UNIX
,
SOCK_STREAM
,
0
))
==
SOCKET_ERROR
)
if
((
sock
=
socket
(
AF_UNIX
,
SOCK_STREAM
,
0
))
==
SOCKET_ERROR
)
...
@@ -1361,18 +1372,11 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
...
@@ -1361,18 +1372,11 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
else
else
#elif defined(__WIN__)
#elif defined(__WIN__)
{
{
#ifdef MYSQL_CLIENT
if
((
!
mysql
->
options
.
protocol
||
if
((
!
mysql
->
options
.
protocol
||
mysql
->
options
.
protocol
==
MYSQL_PROTOCOL_PIPE
)
&&
mysql
->
options
.
protocol
==
MYSQL_PROTOCOL_PIPE
)
&&
((
unix_socket
||
!
host
&&
is_NT
()
||
((
unix_socket
||
!
host
&&
is_NT
()
||
host
&&
!
strcmp
(
host
,
LOCAL_HOST_NAMEDPIPE
)
||!
have_tcpip
))
&&
host
&&
!
strcmp
(
host
,
LOCAL_HOST_NAMEDPIPE
)
||!
have_tcpip
))
&&
(
!
net
->
vio
))
(
!
net
->
vio
))
#elif MYSQL_SERVER
if
((
unix_socket
||
!
host
&&
is_NT
()
||
host
&&
!
strcmp
(
host
,
LOCAL_HOST_NAMEDPIPE
)
||
mysql
->
options
.
named_pipe
||
!
have_tcpip
))
#endif
{
{
sock
=
0
;
sock
=
0
;
if
((
hPipe
=
create_named_pipe
(
net
,
mysql
->
options
.
connect_timeout
,
if
((
hPipe
=
create_named_pipe
(
net
,
mysql
->
options
.
connect_timeout
,
...
@@ -1408,10 +1412,8 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
...
@@ -1408,10 +1412,8 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
#endif
#endif
{
{
unix_socket
=
0
;
/* This is not used */
unix_socket
=
0
;
/* This is not used */
#ifdef MYSQL_CLIENT
if
(
!
port
)
if
(
!
port
)
port
=
mysql_port
;
port
=
mysql_port
;
#endif
if
(
!
host
)
if
(
!
host
)
host
=
LOCAL_HOST
;
host
=
LOCAL_HOST
;
sprintf
(
host_info
=
buff
,
ER
(
CR_TCP_CONNECTION
),
host
);
sprintf
(
host_info
=
buff
,
ER
(
CR_TCP_CONNECTION
),
host
);
...
@@ -1859,24 +1861,26 @@ error:
...
@@ -1859,24 +1861,26 @@ error:
/* needed when we move MYSQL structure to a different address */
/* needed when we move MYSQL structure to a different address */
#ifdef MYSQL_CLIENT
/*should work in MYSQL_SERVER also, but doesn't */
static
void
mysql_fix_pointers
(
MYSQL
*
mysql
,
MYSQL
*
old_mysql
)
static
void
mysql_fix_pointers
(
MYSQL
*
mysql
,
MYSQL
*
old_mysql
)
{
{
MYSQL
*
tmp
,
*
tmp_prev
;
if
(
mysql
->
master
==
old_mysql
)
if
(
mysql
->
master
==
old_mysql
)
mysql
->
master
=
mysql
;
mysql
->
master
=
mysql
;
if
(
mysql
->
last_used_con
==
old_mysql
)
if
(
mysql
->
last_used_con
==
old_mysql
)
mysql
->
last_used_con
=
mysql
;
mysql
->
last_used_con
=
mysql
;
if
(
mysql
->
last_used_slave
==
old_mysql
)
if
(
mysql
->
last_used_slave
==
old_mysql
)
mysql
->
last_used_slave
=
mysql
;
mysql
->
last_used_slave
=
mysql
;
for
(
tmp_prev
=
mysql
,
tmp
=
mysql
->
next_slave
;
#ifdef MYSQL_CLIENT
/*should work in MYSQL_SERVER also, but doesn't */
tmp
!=
old_mysql
;
tmp
=
tmp
->
next_slave
)
{
{
tmp_prev
=
tmp
;
MYSQL
*
tmp
,
*
tmp_prev
;
for
(
tmp_prev
=
mysql
,
tmp
=
mysql
->
next_slave
;
tmp
!=
old_mysql
;
tmp
=
tmp
->
next_slave
)
{
tmp_prev
=
tmp
;
}
tmp_prev
->
next_slave
=
mysql
;
}
}
tmp_prev
->
next_slave
=
mysql
;
}
#endif
/*MYSQL_CLIENT*/
#endif
/*MYSQL_CLIENT*/
}
my_bool
mysql_reconnect
(
MYSQL
*
mysql
)
my_bool
mysql_reconnect
(
MYSQL
*
mysql
)
{
{
...
@@ -1897,9 +1901,6 @@ my_bool mysql_reconnect(MYSQL *mysql)
...
@@ -1897,9 +1901,6 @@ my_bool mysql_reconnect(MYSQL *mysql)
tmp_mysql
.
options
=
mysql
->
options
;
tmp_mysql
.
options
=
mysql
->
options
;
bzero
((
char
*
)
&
mysql
->
options
,
sizeof
(
mysql
->
options
));
bzero
((
char
*
)
&
mysql
->
options
,
sizeof
(
mysql
->
options
));
tmp_mysql
.
rpl_pivot
=
mysql
->
rpl_pivot
;
tmp_mysql
.
rpl_pivot
=
mysql
->
rpl_pivot
;
#ifdef MYSQL_SERVER
mysql_options
(
mysql
,
MYSQL_OPT_CONNECT_TIMEOUT
,
(
char
*
)
&
mysql
->
net
.
read_timeout
);
#endif
if
(
!
mysql_real_connect
(
&
tmp_mysql
,
mysql
->
host
,
mysql
->
user
,
mysql
->
passwd
,
if
(
!
mysql_real_connect
(
&
tmp_mysql
,
mysql
->
host
,
mysql
->
user
,
mysql
->
passwd
,
mysql
->
db
,
mysql
->
port
,
mysql
->
unix_socket
,
mysql
->
db
,
mysql
->
port
,
mysql
->
unix_socket
,
mysql
->
client_flag
))
mysql
->
client_flag
))
...
@@ -1913,9 +1914,7 @@ my_bool mysql_reconnect(MYSQL *mysql)
...
@@ -1913,9 +1914,7 @@ my_bool mysql_reconnect(MYSQL *mysql)
mysql
->
free_me
=
0
;
mysql
->
free_me
=
0
;
mysql_close
(
mysql
);
mysql_close
(
mysql
);
*
mysql
=
tmp_mysql
;
*
mysql
=
tmp_mysql
;
#ifdef MYSQL_CLIENT
/*rpl000010 fails if #ifdef-s were removed*/
mysql_fix_pointers
(
mysql
,
&
tmp_mysql
);
/* adjust connection pointers */
mysql_fix_pointers
(
mysql
,
&
tmp_mysql
);
/* adjust connection pointers */
#endif
net_clear
(
&
mysql
->
net
);
net_clear
(
&
mysql
->
net
);
mysql
->
affected_rows
=
~
(
my_ulonglong
)
0
;
mysql
->
affected_rows
=
~
(
my_ulonglong
)
0
;
DBUG_RETURN
(
0
);
DBUG_RETURN
(
0
);
...
...
sql/client_settings.h
View file @
9ad3c1cd
...
@@ -15,19 +15,19 @@
...
@@ -15,19 +15,19 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
#ifndef _client_settings_h
#define _client_settings_h
#include <thr_alarm.h>
#include <thr_alarm.h>
#include <mysql_embed.h>
#include <mysql_com.h>
extern
char
*
mysql_unix_port
;
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG
|
\
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG
\
CLIENT_LOCAL_FILES | CLIENT_SECURE_CONNECTION)
|
CLIENT_LOCAL_FILES | CLIENT_SECURE_CONNECTION)
extern
ulong
slave_net_timeout
;
extern
ulong
slave_net_timeout
;
#define init_sigpipe_variables
#define init_sigpipe_variables
#define set_sigpipe(mysql)
#define set_sigpipe(mysql)
#define reset_sigpipe(mysql)
#define reset_sigpipe(mysql)
#endif
/* _client_settings_h */
#ifdef HAVE_SMEM
#undef HAVE_SMEM
#endif
sql/repl_failsafe.cc
View file @
9ad3c1cd
...
@@ -669,6 +669,7 @@ int connect_to_master(THD *thd, MYSQL* mysql, MASTER_INFO* mi)
...
@@ -669,6 +669,7 @@ int connect_to_master(THD *thd, MYSQL* mysql, MASTER_INFO* mi)
DBUG_RETURN
(
1
);
DBUG_RETURN
(
1
);
}
}
mysql_options
(
mysql
,
MYSQL_OPT_CONNECT_TIMEOUT
,
(
char
*
)
&
slave_net_timeout
);
mysql_options
(
mysql
,
MYSQL_OPT_CONNECT_TIMEOUT
,
(
char
*
)
&
slave_net_timeout
);
mysql_options
(
mysql
,
MYSQL_SET_CHARSET_NAME
,
(
char
*
)
default_charset_info
);
if
(
!
mysql_real_connect
(
mysql
,
mi
->
host
,
mi
->
user
,
mi
->
password
,
0
,
if
(
!
mysql_real_connect
(
mysql
,
mi
->
host
,
mi
->
user
,
mi
->
password
,
0
,
mi
->
port
,
0
,
0
))
mi
->
port
,
0
,
0
))
DBUG_RETURN
(
1
);
DBUG_RETURN
(
1
);
...
...
sql/slave.cc
View file @
9ad3c1cd
...
@@ -2950,6 +2950,7 @@ static int connect_to_master(THD* thd, MYSQL* mysql, MASTER_INFO* mi,
...
@@ -2950,6 +2950,7 @@ static int connect_to_master(THD* thd, MYSQL* mysql, MASTER_INFO* mi,
(
reconnect
?
mysql_reconnect
(
mysql
)
!=
0
:
(
reconnect
?
mysql_reconnect
(
mysql
)
!=
0
:
!
(
mysql_options
(
mysql
,
MYSQL_OPT_CONNECT_TIMEOUT
,
!
(
mysql_options
(
mysql
,
MYSQL_OPT_CONNECT_TIMEOUT
,
(
char
*
)
&
thd
->
variables
.
net_read_timeout
),
(
char
*
)
&
thd
->
variables
.
net_read_timeout
),
mysql_options
(
mysql
,
MYSQL_SET_CHARSET_NAME
,
(
char
*
)
default_charset_info
),
mysql_real_connect
(
mysql
,
mi
->
host
,
mi
->
user
,
mi
->
password
,
0
,
mysql_real_connect
(
mysql
,
mi
->
host
,
mi
->
user
,
mi
->
password
,
0
,
mi
->
port
,
0
,
client_flag
))))
mi
->
port
,
0
,
client_flag
))))
{
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment