summaryrefslogtreecommitdiff
path: root/source4/smb_server
diff options
context:
space:
mode:
Diffstat (limited to 'source4/smb_server')
-rw-r--r--source4/smb_server/config.m425
-rw-r--r--source4/smb_server/negprot.c15
-rw-r--r--source4/smb_server/reply.c53
-rw-r--r--source4/smb_server/search.c2
-rw-r--r--source4/smb_server/smb_server.c2
-rw-r--r--source4/smb_server/srvtime.c81
-rw-r--r--source4/smb_server/trans2.c30
7 files changed, 137 insertions, 71 deletions
diff --git a/source4/smb_server/config.m4 b/source4/smb_server/config.m4
index 4ce688850c..e49f610317 100644
--- a/source4/smb_server/config.m4
+++ b/source4/smb_server/config.m4
@@ -1,16 +1,17 @@
dnl # SMB server subsystem
SMB_SUBSYSTEM(SMB,smb_server/smb_server.o,
- [smb_server/conn.o ]\
- [smb_server/connection.o]\
- [smb_server/negprot.o]\
- [smb_server/nttrans.o]\
- [smb_server/password.o]\
- [smb_server/reply.o]\
- [smb_server/request.o]\
- [smb_server/search.o]\
- [smb_server/service.o]\
- [smb_server/session.o]\
- [smb_server/sesssetup.o]\
- [smb_server/trans2.o],
+ [smb_server/conn.o \
+ smb_server/connection.o \
+ smb_server/negprot.o \
+ smb_server/nttrans.o \
+ smb_server/password.o \
+ smb_server/reply.o \
+ smb_server/request.o \
+ smb_server/search.o \
+ smb_server/service.o \
+ smb_server/session.o \
+ smb_server/sesssetup.o \
+ smb_server/srvtime.o \
+ smb_server/trans2.o],\
smb_server/smb_server_public_proto.h)
diff --git a/source4/smb_server/negprot.c b/source4/smb_server/negprot.c
index caf3ce33b9..92ce5675ad 100644
--- a/source4/smb_server/negprot.c
+++ b/source4/smb_server/negprot.c
@@ -119,8 +119,8 @@ static void reply_lanman1(struct request_context *req, uint16 choice)
SSVAL(req->out.vwv, VWV(4), 1);
SSVAL(req->out.vwv, VWV(5), raw);
SIVAL(req->out.vwv, VWV(6), req->smb->pid);
- put_dos_date(req->out.vwv, VWV(8), t);
- SSVAL(req->out.vwv, VWV(10), TimeDiff(t)/60);
+ srv_push_dos_date(req->smb, req->out.vwv, VWV(8), t);
+ SSVAL(req->out.vwv, VWV(10), req->smb->negotiate.zone_offset/60);
/* Create a token value and add it to the outgoing packet. */
if (req->smb->negotiate.encrypted_passwords) {
@@ -159,8 +159,8 @@ static void reply_lanman2(struct request_context *req, uint16 choice)
SSVAL(req->out.vwv, VWV(4), 1);
SSVAL(req->out.vwv, VWV(5), raw);
SIVAL(req->out.vwv, VWV(6), req->smb->pid);
- put_dos_date(req->out.vwv, VWV(8), t);
- SSVAL(req->out.vwv, VWV(10), TimeDiff(t)/60);
+ srv_push_dos_date(req->smb, req->out.vwv, VWV(8), t);
+ SSVAL(req->out.vwv, VWV(10), req->smb->negotiate.zone_offset/60);
/* Create a token value and add it to the outgoing packet. */
if (req->smb->negotiate.encrypted_passwords) {
@@ -229,8 +229,11 @@ static void reply_nt1(struct request_context *req, uint16 choice)
int capabilities;
int secword=0;
time_t t = req->request_time.tv_sec;
+ NTTIME nttime;
BOOL negotiate_spnego = False;
+ unix_to_nt_time(&nttime, t);
+
capabilities =
CAP_NT_FIND | CAP_LOCK_AND_READ |
CAP_LEVEL_II_OPLOCKS | CAP_NT_SMBS | CAP_RPC_REMOTE_APIS;
@@ -303,8 +306,8 @@ static void reply_nt1(struct request_context *req, uint16 choice)
SIVAL(req->out.vwv+1, VWV(5), 0x10000); /* raw size. full 64k */
SIVAL(req->out.vwv+1, VWV(7), req->smb->pid); /* session key */
SIVAL(req->out.vwv+1, VWV(9), capabilities);
- put_long_date(req->out.vwv + VWV(11) + 1, t);
- SSVALS(req->out.vwv+1,VWV(15), TimeDiff(t)/60);
+ push_nttime(req->out.vwv+1, VWV(11), &nttime);
+ SSVALS(req->out.vwv+1,VWV(15), req->smb->negotiate.zone_offset/60);
if (!negotiate_spnego) {
/* Create a token value and add it to the outgoing packet. */
diff --git a/source4/smb_server/reply.c b/source4/smb_server/reply.c
index 298b2443d3..8b9bb4fb5e 100644
--- a/source4/smb_server/reply.c
+++ b/source4/smb_server/reply.c
@@ -62,27 +62,6 @@
/* zero out some reserved fields in a reply */
#define REQ_VWV_RESERVED(start, count) memset(req->out.vwv + VWV(start), 0, (count)*2)
-/*
- put a NTTIME into a packet
-*/
-void push_nttime(void *base, uint16 offset, NTTIME *t)
-{
- SIVAL(base, offset, t->low);
- SIVAL(base, offset+4, t->high);
-}
-
-/*
- pull a NTTIME from a packet
-*/
-NTTIME pull_nttime(void *base, uint16 offset)
-{
- NTTIME ret;
- ret.low = IVAL(base, offset);
- ret.high = IVAL(base, offset+4);
- return ret;
-}
-
-
/****************************************************************************
Reply to a simple request (async send)
****************************************************************************/
@@ -298,7 +277,7 @@ static void reply_getatr_send(struct request_context *req)
req_setup_reply(req, 10, 0);
SSVAL(req->out.vwv, VWV(0), st->getattr.out.attrib);
- put_dos_date3(req->out.vwv, VWV(1), st->getattr.out.write_time);
+ srv_push_dos_date3(req->smb, req->out.vwv, VWV(1), st->getattr.out.write_time);
SIVAL(req->out.vwv, VWV(3), st->getattr.out.size);
REQ_VWV_RESERVED(5, 5);
@@ -348,7 +327,7 @@ void reply_setatr(struct request_context *req)
st->setattr.level = RAW_SFILEINFO_SETATTR;
st->setattr.in.attrib = SVAL(req->in.vwv, VWV(0));
- st->setattr.in.write_time = make_unix_date3(req->in.vwv + VWV(1));
+ st->setattr.in.write_time = srv_pull_dos_date3(req->smb, req->in.vwv + VWV(1));
req_pull_ascii4(req, &st->setattr.file.fname, req->in.data, STR_TERMINATE);
@@ -425,7 +404,7 @@ static void reply_open_send(struct request_context *req)
SSVAL(req->out.vwv, VWV(0), oi->open.out.fnum);
SSVAL(req->out.vwv, VWV(1), oi->open.out.attrib);
- put_dos_date3(req->out.vwv, VWV(2), oi->open.out.write_time);
+ srv_push_dos_date3(req->smb, req->out.vwv, VWV(2), oi->open.out.write_time);
SIVAL(req->out.vwv, VWV(4), oi->open.out.size);
SSVAL(req->out.vwv, VWV(6), oi->open.out.rmode);
@@ -484,7 +463,7 @@ static void reply_open_and_X_send(struct request_context *req)
SSVAL(req->out.vwv, VWV(1), 0);
SSVAL(req->out.vwv, VWV(2), oi->openx.out.fnum);
SSVAL(req->out.vwv, VWV(3), oi->openx.out.attrib);
- put_dos_date3(req->out.vwv, VWV(4), oi->openx.out.write_time);
+ srv_push_dos_date3(req->smb, req->out.vwv, VWV(4), oi->openx.out.write_time);
SIVAL(req->out.vwv, VWV(6), oi->openx.out.size);
SSVAL(req->out.vwv, VWV(8), oi->openx.out.access);
SSVAL(req->out.vwv, VWV(9), oi->openx.out.ftype);
@@ -517,7 +496,7 @@ void reply_open_and_X(struct request_context *req)
oi->openx.in.open_mode = SVAL(req->in.vwv, VWV(3));
oi->openx.in.search_attrs = SVAL(req->in.vwv, VWV(4));
oi->openx.in.file_attrs = SVAL(req->in.vwv, VWV(5));
- oi->openx.in.write_time = make_unix_date3(req->in.vwv + VWV(6));
+ oi->openx.in.write_time = srv_pull_dos_date3(req->smb, req->in.vwv + VWV(6));
oi->openx.in.open_func = SVAL(req->in.vwv, VWV(8));
oi->openx.in.size = IVAL(req->in.vwv, VWV(9));
oi->openx.in.timeout = IVAL(req->in.vwv, VWV(11));
@@ -570,7 +549,7 @@ void reply_mknew(struct request_context *req)
oi->mknew.level = RAW_OPEN_MKNEW;
oi->mknew.in.attrib = SVAL(req->in.vwv, VWV(0));
- oi->mknew.in.write_time = make_unix_date3(req->in.vwv + VWV(1));
+ oi->mknew.in.write_time = srv_pull_dos_date3(req->smb, req->in.vwv + VWV(1));
req_pull_ascii4(req, &oi->mknew.in.fname, req->in.data, STR_TERMINATE);
@@ -621,7 +600,7 @@ void reply_ctemp(struct request_context *req)
oi->ctemp.level = RAW_OPEN_CTEMP;
oi->ctemp.in.attrib = SVAL(req->in.vwv, VWV(0));
- oi->ctemp.in.write_time = make_unix_date3(req->in.vwv + VWV(1));
+ oi->ctemp.in.write_time = srv_pull_dos_date3(req->smb, req->in.vwv + VWV(1));
/* the filename is actually a directory name, the server provides a filename
in that directory */
@@ -1224,7 +1203,7 @@ void reply_close(struct request_context *req)
io->close.level = RAW_CLOSE_CLOSE;
io->close.in.fnum = req_fnum(req, req->in.vwv, VWV(0));
- io->close.in.write_time = make_unix_date3(req->in.vwv + VWV(1));
+ io->close.in.write_time = srv_pull_dos_date3(req->smb, req->in.vwv + VWV(1));
req->async.send_fn = reply_simple_send;
@@ -1271,7 +1250,7 @@ void reply_writeclose(struct request_context *req)
io->writeclose.in.fnum = req_fnum(req, req->in.vwv, VWV(0));
io->writeclose.in.count = SVAL(req->in.vwv, VWV(1));
io->writeclose.in.offset = IVAL(req->in.vwv, VWV(2));
- io->writeclose.in.mtime = make_unix_date3(req->in.vwv + VWV(4));
+ io->writeclose.in.mtime = srv_pull_dos_date3(req->smb, req->in.vwv + VWV(4));
io->writeclose.in.data = req->in.data + 1;
/* make sure they gave us the data they promised */
@@ -1486,7 +1465,7 @@ void reply_printqueue_send(struct request_context *req)
req->out.ptr = req->out.data + 3;
for (i=0;i<lpq->retq.out.count;i++) {
- put_dos_date2(req->out.ptr, 0 , lpq->retq.out.queue[i].time);
+ srv_push_dos_date2(req->smb, req->out.ptr, 0 , lpq->retq.out.queue[i].time);
SCVAL(req->out.ptr, 4, lpq->retq.out.queue[i].status);
SSVAL(req->out.ptr, 5, lpq->retq.out.queue[i].job);
SIVAL(req->out.ptr, 7, lpq->retq.out.queue[i].size);
@@ -1851,9 +1830,9 @@ void reply_setattrE(struct request_context *req)
info->setattre.level = RAW_SFILEINFO_SETATTRE;
info->setattre.file.fnum = req_fnum(req, req->in.vwv, VWV(0));
- info->setattre.in.create_time = make_unix_date2(req->in.vwv + VWV(1));
- info->setattre.in.access_time = make_unix_date2(req->in.vwv + VWV(3));
- info->setattre.in.write_time = make_unix_date2(req->in.vwv + VWV(5));
+ info->setattre.in.create_time = srv_pull_dos_date2(req->smb, req->in.vwv + VWV(1));
+ info->setattre.in.access_time = srv_pull_dos_date2(req->smb, req->in.vwv + VWV(3));
+ info->setattre.in.write_time = srv_pull_dos_date2(req->smb, req->in.vwv + VWV(5));
req->async.send_fn = reply_simple_send;
@@ -1897,9 +1876,9 @@ static void reply_getattrE_send(struct request_context *req)
/* setup reply */
req_setup_reply(req, 11, 0);
- put_dos_date2(req->out.vwv, VWV(0), info->getattre.out.create_time);
- put_dos_date2(req->out.vwv, VWV(2), info->getattre.out.access_time);
- put_dos_date2(req->out.vwv, VWV(4), info->getattre.out.write_time);
+ srv_push_dos_date2(req->smb, req->out.vwv, VWV(0), info->getattre.out.create_time);
+ srv_push_dos_date2(req->smb, req->out.vwv, VWV(2), info->getattre.out.access_time);
+ srv_push_dos_date2(req->smb, req->out.vwv, VWV(4), info->getattre.out.write_time);
SIVAL(req->out.vwv, VWV(6), info->getattre.out.size);
SIVAL(req->out.vwv, VWV(8), info->getattre.out.alloc_size);
SSVAL(req->out.vwv, VWV(10), info->getattre.out.attrib);
diff --git a/source4/smb_server/search.c b/source4/smb_server/search.c
index 9d01a0e98f..0a6aaa6c25 100644
--- a/source4/smb_server/search.c
+++ b/source4/smb_server/search.c
@@ -78,7 +78,7 @@ static void find_fill_info(struct request_context *req,
p += req_append_bytes(req, file->search.search_id.data, 21);
p += req_append_bytes(req, (char*)&file->search.attrib, 1);
- put_dos_date((char*)&dos_date, 0, file->search.write_time);
+ srv_push_dos_date3(req->smb, (uint8 *)&dos_date, 0, file->search.write_time);
p += req_append_bytes(req, (char*)&dos_date, 4);
p += req_append_bytes(req, (char*)&file->search.size, 4);
memset(&search_name[0], ' ', 13);
diff --git a/source4/smb_server/smb_server.c b/source4/smb_server/smb_server.c
index f798accc3f..84209d8670 100644
--- a/source4/smb_server/smb_server.c
+++ b/source4/smb_server/smb_server.c
@@ -749,6 +749,8 @@ void init_smbsession(struct event_context *ev, struct model_ops *model_ops, int
good performance */
smb->negotiate.max_recv = lp_max_xmit();
+ smb->negotiate.zone_offset = get_time_zone(time(NULL));
+
smb->users.next_vuid = VUID_OFFSET;
smb->events = ev;
diff --git a/source4/smb_server/srvtime.c b/source4/smb_server/srvtime.c
new file mode 100644
index 0000000000..c6a0606e89
--- /dev/null
+++ b/source4/smb_server/srvtime.c
@@ -0,0 +1,81 @@
+/*
+ Unix SMB/CIFS implementation.
+
+ server side time handling
+
+ 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 "includes.h"
+
+/*******************************************************************
+put a dos date into a buffer (time/date format)
+This takes GMT time and puts local time for zone_offset in the buffer
+********************************************************************/
+void srv_push_dos_date(struct server_context *smb_server,
+ uint8 *buf, int offset, time_t unixdate)
+{
+ push_dos_date(buf, offset, unixdate, smb_server->negotiate.zone_offset);
+}
+
+/*******************************************************************
+put a dos date into a buffer (date/time format)
+This takes GMT time and puts local time in the buffer
+********************************************************************/
+void srv_push_dos_date2(struct server_context *smb_server,
+ char *buf, int offset, time_t unixdate)
+{
+ push_dos_date2(buf, offset, unixdate, smb_server->negotiate.zone_offset);
+}
+
+/*******************************************************************
+put a dos 32 bit "unix like" date into a buffer. This routine takes
+GMT and converts it to LOCAL time in zone_offset before putting it
+********************************************************************/
+void srv_push_dos_date3(struct server_context *smb_server,
+ char *buf, int offset, time_t unixdate)
+{
+ push_dos_date3(buf, offset, unixdate, smb_server->negotiate.zone_offset);
+}
+
+/*******************************************************************
+convert a dos date
+********************************************************************/
+time_t srv_pull_dos_date(struct server_context *smb_server,
+ const uint8 *date_ptr)
+{
+ return pull_dos_date(date_ptr, smb_server->negotiate.zone_offset);
+}
+
+/*******************************************************************
+like srv_pull_dos_date() but the words are reversed
+********************************************************************/
+time_t srv_pull_dos_date2(struct server_context *smb_server,
+ const uint8 *date_ptr)
+{
+ return pull_dos_date2(date_ptr, smb_server->negotiate.zone_offset);
+}
+
+/*******************************************************************
+ create a unix GMT date from a dos date in 32 bit "unix like" format
+ these arrive in server zone, with corresponding DST
+ ******************************************************************/
+time_t srv_pull_dos_date3(struct server_context *smb_server,
+ const uint8 *date_ptr)
+{
+ return pull_dos_date3(date_ptr, smb_server->negotiate.zone_offset);
+}
diff --git a/source4/smb_server/trans2.c b/source4/smb_server/trans2.c
index bc51191aa6..a412d9df3a 100644
--- a/source4/smb_server/trans2.c
+++ b/source4/smb_server/trans2.c
@@ -420,9 +420,9 @@ static NTSTATUS trans2_fileinfo_fill(struct request_context *req, struct smb_tra
trans2_setup_reply(req, trans, 2, 22, 0);
SSVAL(trans->out.params.data, 0, 0);
- put_dos_date2(trans->out.data.data, 0, st->standard.out.create_time);
- put_dos_date2(trans->out.data.data, 4, st->standard.out.access_time);
- put_dos_date2(trans->out.data.data, 8, st->standard.out.write_time);
+ srv_push_dos_date2(req->smb, trans->out.data.data, 0, st->standard.out.create_time);
+ srv_push_dos_date2(req->smb, trans->out.data.data, 4, st->standard.out.access_time);
+ srv_push_dos_date2(req->smb, trans->out.data.data, 8, st->standard.out.write_time);
SIVAL(trans->out.data.data, 12, st->standard.out.size);
SIVAL(trans->out.data.data, 16, st->standard.out.alloc_size);
SSVAL(trans->out.data.data, 20, st->standard.out.attrib);
@@ -432,9 +432,9 @@ static NTSTATUS trans2_fileinfo_fill(struct request_context *req, struct smb_tra
trans2_setup_reply(req, trans, 2, 26, 0);
SSVAL(trans->out.params.data, 0, 0);
- put_dos_date2(trans->out.data.data, 0, st->ea_size.out.create_time);
- put_dos_date2(trans->out.data.data, 4, st->ea_size.out.access_time);
- put_dos_date2(trans->out.data.data, 8, st->ea_size.out.write_time);
+ srv_push_dos_date2(req->smb, trans->out.data.data, 0, st->ea_size.out.create_time);
+ srv_push_dos_date2(req->smb, trans->out.data.data, 4, st->ea_size.out.access_time);
+ srv_push_dos_date2(req->smb, trans->out.data.data, 8, st->ea_size.out.write_time);
SIVAL(trans->out.data.data, 12, st->ea_size.out.size);
SIVAL(trans->out.data.data, 16, st->ea_size.out.alloc_size);
SSVAL(trans->out.data.data, 20, st->ea_size.out.attrib);
@@ -705,9 +705,9 @@ static NTSTATUS trans2_parse_sfileinfo(struct request_context *req,
case RAW_SFILEINFO_STANDARD:
CHECK_MIN_BLOB_SIZE(blob, 12);
- st->standard.in.create_time = make_unix_date2(blob->data + 0);
- st->standard.in.access_time = make_unix_date2(blob->data + 4);
- st->standard.in.write_time = make_unix_date2(blob->data + 8);
+ st->standard.in.create_time = pull_dos_date2(req->smb, blob->data + 0);
+ st->standard.in.access_time = pull_dos_date2(req->smb, blob->data + 4);
+ st->standard.in.write_time = pull_dos_date2(req->smb, blob->data + 8);
return NT_STATUS_OK;
case RAW_SFILEINFO_EA_SET:
@@ -896,9 +896,9 @@ static void find_fill_info(struct request_context *req,
trans2_grow_data(req, trans, ofs + 23);
}
data = trans->out.data.data + ofs;
- put_dos_date2(data, 0, file->standard.create_time);
- put_dos_date2(data, 4, file->standard.access_time);
- put_dos_date2(data, 8, file->standard.write_time);
+ srv_push_dos_date2(req->smb, data, 0, file->standard.create_time);
+ srv_push_dos_date2(req->smb, data, 4, file->standard.access_time);
+ srv_push_dos_date2(req->smb, data, 8, file->standard.write_time);
SIVAL(data, 12, file->standard.size);
SIVAL(data, 16, file->standard.alloc_size);
SSVAL(data, 20, file->standard.attrib);
@@ -915,9 +915,9 @@ static void find_fill_info(struct request_context *req,
trans2_grow_data(req, trans, ofs + 27);
}
data = trans->out.data.data + ofs;
- put_dos_date2(data, 0, file->ea_size.create_time);
- put_dos_date2(data, 4, file->ea_size.access_time);
- put_dos_date2(data, 8, file->ea_size.write_time);
+ srv_push_dos_date2(req->smb, data, 0, file->ea_size.create_time);
+ srv_push_dos_date2(req->smb, data, 4, file->ea_size.access_time);
+ srv_push_dos_date2(req->smb, data, 8, file->ea_size.write_time);
SIVAL(data, 12, file->ea_size.size);
SIVAL(data, 16, file->ea_size.alloc_size);
SSVAL(data, 20, file->ea_size.attrib);