@@ -30,10 +30,11 @@ #include #include #include #include #include +#include #include #include #include #include #include @@ -2516,10 +2517,48 @@ return(TCL_ERROR); } return(TCL_OK); } + +static int tuapi_adjtime(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { + struct timeval tv, oldTV; + Tcl_WideInt tv_sec_val, tv_usec_val; + int adjtime_ret, tcl_ret; + + if (objc != 3) { + Tcl_SetObjResult(interp, Tcl_NewStringObj("wrong # args: should be \"::tuapi::syscall::adjtime seconds microseconds\"", -1)); + + return(TCL_ERROR); + } + + tcl_ret = Tcl_GetWideIntFromObj(interp, objv[1], &tv_sec_val); + if (tcl_ret != TCL_OK) { + return(tcl_ret); + } + + tcl_ret = Tcl_GetWideIntFromObj(interp, objv[2], &tv_usec_val); + if (tcl_ret != TCL_OK) { + return(tcl_ret); + } + + tv.tv_sec = tv_sec_val; + tv.tv_usec = tv_usec_val; + + adjtime_ret = adjtime(&tv, &oldTV); + + if (adjtime_ret != 0) { + Tcl_SetObjResult(interp, Tcl_NewStringObj(strerror(errno), -1)); + + return(TCL_ERROR); + } + + /* XXX TODO: Return old adjustment */ + + return(TCL_OK); +} + #ifndef DISABLE_UNIX_SOCKETS struct tuapi_socket_unix__chan_id { int fd; Tcl_Channel chan; @@ -3251,10 +3290,11 @@ Tcl_CreateObjCommand(interp, "::tuapi::syscall::lsmod", tuapi_lsmod, NULL, NULL); Tcl_CreateObjCommand(interp, "::tuapi::syscall::hostname", tuapi_hostname, NULL, NULL); Tcl_CreateObjCommand(interp, "::tuapi::syscall::domainname", tuapi_domainname, NULL, NULL); Tcl_CreateObjCommand(interp, "::tuapi::syscall::klogctl", tuapi_klogctl, NULL, NULL); Tcl_CreateObjCommand(interp, "::tuapi::syscall::settimeofday", tuapi_settimeofday, NULL, NULL); + Tcl_CreateObjCommand(interp, "::tuapi::syscall::adjtime", tuapi_adjtime, NULL, NULL); /* Block or char device related commands */ Tcl_CreateObjCommand(interp, "::tuapi::syscall::losetup", tuapi_losetup, NULL, NULL); Tcl_CreateObjCommand(interp, "::tuapi::syscall::eject", tuapi_eject, NULL, NULL);