]> granicus.if.org Git - strace/blobdiff - syscall.c
tests: move F_OFD_SETLK* checks from fcntl64.c to fcntl-common.c
[strace] / syscall.c
index bbc2068da859c5c6d9bac1d3634f1182046dd504..9eb0a9ec4e7c3f5ea47ffce7bbcf37e765433e87 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -86,6 +86,13 @@ static const struct_sysent sysent2[] = {
 /* Now undef them since short defines cause wicked namespace pollution. */
 #include "sysent_shorthand_undefs.h"
 
+const char *const errnoent[] = {
+#include "errnoent.h"
+};
+const char *const signalent[] = {
+#include "signalent.h"
+
+};
 /*
  * `ioctlent[012].h' files are automatically generated by the auxiliary
  * program `ioctlsort', such that the list is sorted by the `code' field.
@@ -94,23 +101,11 @@ static const struct_sysent sysent2[] = {
  * in "/usr/include".
  */
 
-const char *const errnoent0[] = {
-#include "errnoent.h"
-};
-const char *const signalent0[] = {
-#include "signalent.h"
-};
 const struct_ioctlent ioctlent0[] = {
 #include "ioctlent0.h"
 };
 
 #if SUPPORTED_PERSONALITIES > 1
-static const char *const errnoent1[] = {
-# include "errnoent1.h"
-};
-static const char *const signalent1[] = {
-# include "signalent1.h"
-};
 static const struct_ioctlent ioctlent1[] = {
 # include "ioctlent1.h"
 };
@@ -125,12 +120,6 @@ static const struct_printers printers1 = {
 #endif
 
 #if SUPPORTED_PERSONALITIES > 2
-static const char *const errnoent2[] = {
-# include "errnoent2.h"
-};
-static const char *const signalent2[] = {
-# include "signalent2.h"
-};
 static const struct_ioctlent ioctlent2[] = {
 # include "ioctlent2.h"
 };
@@ -150,26 +139,6 @@ enum {
 #endif
 };
 
-enum {
-       nerrnos0 = ARRAY_SIZE(errnoent0)
-#if SUPPORTED_PERSONALITIES > 1
-       , nerrnos1 = ARRAY_SIZE(errnoent1)
-# if SUPPORTED_PERSONALITIES > 2
-       , nerrnos2 = ARRAY_SIZE(errnoent2)
-# endif
-#endif
-};
-
-enum {
-       nsignals0 = ARRAY_SIZE(signalent0)
-#if SUPPORTED_PERSONALITIES > 1
-       , nsignals1 = ARRAY_SIZE(signalent1)
-# if SUPPORTED_PERSONALITIES > 2
-       , nsignals2 = ARRAY_SIZE(signalent2)
-# endif
-#endif
-};
-
 enum {
        nioctlents0 = ARRAY_SIZE(ioctlent0)
 #if SUPPORTED_PERSONALITIES > 1
@@ -182,15 +151,13 @@ enum {
 
 #if SUPPORTED_PERSONALITIES > 1
 const struct_sysent *sysent = sysent0;
-const char *const *errnoent = errnoent0;
-const char *const *signalent = signalent0;
 const struct_ioctlent *ioctlent = ioctlent0;
 const struct_printers *printers = &printers0;
 #endif
 
+const unsigned int nerrnos = ARRAY_SIZE(errnoent);
+const unsigned int nsignals = ARRAY_SIZE(signalent);
 unsigned nsyscalls = nsyscalls0;
-unsigned nerrnos = nerrnos0;
-unsigned nsignals = nsignals0;
 unsigned nioctlents = nioctlents0;
 
 const unsigned int nsyscall_vec[SUPPORTED_PERSONALITIES] = {
@@ -265,33 +232,21 @@ set_personality(unsigned int personality)
 
        switch (personality) {
        case 0:
-               errnoent = errnoent0;
-               nerrnos = nerrnos0;
                ioctlent = ioctlent0;
                nioctlents = nioctlents0;
-               signalent = signalent0;
-               nsignals = nsignals0;
                printers = &printers0;
                break;
 
        case 1:
-               errnoent = errnoent1;
-               nerrnos = nerrnos1;
                ioctlent = ioctlent1;
                nioctlents = nioctlents1;
-               signalent = signalent1;
-               nsignals = nsignals1;
                printers = &printers1;
                break;
 
 # if SUPPORTED_PERSONALITIES > 2
        case 2:
-               errnoent = errnoent2;
-               nerrnos = nerrnos2;
                ioctlent = ioctlent2;
                nioctlents = nioctlents2;
-               signalent = signalent2;
-               nsignals = nsignals2;
                printers = &printers2;
                break;
 # endif
@@ -495,6 +450,18 @@ err_name(unsigned long err)
        return NULL;
 }
 
+static void
+print_err_ret(kernel_ulong_t ret, unsigned long u_error)
+{
+       const char *u_error_str = err_name(u_error);
+
+       if (u_error_str)
+               tprintf("= %" PRI_kld " %s (%s)",
+                       ret, u_error_str, strerror(u_error));
+       else
+               tprintf("= %" PRI_kld " (errno %lu)", ret, u_error);
+}
+
 static long get_regs(struct tcb *);
 static int get_syscall_args(struct tcb *);
 static int get_syscall_result(struct tcb *);
@@ -815,20 +782,17 @@ syscall_exiting_trace(struct tcb *tcp, struct timespec *ts, int res)
 
        tprints(") ");
        tabto();
-       unsigned long u_error = tcp->u_error;
 
        if (raw(tcp)) {
-               if (u_error) {
-                       tprintf("= -1 (errno %lu)", u_error);
-               } else {
+               if (tcp->u_error)
+                       print_err_ret(tcp->u_rval, tcp->u_error);
+               else
                        tprintf("= %#" PRI_klx, tcp->u_rval);
-               }
+
                if (syscall_tampered(tcp))
                        tprints(" (INJECTED)");
-       } else if (!(sys_res & RVAL_NONE) && u_error) {
-               const char *u_error_str;
-
-               switch (u_error) {
+       } else if (!(sys_res & RVAL_NONE) && tcp->u_error) {
+               switch (tcp->u_error) {
                /* Blocked signals do not interrupt any syscalls.
                 * In this case syscalls don't return ERESTARTfoo codes.
                 *
@@ -883,13 +847,7 @@ syscall_exiting_trace(struct tcb *tcp, struct timespec *ts, int res)
                        tprints("= ? ERESTART_RESTARTBLOCK (Interrupted by signal)");
                        break;
                default:
-                       u_error_str = err_name(u_error);
-                       if (u_error_str)
-                               tprintf("= %" PRI_kld " %s (%s)", tcp->u_rval,
-                                       u_error_str, strerror(u_error));
-                       else
-                               tprintf("= %" PRI_kld " %lu (%s)", tcp->u_rval,
-                                       u_error, strerror(u_error));
+                       print_err_ret(tcp->u_rval, tcp->u_error);
                        break;
                }
                if (syscall_tampered(tcp))