summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--tapset/ChangeLog5
-rw-r--r--tapset/aux_syscalls.stp56
2 files changed, 60 insertions, 1 deletions
diff --git a/tapset/ChangeLog b/tapset/ChangeLog
index 6f188171..d01902db 100644
--- a/tapset/ChangeLog
+++ b/tapset/ChangeLog
@@ -1,3 +1,8 @@
+2006-06-26 Martin Hunt <hunt@redhat.com>
+
+ * aux_syscalls.stp (_stp_ctime): New function.
+ (_struct_utimbuf_u): New function.
+
2006-06-25 Li Guanglei <guanglei@cn.ibm.com>
* syscalls.stp: Changes to AIO related syscalls(io_setup,
diff --git a/tapset/aux_syscalls.stp b/tapset/aux_syscalls.stp
index fdfa60f2..cfbe3192 100644
--- a/tapset/aux_syscalls.stp
+++ b/tapset/aux_syscalls.stp
@@ -39,12 +39,66 @@ function _struct_timezone_u:string(uaddr:long)
strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN);
else {
if(_stp_copy_from_user((char*)&tz,ptr,sizeof(struct timezone)) == 0)
- snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%d, %d]", tz.tz_minuteswest, tz.tz_dsttime);
+ snprintf(THIS->__retvalue, MAXSTRINGLEN, "[%d, %d]", tz.tz_minuteswest, tz.tz_dsttime);
else
strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN);
}
%}
+%{
+static const int days_in_month[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+static void _stp_ctime(time_t t, char *buf, int buflen)
+{
+ int mon=1, day, hour, min, sec, num, d, year = 1970;
+
+ sec = t % 60;
+ min = t/60 % 60;
+ hour = t/(60*60) % 24;
+ day = t/(24*60*60);
+
+ while(1) {
+ d = (!(year % 4) && ((year % 100) || !(year % 400))) ? 366 : 365;
+ if (day >= d)
+ day -= d;
+ else
+ break;
+ year++;
+ }
+ while (mon < 12) {
+ num = days_in_month[mon-1];
+ if (mon == 2 && d == 366)
+ num++;
+ if (day >= num)
+ day -= num;
+ else
+ break;
+ mon++;
+ }
+
+ snprintf(buf, buflen, "%4d/%02d/%02d-%02d:%02d:%02d", year, mon, day+1, hour, min, sec);
+ buf[buflen-1] = 0;
+}
+%}
+
+function _struct_utimbuf_u:string(uaddr:long)
+%{ /* pure */
+ #include <linux/utime.h>
+ struct utimbuf ubuf;
+ static char abuf[24], mbuf[24];
+ char *ptr = (char *)(unsigned long)THIS->uaddr;
+
+ if (ptr == NULL)
+ strlcpy (THIS->__retvalue, "NULL", MAXSTRINGLEN);
+ else {
+ if(_stp_copy_from_user((char*)&ubuf,ptr,sizeof(struct utimbuf)) == 0) {
+ _stp_ctime(ubuf.actime, abuf, 24);
+ _stp_ctime(ubuf.modtime, mbuf, 24);
+ snprintf(THIS->__retvalue, MAXSTRINGLEN, "%s, %s", abuf, mbuf);
+ } else
+ strlcpy (THIS->__retvalue, "UNKNOWN", MAXSTRINGLEN);
+ }
+%}
+
function _struct_timespec_u:string(uaddr:long)
%{ /* pure */
struct timespec ts;