Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
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
nexedi
linux
Commits
56e41d3c
Commit
56e41d3c
authored
Jan 21, 2013
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
merge compat sys_ipc instances
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
d5dc77bf
Changes
15
Hide whitespace changes
Inline
Side-by-side
Showing
15 changed files
with
52 additions
and
315 deletions
+52
-315
arch/mips/kernel/linux32.c
arch/mips/kernel/linux32.c
+0
-69
arch/mips/kernel/scall64-o32.S
arch/mips/kernel/scall64-o32.S
+1
-1
arch/powerpc/kernel/sys_ppc32.c
arch/powerpc/kernel/sys_ppc32.c
+0
-67
arch/s390/kernel/compat_linux.c
arch/s390/kernel/compat_linux.c
+3
-41
arch/s390/kernel/compat_linux.h
arch/s390/kernel/compat_linux.h
+0
-1
arch/s390/kernel/compat_wrapper.S
arch/s390/kernel/compat_wrapper.S
+0
-8
arch/s390/kernel/syscalls.S
arch/s390/kernel/syscalls.S
+1
-1
arch/sparc/kernel/sys_sparc32.c
arch/sparc/kernel/sys_sparc32.c
+0
-65
arch/x86/ia32/Makefile
arch/x86/ia32/Makefile
+0
-3
arch/x86/ia32/ipc32.c
arch/x86/ia32/ipc32.c
+0
-54
arch/x86/include/asm/sys_ia32.h
arch/x86/include/asm/sys_ia32.h
+0
-3
arch/x86/syscalls/syscall_32.tbl
arch/x86/syscalls/syscall_32.tbl
+1
-1
include/linux/compat.h
include/linux/compat.h
+1
-0
ipc/compat.c
ipc/compat.c
+44
-0
kernel/sys_ni.c
kernel/sys_ni.c
+1
-1
No files found.
arch/mips/kernel/linux32.c
View file @
56e41d3c
...
...
@@ -119,75 +119,6 @@ SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf,
return
sys_pwrite64
(
fd
,
buf
,
count
,
merge_64
(
a4
,
a5
));
}
#ifdef CONFIG_SYSVIPC
SYSCALL_DEFINE6
(
32
_ipc
,
u32
,
call
,
long
,
first
,
long
,
second
,
long
,
third
,
unsigned
long
,
ptr
,
unsigned
long
,
fifth
)
{
int
version
,
err
;
version
=
call
>>
16
;
/* hack for backward compatibility */
call
&=
0xffff
;
switch
(
call
)
{
case
SEMOP
:
/* struct sembuf is the same on 32 and 64bit :)) */
err
=
sys_semtimedop
(
first
,
compat_ptr
(
ptr
),
second
,
NULL
);
break
;
case
SEMTIMEDOP
:
err
=
compat_sys_semtimedop
(
first
,
compat_ptr
(
ptr
),
second
,
compat_ptr
(
fifth
));
break
;
case
SEMGET
:
err
=
sys_semget
(
first
,
second
,
third
);
break
;
case
SEMCTL
:
err
=
compat_sys_semctl
(
first
,
second
,
third
,
compat_ptr
(
ptr
));
break
;
case
MSGSND
:
err
=
compat_sys_msgsnd
(
first
,
second
,
third
,
compat_ptr
(
ptr
));
break
;
case
MSGRCV
:
err
=
compat_sys_msgrcv
(
first
,
second
,
fifth
,
third
,
version
,
compat_ptr
(
ptr
));
break
;
case
MSGGET
:
err
=
sys_msgget
((
key_t
)
first
,
second
);
break
;
case
MSGCTL
:
err
=
compat_sys_msgctl
(
first
,
second
,
compat_ptr
(
ptr
));
break
;
case
SHMAT
:
err
=
compat_sys_shmat
(
first
,
second
,
third
,
version
,
compat_ptr
(
ptr
));
break
;
case
SHMDT
:
err
=
sys_shmdt
(
compat_ptr
(
ptr
));
break
;
case
SHMGET
:
err
=
sys_shmget
(
first
,
(
unsigned
)
second
,
third
);
break
;
case
SHMCTL
:
err
=
compat_sys_shmctl
(
first
,
second
,
compat_ptr
(
ptr
));
break
;
default:
err
=
-
EINVAL
;
break
;
}
return
err
;
}
#else
SYSCALL_DEFINE6
(
32
_ipc
,
u32
,
call
,
int
,
first
,
int
,
second
,
int
,
third
,
u32
,
ptr
,
u32
,
fifth
)
{
return
-
ENOSYS
;
}
#endif
/* CONFIG_SYSVIPC */
#ifdef CONFIG_MIPS32_N32
SYSCALL_DEFINE4
(
n32_semctl
,
int
,
semid
,
int
,
semnum
,
int
,
cmd
,
u32
,
arg
)
{
...
...
arch/mips/kernel/scall64-o32.S
View file @
56e41d3c
...
...
@@ -309,7 +309,7 @@ sys_call_table:
PTR
compat_sys_wait4
PTR
sys_swapoff
/*
4115
*/
PTR
compat_sys_sysinfo
PTR
sys_32
_ipc
PTR
compat_sys
_ipc
PTR
sys_fsync
PTR
sys32_sigreturn
PTR
__sys_clone
/*
4120
*/
...
...
arch/powerpc/kernel/sys_ppc32.c
View file @
56e41d3c
...
...
@@ -61,73 +61,6 @@ asmlinkage long ppc32_select(u32 n, compat_ulong_t __user *inp,
return
compat_sys_select
((
int
)
n
,
inp
,
outp
,
exp
,
compat_ptr
(
tvp_x
));
}
#ifdef CONFIG_SYSVIPC
long
compat_sys_ipc
(
u32
call
,
u32
first
,
u32
second
,
u32
third
,
compat_uptr_t
ptr
,
u32
fifth
)
{
int
version
;
version
=
call
>>
16
;
/* hack for backward compatibility */
call
&=
0xffff
;
switch
(
call
)
{
case
SEMTIMEDOP
:
if
(
fifth
)
/* sign extend semid */
return
compat_sys_semtimedop
((
int
)
first
,
compat_ptr
(
ptr
),
second
,
compat_ptr
(
fifth
));
/* else fall through for normal semop() */
case
SEMOP
:
/* struct sembuf is the same on 32 and 64bit :)) */
/* sign extend semid */
return
sys_semtimedop
((
int
)
first
,
compat_ptr
(
ptr
),
second
,
NULL
);
case
SEMGET
:
/* sign extend key, nsems */
return
sys_semget
((
int
)
first
,
(
int
)
second
,
third
);
case
SEMCTL
:
/* sign extend semid, semnum */
return
compat_sys_semctl
((
int
)
first
,
(
int
)
second
,
third
,
compat_ptr
(
ptr
));
case
MSGSND
:
/* sign extend msqid */
return
compat_sys_msgsnd
((
int
)
first
,
(
int
)
second
,
third
,
compat_ptr
(
ptr
));
case
MSGRCV
:
/* sign extend msqid, msgtyp */
return
compat_sys_msgrcv
((
int
)
first
,
second
,
(
int
)
fifth
,
third
,
version
,
compat_ptr
(
ptr
));
case
MSGGET
:
/* sign extend key */
return
sys_msgget
((
int
)
first
,
second
);
case
MSGCTL
:
/* sign extend msqid */
return
compat_sys_msgctl
((
int
)
first
,
second
,
compat_ptr
(
ptr
));
case
SHMAT
:
/* sign extend shmid */
return
compat_sys_shmat
((
int
)
first
,
second
,
third
,
version
,
compat_ptr
(
ptr
));
case
SHMDT
:
return
sys_shmdt
(
compat_ptr
(
ptr
));
case
SHMGET
:
/* sign extend key_t */
return
sys_shmget
((
int
)
first
,
second
,
third
);
case
SHMCTL
:
/* sign extend shmid */
return
compat_sys_shmctl
((
int
)
first
,
second
,
compat_ptr
(
ptr
));
default:
return
-
ENOSYS
;
}
return
-
ENOSYS
;
}
#endif
unsigned
long
compat_sys_mmap2
(
unsigned
long
addr
,
size_t
len
,
unsigned
long
prot
,
unsigned
long
flags
,
unsigned
long
fd
,
unsigned
long
pgoff
)
...
...
arch/s390/kernel/compat_linux.c
View file @
56e41d3c
...
...
@@ -288,51 +288,13 @@ asmlinkage long sys32_getegid16(void)
return
high2lowgid
(
from_kgid_munged
(
current_user_ns
(),
current_egid
()));
}
/*
* sys32_ipc() is the de-multiplexer for the SysV IPC calls in 32bit emulation.
*
* This is really horribly ugly.
*/
#ifdef CONFIG_SYSVIPC
asmlinkage
long
sys32_ipc
(
u32
call
,
int
first
,
int
second
,
int
third
,
u32
ptr
)
COMPAT_SYSCALL_DEFINE5
(
s390_ipc
,
uint
,
call
,
int
,
first
,
unsigned
long
,
second
,
unsigned
long
,
third
,
compat_uptr_t
,
ptr
)
{
if
(
call
>>
16
)
/* hack for backward compatibility */
return
-
EINVAL
;
switch
(
call
)
{
case
SEMTIMEDOP
:
return
compat_sys_semtimedop
(
first
,
compat_ptr
(
ptr
),
second
,
compat_ptr
(
third
));
case
SEMOP
:
/* struct sembuf is the same on 32 and 64bit :)) */
return
sys_semtimedop
(
first
,
compat_ptr
(
ptr
),
second
,
NULL
);
case
SEMGET
:
return
sys_semget
(
first
,
second
,
third
);
case
SEMCTL
:
return
compat_sys_semctl
(
first
,
second
,
third
,
compat_ptr
(
ptr
));
case
MSGSND
:
return
compat_sys_msgsnd
(
first
,
second
,
third
,
compat_ptr
(
ptr
));
case
MSGRCV
:
return
compat_sys_msgrcv
(
first
,
second
,
0
,
third
,
0
,
compat_ptr
(
ptr
));
case
MSGGET
:
return
sys_msgget
((
key_t
)
first
,
second
);
case
MSGCTL
:
return
compat_sys_msgctl
(
first
,
second
,
compat_ptr
(
ptr
));
case
SHMAT
:
return
compat_sys_shmat
(
first
,
second
,
third
,
0
,
compat_ptr
(
ptr
));
case
SHMDT
:
return
sys_shmdt
(
compat_ptr
(
ptr
));
case
SHMGET
:
return
sys_shmget
(
first
,
(
unsigned
)
second
,
third
);
case
SHMCTL
:
return
compat_sys_shmctl
(
first
,
second
,
compat_ptr
(
ptr
));
}
return
-
ENOSYS
;
return
compat_sys_ipc
(
call
,
first
,
second
,
third
,
ptr
,
third
);
}
#endif
...
...
arch/s390/kernel/compat_linux.h
View file @
56e41d3c
...
...
@@ -94,7 +94,6 @@ long sys32_getuid16(void);
long
sys32_geteuid16
(
void
);
long
sys32_getgid16
(
void
);
long
sys32_getegid16
(
void
);
long
sys32_ipc
(
u32
call
,
int
first
,
int
second
,
int
third
,
u32
ptr
);
long
sys32_truncate64
(
const
char
__user
*
path
,
unsigned
long
high
,
unsigned
long
low
);
long
sys32_ftruncate64
(
unsigned
int
fd
,
unsigned
long
high
,
unsigned
long
low
);
...
...
arch/s390/kernel/compat_wrapper.S
View file @
56e41d3c
...
...
@@ -388,14 +388,6 @@ ENTRY(compat_sys_sysinfo_wrapper)
llgtr
%
r2
,%
r2
#
struct
sysinfo_emu31
*
jg
compat_sys_sysinfo
#
branch
to
system
call
ENTRY
(
sys32_ipc_wrapper
)
llgfr
%
r2
,%
r2
#
uint
lgfr
%
r3
,%
r3
#
int
lgfr
%
r4
,%
r4
#
int
lgfr
%
r5
,%
r5
#
int
llgfr
%
r6
,%
r6
#
u32
jg
sys32_ipc
#
branch
to
system
call
ENTRY
(
sys32_fsync_wrapper
)
llgfr
%
r2
,%
r2
#
unsigned
int
jg
sys_fsync
#
branch
to
system
call
...
...
arch/s390/kernel/syscalls.S
View file @
56e41d3c
...
...
@@ -125,7 +125,7 @@ NI_SYSCALL /* vm86old for i386 */
SYSCALL
(
sys_wait4
,
sys_wait4
,
compat_sys_wait4
)
SYSCALL
(
sys_swapoff
,
sys_swapoff
,
sys32_swapoff_wrapper
)
/
*
115
*/
SYSCALL
(
sys_sysinfo
,
sys_sysinfo
,
compat_sys_sysinfo_wrapper
)
SYSCALL
(
sys_s390_ipc
,
sys_s390_ipc
,
sys32_ipc_wrapper
)
SYSCALL
(
sys_s390_ipc
,
sys_s390_ipc
,
compat_sys_s390_ipc
)
SYSCALL
(
sys_fsync
,
sys_fsync
,
sys32_fsync_wrapper
)
SYSCALL
(
sys_sigreturn
,
sys_sigreturn
,
sys32_sigreturn
)
SYSCALL
(
sys_clone
,
sys_clone
,
sys_clone_wrapper
)
/
*
120
*/
...
...
arch/sparc/kernel/sys_sparc32.c
View file @
56e41d3c
...
...
@@ -49,71 +49,6 @@
#include <asm/mmu_context.h>
#include <asm/compat_signal.h>
#ifdef CONFIG_SYSVIPC
asmlinkage
long
compat_sys_ipc
(
u32
call
,
u32
first
,
u32
second
,
u32
third
,
compat_uptr_t
ptr
,
u32
fifth
)
{
int
version
;
version
=
call
>>
16
;
/* hack for backward compatibility */
call
&=
0xffff
;
switch
(
call
)
{
case
SEMTIMEDOP
:
if
(
fifth
)
/* sign extend semid */
return
compat_sys_semtimedop
((
int
)
first
,
compat_ptr
(
ptr
),
second
,
compat_ptr
(
fifth
));
/* else fall through for normal semop() */
case
SEMOP
:
/* struct sembuf is the same on 32 and 64bit :)) */
/* sign extend semid */
return
sys_semtimedop
((
int
)
first
,
compat_ptr
(
ptr
),
second
,
NULL
);
case
SEMGET
:
/* sign extend key, nsems */
return
sys_semget
((
int
)
first
,
(
int
)
second
,
third
);
case
SEMCTL
:
/* sign extend semid, semnum */
return
compat_sys_semctl
((
int
)
first
,
(
int
)
second
,
third
,
compat_ptr
(
ptr
));
case
MSGSND
:
/* sign extend msqid */
return
compat_sys_msgsnd
((
int
)
first
,
(
int
)
second
,
third
,
compat_ptr
(
ptr
));
case
MSGRCV
:
/* sign extend msqid, msgtyp */
return
compat_sys_msgrcv
((
int
)
first
,
second
,
(
int
)
fifth
,
third
,
version
,
compat_ptr
(
ptr
));
case
MSGGET
:
/* sign extend key */
return
sys_msgget
((
int
)
first
,
second
);
case
MSGCTL
:
/* sign extend msqid */
return
compat_sys_msgctl
((
int
)
first
,
second
,
compat_ptr
(
ptr
));
case
SHMAT
:
/* sign extend shmid */
return
compat_sys_shmat
((
int
)
first
,
second
,
third
,
version
,
compat_ptr
(
ptr
));
case
SHMDT
:
return
sys_shmdt
(
compat_ptr
(
ptr
));
case
SHMGET
:
/* sign extend key_t */
return
sys_shmget
((
int
)
first
,
second
,
third
);
case
SHMCTL
:
/* sign extend shmid */
return
compat_sys_shmctl
((
int
)
first
,
second
,
compat_ptr
(
ptr
));
default:
return
-
ENOSYS
;
}
return
-
ENOSYS
;
}
#endif
asmlinkage
long
sys32_truncate64
(
const
char
__user
*
path
,
unsigned
long
high
,
unsigned
long
low
)
{
if
((
int
)
high
<
0
)
...
...
arch/x86/ia32/Makefile
View file @
56e41d3c
...
...
@@ -5,9 +5,6 @@
obj-$(CONFIG_IA32_EMULATION)
:=
ia32entry.o sys_ia32.o ia32_signal.o
obj-$(CONFIG_IA32_EMULATION)
+=
nosyscall.o syscall_ia32.o
sysv-$(CONFIG_SYSVIPC)
:=
ipc32.o
obj-$(CONFIG_IA32_EMULATION)
+=
$
(
sysv-y
)
obj-$(CONFIG_IA32_AOUT)
+=
ia32_aout.o
audit-class-$(CONFIG_AUDIT)
:=
audit.o
...
...
arch/x86/ia32/ipc32.c
deleted
100644 → 0
View file @
d5dc77bf
#include <linux/kernel.h>
#include <linux/spinlock.h>
#include <linux/list.h>
#include <linux/syscalls.h>
#include <linux/time.h>
#include <linux/sem.h>
#include <linux/msg.h>
#include <linux/shm.h>
#include <linux/ipc.h>
#include <linux/compat.h>
#include <asm/sys_ia32.h>
asmlinkage
long
sys32_ipc
(
u32
call
,
int
first
,
int
second
,
int
third
,
compat_uptr_t
ptr
,
u32
fifth
)
{
int
version
;
version
=
call
>>
16
;
/* hack for backward compatibility */
call
&=
0xffff
;
switch
(
call
)
{
case
SEMOP
:
/* struct sembuf is the same on 32 and 64bit :)) */
return
sys_semtimedop
(
first
,
compat_ptr
(
ptr
),
second
,
NULL
);
case
SEMTIMEDOP
:
return
compat_sys_semtimedop
(
first
,
compat_ptr
(
ptr
),
second
,
compat_ptr
(
fifth
));
case
SEMGET
:
return
sys_semget
(
first
,
second
,
third
);
case
SEMCTL
:
return
compat_sys_semctl
(
first
,
second
,
third
,
compat_ptr
(
ptr
));
case
MSGSND
:
return
compat_sys_msgsnd
(
first
,
second
,
third
,
compat_ptr
(
ptr
));
case
MSGRCV
:
return
compat_sys_msgrcv
(
first
,
second
,
fifth
,
third
,
version
,
compat_ptr
(
ptr
));
case
MSGGET
:
return
sys_msgget
((
key_t
)
first
,
second
);
case
MSGCTL
:
return
compat_sys_msgctl
(
first
,
second
,
compat_ptr
(
ptr
));
case
SHMAT
:
return
compat_sys_shmat
(
first
,
second
,
third
,
version
,
compat_ptr
(
ptr
));
case
SHMDT
:
return
sys_shmdt
(
compat_ptr
(
ptr
));
case
SHMGET
:
return
sys_shmget
(
first
,
(
unsigned
)
second
,
third
);
case
SHMCTL
:
return
compat_sys_shmctl
(
first
,
second
,
compat_ptr
(
ptr
));
}
return
-
ENOSYS
;
}
arch/x86/include/asm/sys_ia32.h
View file @
56e41d3c
...
...
@@ -57,9 +57,6 @@ asmlinkage long sys32_fallocate(int, int, unsigned,
asmlinkage
long
sys32_sigreturn
(
void
);
asmlinkage
long
sys32_rt_sigreturn
(
void
);
/* ia32/ipc32.c */
asmlinkage
long
sys32_ipc
(
u32
,
int
,
int
,
int
,
compat_uptr_t
,
u32
);
asmlinkage
long
sys32_fanotify_mark
(
int
,
unsigned
int
,
u32
,
u32
,
int
,
const
char
__user
*
);
...
...
arch/x86/syscalls/syscall_32.tbl
View file @
56e41d3c
...
...
@@ -123,7 +123,7 @@
114 i386 wait4 sys_wait4 compat_sys_wait4
115 i386 swapoff sys_swapoff
116 i386 sysinfo sys_sysinfo compat_sys_sysinfo
117 i386 ipc sys_ipc
sys32
_ipc
117 i386 ipc sys_ipc
compat_sys
_ipc
118 i386 fsync sys_fsync
119 i386 sigreturn sys_sigreturn stub32_sigreturn
120 i386 clone sys_clone stub32_clone
...
...
include/linux/compat.h
View file @
56e41d3c
...
...
@@ -318,6 +318,7 @@ long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
int
version
,
void
__user
*
uptr
);
long
compat_sys_shmat
(
int
first
,
int
second
,
compat_uptr_t
third
,
int
version
,
void
__user
*
uptr
);
asmlinkage
long
compat_sys_ipc
(
u32
,
int
,
int
,
u32
,
compat_uptr_t
,
u32
);
#else
long
compat_sys_semctl
(
int
semid
,
int
semnum
,
int
cmd
,
int
arg
);
long
compat_sys_msgsnd
(
int
msqid
,
struct
compat_msgbuf
__user
*
msgp
,
...
...
ipc/compat.c
View file @
56e41d3c
...
...
@@ -368,6 +368,50 @@ long compat_sys_msgrcv(int first, int second, int msgtyp, int third,
return
do_msgrcv
(
first
,
uptr
,
second
,
msgtyp
,
third
,
compat_do_msg_fill
);
}
COMPAT_SYSCALL_DEFINE6
(
ipc
,
u32
,
call
,
int
,
first
,
int
,
second
,
u32
,
third
,
compat_uptr_t
,
ptr
,
u32
,
fifth
)
{
int
version
;
version
=
call
>>
16
;
/* hack for backward compatibility */
call
&=
0xffff
;
switch
(
call
)
{
case
SEMOP
:
/* struct sembuf is the same on 32 and 64bit :)) */
return
sys_semtimedop
(
first
,
compat_ptr
(
ptr
),
second
,
NULL
);
case
SEMTIMEDOP
:
return
compat_sys_semtimedop
(
first
,
compat_ptr
(
ptr
),
second
,
compat_ptr
(
fifth
));
case
SEMGET
:
return
sys_semget
(
first
,
second
,
third
);
case
SEMCTL
:
return
compat_sys_semctl
(
first
,
second
,
third
,
compat_ptr
(
ptr
));
case
MSGSND
:
return
compat_sys_msgsnd
(
first
,
second
,
third
,
compat_ptr
(
ptr
));
case
MSGRCV
:
return
compat_sys_msgrcv
(
first
,
second
,
fifth
,
third
,
version
,
compat_ptr
(
ptr
));
case
MSGGET
:
return
sys_msgget
(
first
,
second
);
case
MSGCTL
:
return
compat_sys_msgctl
(
first
,
second
,
compat_ptr
(
ptr
));
case
SHMAT
:
return
compat_sys_shmat
(
first
,
second
,
third
,
version
,
compat_ptr
(
ptr
));
case
SHMDT
:
return
sys_shmdt
(
compat_ptr
(
ptr
));
case
SHMGET
:
return
sys_shmget
(
first
,
(
unsigned
)
second
,
third
);
case
SHMCTL
:
return
compat_sys_shmctl
(
first
,
second
,
compat_ptr
(
ptr
));
}
return
-
ENOSYS
;
}
#else
long
compat_sys_semctl
(
int
semid
,
int
semnum
,
int
cmd
,
int
arg
)
{
...
...
kernel/sys_ni.c
View file @
56e41d3c
...
...
@@ -156,7 +156,7 @@ cond_syscall(compat_sys_process_vm_writev);
cond_syscall
(
sys_pciconfig_read
);
cond_syscall
(
sys_pciconfig_write
);
cond_syscall
(
sys_pciconfig_iobase
);
cond_syscall
(
sys32
_ipc
);
cond_syscall
(
compat_sys_s390
_ipc
);
cond_syscall
(
ppc_rtas
);
cond_syscall
(
sys_spu_run
);
cond_syscall
(
sys_spu_create
);
...
...
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