]> granicus.if.org Git - strace/commitdiff
Implement syslog syscall decoder
authorDmitry V. Levin <ldv@altlinux.org>
Tue, 13 Mar 2012 15:28:01 +0000 (15:28 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Tue, 13 Mar 2012 15:28:01 +0000 (15:28 +0000)
* linux/dummy.h (sys_syslog): Remove.
* linux/syscall.h (sys_syslog): New prototype.
* system.c (syslog_action_type): New xlat structure.
(sys_syslog): New function.

linux/dummy.h
linux/syscall.h
system.c

index f22a8d32f41bcc69dea194be21ad5ec5cbd89d3e..08b5b109e826be2bb82c414d6a74460f5ea7419f 100644 (file)
@@ -47,7 +47,6 @@
 #define        sys_rt_tgsigqueueinfo   printargs
 #define        sys_sync_file_range     printargs
 #define        sys_sysfs               printargs
-#define        sys_syslog              printargs
 #define        sys_vm86old             printargs
 #define        sys_vm86                printargs
 
index 180397039d4a38c46347d47fe0ba1dc139e9e802..b74c6c40874b23d5084003cf57d4b238851f5b1b 100644 (file)
@@ -268,6 +268,7 @@ int sys_swapon();
 int sys_symlinkat();
 int sys_sysctl();
 int sys_sysinfo();
+int sys_syslog();
 int sys_tee();
 int sys_tgkill();
 int sys_time();
index 61a614a7fe4e70138548848d54bef97a6fe703b3..549844947176e3d065befa5895e53d8eb80e80c5 100644 (file)
--- a/system.c
+++ b/system.c
@@ -214,6 +214,72 @@ sys_personality(struct tcb *tcp)
        return 0;
 }
 
+enum {
+       SYSLOG_ACTION_CLOSE = 0,
+       SYSLOG_ACTION_OPEN,
+       SYSLOG_ACTION_READ,
+       SYSLOG_ACTION_READ_ALL,
+       SYSLOG_ACTION_READ_CLEAR,
+       SYSLOG_ACTION_CLEAR,
+       SYSLOG_ACTION_CONSOLE_OFF,
+       SYSLOG_ACTION_CONSOLE_ON,
+       SYSLOG_ACTION_CONSOLE_LEVEL,
+       SYSLOG_ACTION_SIZE_UNREAD,
+       SYSLOG_ACTION_SIZE_BUFFER
+};
+
+static const struct xlat syslog_action_type[] = {
+       { SYSLOG_ACTION_CLOSE,          "SYSLOG_ACTION_CLOSE"           },
+       { SYSLOG_ACTION_OPEN,           "SYSLOG_ACTION_OPEN"            },
+       { SYSLOG_ACTION_READ,           "SYSLOG_ACTION_READ"            },
+       { SYSLOG_ACTION_READ_ALL,       "SYSLOG_ACTION_READ_ALL"        },
+       { SYSLOG_ACTION_READ_CLEAR,     "SYSLOG_ACTION_READ_CLEAR"      },
+       { SYSLOG_ACTION_CLEAR,          "SYSLOG_ACTION_CLEAR"           },
+       { SYSLOG_ACTION_CONSOLE_OFF,    "SYSLOG_ACTION_CONSOLE_OFF"     },
+       { SYSLOG_ACTION_CONSOLE_ON,     "SYSLOG_ACTION_CONSOLE_ON"      },
+       { SYSLOG_ACTION_CONSOLE_LEVEL,  "SYSLOG_ACTION_CONSOLE_LEVEL"   },
+       { SYSLOG_ACTION_SIZE_UNREAD,    "SYSLOG_ACTION_SIZE_UNREAD"     },
+       { SYSLOG_ACTION_SIZE_BUFFER,    "SYSLOG_ACTION_SIZE_BUFFER"     },
+       { 0,                            NULL                            }
+};
+
+int
+sys_syslog(struct tcb *tcp)
+{
+       int type = tcp->u_arg[0];
+
+       if (entering(tcp)) {
+               /* type */
+               printxval(syslog_action_type, type, "SYSLOG_ACTION_???");
+               tprints(", ");
+       }
+
+       switch (type) {
+               case SYSLOG_ACTION_READ:
+               case SYSLOG_ACTION_READ_ALL:
+               case SYSLOG_ACTION_READ_CLEAR:
+                       if (entering(tcp))
+                               return 0;
+                       break;
+               default:
+                       if (entering(tcp)) {
+                               tprintf("%#lx, %lu",
+                                       tcp->u_arg[1], tcp->u_arg[2]);
+                       }
+                       return 0;
+       }
+
+       /* bufp */
+       if (syserror(tcp))
+               tprintf("%#lx", tcp->u_arg[1]);
+       else
+               printstr(tcp, tcp->u_arg[1], tcp->u_rval);
+       /* len */
+       tprintf(", %d", (int) tcp->u_arg[2]);
+
+       return 0;
+}
+
 #include <linux/reboot.h>
 static const struct xlat bootflags1[] = {
        { LINUX_REBOOT_MAGIC1,  "LINUX_REBOOT_MAGIC1"   },