Module: sems Branch: master Commit: 63d5b66d3173ad3be638478acfc548b7e04f2beb URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=63d5b66d3173ad3be638478acfc548b7e04f2beb
Author: Stefan Sayer <[email protected]> Committer: Stefan Sayer <[email protected]> Date: Fri Dec 3 03:22:24 2010 +0100 DSM: sys.getTimestamp() and sys.subTimestamp() development of this was sponsored by TelTech Systems Inc --- apps/dsm/mods/mod_sys/ModSys.cpp | 61 +++++++++++++++++++++++++++++++++++++- apps/dsm/mods/mod_sys/ModSys.h | 3 ++ doc/dsm/mods/Readme.mod_sys.txt | 6 +++- 3 files changed, 68 insertions(+), 2 deletions(-) diff --git a/apps/dsm/mods/mod_sys/ModSys.cpp b/apps/dsm/mods/mod_sys/ModSys.cpp index 715b9c2..ea0b77f 100644 --- a/apps/dsm/mods/mod_sys/ModSys.cpp +++ b/apps/dsm/mods/mod_sys/ModSys.cpp @@ -47,6 +47,10 @@ MOD_ACTIONEXPORT_BEGIN(MOD_CLS_NAME) { DEF_CMD("sys.unlinkArray", SCUnlinkArrayAction); DEF_CMD("sys.tmpnam", SCTmpNamAction); DEF_CMD("sys.popen", SCPopenAction); + + DEF_CMD("sys.getTimestamp", SCSysGetTimestampAction); + DEF_CMD("sys.subTimestamp", SCSysSubTimestampAction); + } MOD_ACTIONEXPORT_END; MOD_CONDITIONEXPORT_BEGIN(MOD_CLS_NAME) { @@ -258,7 +262,6 @@ EXEC_ACTION_START(SCTmpNamAction) { } } EXEC_ACTION_END; - CONST_ACTION_2P(SCPopenAction, '=', false); EXEC_ACTION_START(SCPopenAction) { string dst_var = par1; @@ -300,3 +303,59 @@ EXEC_ACTION_START(SCPopenAction) { DBG("child process returned status %d\n", status); } EXEC_ACTION_END; + +EXEC_ACTION_START(SCSysGetTimestampAction) { + string varname = resolveVars(arg, sess, sc_sess, event_params); + struct timeval tv; + gettimeofday(&tv, NULL); + + // long unsigned msecs = tv.tv_sec * 1000 + tv.tv_usec / 1000; + + char ms_buf[40]; + snprintf(ms_buf, 40, "%lu", tv.tv_sec); + sc_sess->var[varname+".tv_sec"] = ms_buf; + + snprintf(ms_buf, 40, "%lu", tv.tv_usec); + sc_sess->var[varname+".tv_usec"] = ms_buf; + + DBG("got timestamp $%s=%s, $%s=%s, \n", + (varname+".tv_sec").c_str(), sc_sess->var[varname+".tv_sec"].c_str(), + (varname+".tv_usec").c_str(), sc_sess->var[varname+".tv_usec"].c_str() + ); + +} EXEC_ACTION_END; + +CONST_ACTION_2P(SCSysSubTimestampAction, ',', false); +EXEC_ACTION_START(SCSysSubTimestampAction) { + string t1 = resolveVars(par1, sess, sc_sess, event_params); + string t2 = resolveVars(par2, sess, sc_sess, event_params); + + struct timeval tv1; + struct timeval tv2; + + tv1.tv_sec = atol(sc_sess->var[t1+".tv_sec"].c_str()); + tv1.tv_usec = atol(sc_sess->var[t1+".tv_usec"].c_str()); + + tv2.tv_sec = atol(sc_sess->var[t2+".tv_sec"].c_str()); + tv2.tv_usec = atol(sc_sess->var[t2+".tv_usec"].c_str()); + + struct timeval diff; + timersub(&tv1,&tv2,&diff); + + char ms_buf[40]; + snprintf(ms_buf, 40, "%lu", diff.tv_sec); + sc_sess->var[t1+".tv_sec"] = ms_buf; + + snprintf(ms_buf, 40, "%lu", diff.tv_usec); + sc_sess->var[t1+".tv_usec"] = ms_buf; + + // may be overflowing - use only if timestamps known + snprintf(ms_buf, 40, "%lu", diff.tv_sec * 1000 + diff.tv_usec / 1000); + sc_sess->var[t1+".msec"] = ms_buf; + + DBG("sub $%s = %s, $%s = %s, $%s = %s\n", + (t1+".tv_sec").c_str(), sc_sess->var[t1+".tv_sec"].c_str(), + (t1+".tv_usec").c_str(), sc_sess->var[t1+".tv_usec"].c_str(), + (t1+".msec").c_str(), sc_sess->var[t1+".msec"].c_str() + ); +} EXEC_ACTION_END; diff --git a/apps/dsm/mods/mod_sys/ModSys.h b/apps/dsm/mods/mod_sys/ModSys.h index c640090..d7b1310 100644 --- a/apps/dsm/mods/mod_sys/ModSys.h +++ b/apps/dsm/mods/mod_sys/ModSys.h @@ -40,4 +40,7 @@ DEF_ACTION_1P(SCUnlinkAction); DEF_ACTION_2P(SCUnlinkArrayAction); DEF_ACTION_1P(SCTmpNamAction); DEF_ACTION_2P(SCPopenAction); + +DEF_ACTION_1P(SCSysGetTimestampAction); +DEF_ACTION_2P(SCSysSubTimestampAction); #endif diff --git a/doc/dsm/mods/Readme.mod_sys.txt b/doc/dsm/mods/Readme.mod_sys.txt index 5e10c1d..f48047b 100644 --- a/doc/dsm/mods/Readme.mod_sys.txt +++ b/doc/dsm/mods/Readme.mod_sys.txt @@ -7,7 +7,6 @@ Actions: Array version of unlink (prefix/filename_0 .. prefix/filename_$filename_size) sys.tmpnam(string varname) - sys.popen($var="command") execute a command (using popen) and save result in $var example: @@ -16,7 +15,12 @@ Actions: #type=="popen", #cause==reason if fails to exec #type=="pclose", #cause==reason if fails to close pipe + sys.getTimestamp(string varname) - get timestamp in varname.tv_sec/varname.tv_usec + sys.subTimestamp(ts1, ts2) - subtract $ts2 from $ts1, save result in + $ts1.sec, $ts1.msec and $ts1.usec Conditions: sys.file_exists(string fname) sys.file_not_exists(string fname) + + _______________________________________________ Semsdev mailing list [email protected] http://lists.iptel.org/mailman/listinfo/semsdev
