mirror of
https://github.com/samba-team/samba.git
synced 2024-12-27 03:21:53 +03:00
r3253: - added rudimentary support for ntioctl in pvfs
- catch the SIGXFSZ signal, which for some completely insane reason is
generated in current Linux systems when you write before the maximum
offset in a file (maximum is 2^41 on my box). Why wasn't errno good
enough for this?
- give the right ntstatus code for large offset write failures
(This used to be commit 367f0c2af4
)
This commit is contained in:
parent
cfc843cf29
commit
7f60959e64
@ -23,6 +23,7 @@ ADD_OBJ_FILES = \
|
||||
ntvfs/posix/pvfs_lock.o \
|
||||
ntvfs/posix/pvfs_wait.o \
|
||||
ntvfs/posix/pvfs_seek.o \
|
||||
ntvfs/posix/pvfs_ioctl.o \
|
||||
ntvfs/common/opendb.o \
|
||||
ntvfs/common/brlock.o
|
||||
# End MODULE ntvfs_posix
|
||||
|
87
source4/ntvfs/posix/pvfs_ioctl.c
Normal file
87
source4/ntvfs/posix/pvfs_ioctl.c
Normal file
@ -0,0 +1,87 @@
|
||||
/*
|
||||
Unix SMB/CIFS implementation.
|
||||
|
||||
POSIX NTVFS backend - open and close
|
||||
|
||||
Copyright (C) Andrew Tridgell 2004
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
#include "include/includes.h"
|
||||
#include "vfs_posix.h"
|
||||
|
||||
/*
|
||||
old ioctl interface
|
||||
*/
|
||||
static NTSTATUS pvfs_ioctl_old(struct ntvfs_module_context *ntvfs,
|
||||
struct smbsrv_request *req, union smb_ioctl *io)
|
||||
{
|
||||
struct pvfs_state *pvfs = ntvfs->private_data;
|
||||
struct pvfs_file *f;
|
||||
|
||||
f = pvfs_find_fd(pvfs, req, io->ioctl.in.fnum);
|
||||
if (!f) {
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
return NT_STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
/*
|
||||
nt ioctl interface
|
||||
*/
|
||||
static NTSTATUS pvfs_ntioctl(struct ntvfs_module_context *ntvfs,
|
||||
struct smbsrv_request *req, union smb_ioctl *io)
|
||||
{
|
||||
struct pvfs_state *pvfs = ntvfs->private_data;
|
||||
struct pvfs_file *f;
|
||||
|
||||
f = pvfs_find_fd(pvfs, req, io->ntioctl.in.fnum);
|
||||
if (!f) {
|
||||
return NT_STATUS_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
switch (io->ntioctl.in.function) {
|
||||
case FSCTL_SET_SPARSE:
|
||||
/* maybe some posix systems have a way of marking
|
||||
a file non-sparse? */
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
return NT_STATUS_NOT_SUPPORTED;
|
||||
}
|
||||
|
||||
/*
|
||||
ioctl interface
|
||||
*/
|
||||
NTSTATUS pvfs_ioctl(struct ntvfs_module_context *ntvfs,
|
||||
struct smbsrv_request *req, union smb_ioctl *io)
|
||||
{
|
||||
NTSTATUS status;
|
||||
|
||||
switch (io->generic.level) {
|
||||
case RAW_IOCTL_IOCTL:
|
||||
status = pvfs_ioctl_old(ntvfs, req, io);
|
||||
break;
|
||||
|
||||
case RAW_IOCTL_NTIOCTL:
|
||||
status = pvfs_ntioctl(ntvfs, req, io);
|
||||
break;
|
||||
}
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@ -65,6 +65,9 @@ NTSTATUS pvfs_write(struct ntvfs_module_context *ntvfs,
|
||||
wr->writex.in.count,
|
||||
wr->writex.in.offset);
|
||||
if (ret == -1) {
|
||||
if (errno == EFBIG) {
|
||||
return NT_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
return map_nt_error_from_unix(errno);
|
||||
}
|
||||
|
||||
|
@ -122,6 +122,12 @@ static NTSTATUS pvfs_connect(struct ntvfs_module_context *ntvfs,
|
||||
|
||||
pvfs_setup_options(pvfs);
|
||||
|
||||
#ifdef SIGXFSZ
|
||||
/* who had the stupid idea to generate a signal on a large
|
||||
file write instead of just failing it!? */
|
||||
BlockSignals(True, SIGXFSZ);
|
||||
#endif
|
||||
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
@ -134,15 +140,6 @@ static NTSTATUS pvfs_disconnect(struct ntvfs_module_context *ntvfs,
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
/*
|
||||
ioctl interface - we don't do any
|
||||
*/
|
||||
static NTSTATUS pvfs_ioctl(struct ntvfs_module_context *ntvfs,
|
||||
struct smbsrv_request *req, union smb_ioctl *io)
|
||||
{
|
||||
return NT_STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
/*
|
||||
check if a directory exists
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user