summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/libnet/libnet_time.c2
-rw-r--r--source4/librpc/idl/srvsvc.idl8
-rw-r--r--source4/rpc_server/srvsvc/dcesrv_srvsvc.c32
3 files changed, 36 insertions, 6 deletions
diff --git a/source4/libnet/libnet_time.c b/source4/libnet/libnet_time.c
index b0d304ffcc..ddf26876b9 100644
--- a/source4/libnet/libnet_time.c
+++ b/source4/libnet/libnet_time.c
@@ -82,7 +82,7 @@ static NTSTATUS libnet_RemoteTOD_srvsvc(struct libnet_context *ctx, TALLOC_CTX *
tm.tm_isdst = -1;
r->srvsvc.out.time = timegm(&tm);
- r->srvsvc.out.time_zone = ((int32_t)tod.out.info->timezone) * 60;
+ r->srvsvc.out.time_zone = tod.out.info->timezone * 60;
goto disconnect;
diff --git a/source4/librpc/idl/srvsvc.idl b/source4/librpc/idl/srvsvc.idl
index ee5b369534..38ca38d7ab 100644
--- a/source4/librpc/idl/srvsvc.idl
+++ b/source4/librpc/idl/srvsvc.idl
@@ -1128,14 +1128,14 @@
/* srvsvc_NetRemoteTOD */
/**************************/
typedef struct {
- uint32 elapsed;
- uint32 msecs;
+ uint32 elapsed; /* time(NULL) */
+ uint32 msecs; /* milliseconds till system reboot (uptime) */
uint32 hours;
uint32 mins;
uint32 secs;
uint32 hunds;
- uint32 timezone;
- uint32 tinterval;
+ int32 timezone; /* in minutes */
+ uint32 tinterval; /* clock tick interval in 0.0001 second units; 310 on windows */
uint32 day;
uint32 month;
uint32 year;
diff --git a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
index 0679ac6e42..8909fc17a7 100644
--- a/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
+++ b/source4/rpc_server/srvsvc/dcesrv_srvsvc.c
@@ -24,6 +24,7 @@
#include "rpc_server/dcerpc_server.h"
#include "librpc/gen_ndr/ndr_srvsvc.h"
#include "rpc_server/common/common.h"
+#include "system/time.h"
/*
srvsvc_NetCharDevEnum
@@ -807,7 +808,36 @@ static WERROR srvsvc_NETRSERVERTRANSPORTDEL(struct dcesrv_call_state *dce_call,
static WERROR srvsvc_NetRemoteTOD(struct dcesrv_call_state *dce_call, TALLOC_CTX *mem_ctx,
struct srvsvc_NetRemoteTOD *r)
{
- DCESRV_FAULT(DCERPC_FAULT_OP_RNG_ERROR);
+ struct timeval tval;
+ time_t t;
+ struct tm tm;
+
+ r->out.info = talloc_p(mem_ctx, struct srvsvc_NetRemoteTODInfo);
+ WERR_TALLOC_CHECK(r->out.info);
+
+ GetTimeOfDay(&tval);
+ t = tval.tv_sec;
+
+ gmtime_r(&t, &tm);
+
+ r->out.info->elapsed = t;
+ /* fake the uptime: just return the milliseconds till 0:00:00 today */
+ r->out.info->msecs = (tm.tm_hour*60*60*1000)
+ + (tm.tm_min*60*1000)
+ + (tm.tm_sec*1000)
+ + (tval.tv_usec/1000);
+ r->out.info->hours = tm.tm_hour;
+ r->out.info->mins = tm.tm_min;
+ r->out.info->secs = tm.tm_sec;
+ r->out.info->hunds = tval.tv_usec/10000;
+ r->out.info->timezone = get_time_zone(t)/60;
+ r->out.info->tinterval = 310; /* just return the same as windows */
+ r->out.info->day = tm.tm_mday;
+ r->out.info->month = tm.tm_mon + 1;
+ r->out.info->year = tm.tm_year + 1900;
+ r->out.info->weekday = tm.tm_wday;
+
+ return WERR_OK;
}