diff options
-rw-r--r-- | source4/libnet/libnet_time.c | 2 | ||||
-rw-r--r-- | source4/librpc/idl/srvsvc.idl | 8 | ||||
-rw-r--r-- | source4/rpc_server/srvsvc/dcesrv_srvsvc.c | 32 |
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; } |