r4075: implement RemoteTOD server function
authorStefan Metzmacher <metze@samba.org>
Mon, 6 Dec 2004 11:10:15 +0000 (11:10 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 18:06:23 +0000 (13:06 -0500)
metze
(This used to be commit 0c6d4246a45f649e7373606f12db74c2acd0f538)

source4/libnet/libnet_time.c
source4/librpc/idl/srvsvc.idl
source4/rpc_server/srvsvc/dcesrv_srvsvc.c

index b0d304ffcc5ca3cf430bd0c70f41bc3ff9e47def..ddf26876b9ea91bd41c0e69b78156b49b2160e83 100644 (file)
@@ -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;
 
index ee5b36953471ad06da746cc6b2f037356a0e546e..38ca38d7ab980f7b0af7f0b7920924b33995f527 100644 (file)
 /* 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;
index 0679ac6e42bdac38d4d4f0ae45e0b641679c8068..8909fc17a76416d2fa68ed721cfed54cbca5451f 100644 (file)
@@ -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;
 }