svn commit: samba r3531 - in branches/SAMBA_4_0/source: ntvfs
smb_server
tridge at samba.org
tridge at samba.org
Thu Nov 4 13:15:22 GMT 2004
Author: tridge
Date: 2004-11-04 13:15:22 +0000 (Thu, 04 Nov 2004)
New Revision: 3531
WebSVN: http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=3531
Log:
add support for RAW_OPEN_MKNEW, RAW_OPEN_CREATE and RAW_OPEN_CTEMP in pvfs
Modified:
branches/SAMBA_4_0/source/ntvfs/ntvfs_generic.c
branches/SAMBA_4_0/source/smb_server/reply.c
Changeset:
Modified: branches/SAMBA_4_0/source/ntvfs/ntvfs_generic.c
===================================================================
--- branches/SAMBA_4_0/source/ntvfs/ntvfs_generic.c 2004-11-04 12:12:09 UTC (rev 3530)
+++ branches/SAMBA_4_0/source/ntvfs/ntvfs_generic.c 2004-11-04 13:15:22 UTC (rev 3531)
@@ -144,6 +144,11 @@
union smb_open *io2,
NTSTATUS status)
{
+ time_t write_time = 0;
+ uint32_t set_size = 0;
+ union smb_setfileinfo *sf;
+ uint_t state;
+
if (!NT_STATUS_IS_OK(status)) {
return status;
}
@@ -171,32 +176,56 @@
/* we need to extend the file to the requested size if
it was newly created */
- if (io2->generic.out.create_action == NTCREATEX_ACTION_CREATED &&
- io->openx.in.size != 0) {
- union smb_setfileinfo *sf;
- uint_t state;
+ if (io2->generic.out.create_action == NTCREATEX_ACTION_CREATED) {
+ set_size = io->openx.in.size;
+ }
+ break;
- /* doing this secondary request async is more
- trouble than its worth */
- state = req->async_states->state;
- req->async_states->state &= ~NTVFS_ASYNC_STATE_MAY_ASYNC;
+ case RAW_OPEN_MKNEW:
+ case RAW_OPEN_CREATE:
+ io->mknew.out.fnum = io2->generic.out.fnum;
+ write_time = io->mknew.in.write_time;
+ break;
- sf = talloc_p(req, union smb_setfileinfo);
- sf->generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
- sf->generic.file.fnum = io2->generic.out.fnum;
- sf->end_of_file_info.in.size = io->openx.in.size;
- status = ntvfs->ops->setfileinfo(ntvfs, req, sf);
- if (NT_STATUS_IS_OK(status)) {
- io->openx.out.size = io->openx.in.size;
- }
- req->async_states->state = state;
- }
+ case RAW_OPEN_CTEMP:
+ io->ctemp.out.fnum = io2->generic.out.fnum;
+ io->ctemp.out.name = talloc_strdup(req, io2->generic.in.fname +
+ strlen(io->ctemp.in.directory) + 1);
+ write_time = io->ctemp.in.write_time;
break;
default:
return NT_STATUS_INVALID_LEVEL;
}
+ /* doing a secondary request async is more trouble than its
+ worth */
+ state = req->async_states->state;
+ req->async_states->state &= ~NTVFS_ASYNC_STATE_MAY_ASYNC;
+
+ if (write_time != 0) {
+ sf = talloc_p(req, union smb_setfileinfo);
+ sf->generic.level = RAW_SFILEINFO_STANDARD;
+ sf->generic.file.fnum = io2->generic.out.fnum;
+ sf->standard.in.create_time = 0;
+ sf->standard.in.write_time = write_time;
+ sf->standard.in.access_time = 0;
+ status = ntvfs->ops->setfileinfo(ntvfs, req, sf);
+ }
+
+ if (set_size != 0) {
+ sf = talloc_p(req, union smb_setfileinfo);
+ sf->generic.level = RAW_SFILEINFO_END_OF_FILE_INFORMATION;
+ sf->generic.file.fnum = io2->generic.out.fnum;
+ sf->end_of_file_info.in.size = io->openx.in.size;
+ status = ntvfs->ops->setfileinfo(ntvfs, req, sf);
+ if (NT_STATUS_IS_OK(status)) {
+ io->openx.out.size = io->openx.in.size;
+ }
+ }
+
+ req->async_states->state = state;
+
return NT_STATUS_OK;
}
@@ -386,6 +415,50 @@
status = ntvfs->ops->openfile(ntvfs, req, io2);
break;
+
+ case RAW_OPEN_MKNEW:
+ io2->generic.in.file_attr = io->mknew.in.attrib;
+ io2->generic.in.fname = io->mknew.in.fname;
+ io2->generic.in.open_disposition = NTCREATEX_DISP_CREATE;
+ io2->generic.in.access_mask =
+ GENERIC_RIGHTS_FILE_READ |
+ GENERIC_RIGHTS_FILE_WRITE;
+ io2->generic.in.share_access =
+ NTCREATEX_SHARE_ACCESS_READ |
+ NTCREATEX_SHARE_ACCESS_WRITE;
+ status = ntvfs->ops->openfile(ntvfs, req, io2);
+ break;
+
+ case RAW_OPEN_CREATE:
+ io2->generic.in.file_attr = io->mknew.in.attrib;
+ io2->generic.in.fname = io->mknew.in.fname;
+ io2->generic.in.open_disposition = NTCREATEX_DISP_OPEN_IF;
+ io2->generic.in.access_mask =
+ GENERIC_RIGHTS_FILE_READ |
+ GENERIC_RIGHTS_FILE_WRITE;
+ io2->generic.in.share_access =
+ NTCREATEX_SHARE_ACCESS_READ |
+ NTCREATEX_SHARE_ACCESS_WRITE;
+ status = ntvfs->ops->openfile(ntvfs, req, io2);
+ break;
+
+ case RAW_OPEN_CTEMP:
+ io2->generic.in.file_attr = io->ctemp.in.attrib;
+ io2->generic.in.file_attr = 0;
+ io2->generic.in.fname =
+ talloc_asprintf(io2, "%s\\SRV%s",
+ io->ctemp.in.directory,
+ generate_random_str_list(io2, 5, "0123456789"));
+ io2->generic.in.open_disposition = NTCREATEX_DISP_CREATE;
+ io2->generic.in.access_mask =
+ GENERIC_RIGHTS_FILE_READ |
+ GENERIC_RIGHTS_FILE_WRITE;
+ io2->generic.in.share_access =
+ NTCREATEX_SHARE_ACCESS_READ |
+ NTCREATEX_SHARE_ACCESS_WRITE;
+ status = ntvfs->ops->openfile(ntvfs, req, io2);
+ break;
+
default:
status = NT_STATUS_INVALID_LEVEL;
break;
Modified: branches/SAMBA_4_0/source/smb_server/reply.c
===================================================================
--- branches/SAMBA_4_0/source/smb_server/reply.c 2004-11-04 12:12:09 UTC (rev 3530)
+++ branches/SAMBA_4_0/source/smb_server/reply.c 2004-11-04 13:15:22 UTC (rev 3531)
@@ -556,7 +556,11 @@
REQ_CHECK_WCT(req, 3);
REQ_TALLOC(oi, sizeof(*oi));
- oi->mknew.level = RAW_OPEN_MKNEW;
+ if (CVAL(req->in.hdr, HDR_COM) == SMBmknew) {
+ oi->mknew.level = RAW_OPEN_MKNEW;
+ } else {
+ oi->mknew.level = RAW_OPEN_CREATE;
+ }
oi->mknew.in.attrib = SVAL(req->in.vwv, VWV(0));
oi->mknew.in.write_time = srv_pull_dos_date3(req->smb_conn, req->in.vwv + VWV(1));
More information about the samba-cvs
mailing list