]> granicus.if.org Git - strace/commitdiff
v4l2: streamline logic
authorEugene Syromyatnikov <evgsyr@gmail.com>
Sat, 26 Aug 2017 23:12:08 +0000 (01:12 +0200)
committerEugene Syromyatnikov <evgsyr@gmail.com>
Mon, 28 Aug 2017 00:33:20 +0000 (02:33 +0200)
Move exiting path out of if (entering(tcp)) { ... return 0; } else,
provide common exit point in v4l2_ioctl handler, use break instead of
return in specific command handlers.

* v4l2.c (print_v4l2_format, print_v4l2_buffer, print_v4l2_standard,
print_v4l2_input, print_v4l2_frmivalenum): Move exiting path out of else
par of the entering(tcp) condition.
(v4l2_ioctl): Add return RVAL_DECODED | 1 at the end of function.
(v4l2_ioctl) <case VIDIOC_S_STD, case VIDIOC_S_INPUT>: Replace return
with break.

v4l2.c

diff --git a/v4l2.c b/v4l2.c
index f37910cbf9ae9e3bd6f72c87a3083ed3e284a094..a025620e769a81f09ec0069f512f9f9d4113ab12 100644 (file)
--- a/v4l2.c
+++ b/v4l2.c
@@ -363,13 +363,15 @@ print_v4l2_format(struct tcb *const tcp, const kernel_ulong_t arg,
                        tprints("}");
                        return RVAL_DECODED | 1;
                }
-       } else {
-               if (!syserror(tcp) && !umove(tcp, arg, &f)) {
-                       const char *delim = is_get ? ", " : " => ";
-                       print_v4l2_format_fmt(tcp, delim, &f);
-               }
-               tprints("}");
+
+               return 0;
        }
+
+       if (!syserror(tcp) && !umove(tcp, arg, &f))
+               print_v4l2_format_fmt(tcp, is_get ? ", " : " => ", &f);
+
+       tprints("}");
+
        return 1;
 }
 
@@ -425,31 +427,35 @@ print_v4l2_buffer(struct tcb *const tcp, const unsigned int code,
                printxval(v4l2_buf_types, b.type, "V4L2_BUF_TYPE_???");
                if (code != VIDIOC_DQBUF)
                        tprintf(", index=%u", b.index);
-       } else {
-               if (!syserror(tcp) && umove(tcp, arg, &b) == 0) {
-                       if (code == VIDIOC_DQBUF)
-                               tprintf(", index=%u", b.index);
-                       tprints(", memory=");
-                       printxval(v4l2_memories, b.memory, "V4L2_MEMORY_???");
-
-                       if (b.memory == V4L2_MEMORY_MMAP) {
-                               tprintf(", m.offset=%#x", b.m.offset);
-                       } else if (b.memory == V4L2_MEMORY_USERPTR) {
-                               tprints(", m.userptr=");
-                               printaddr(b.m.userptr);
-                       }
 
-                       tprintf(", length=%u, bytesused=%u, flags=",
-                               b.length, b.bytesused);
-                       printflags(v4l2_buf_flags, b.flags, "V4L2_BUF_FLAG_???");
-                       if (code == VIDIOC_DQBUF) {
-                               tprints(", timestamp = ");
-                               MPERS_FUNC_NAME(print_struct_timeval)(&b.timestamp);
-                       }
-                       tprints(", ...");
+               return 0;
+       }
+
+       if (!syserror(tcp) && !umove(tcp, arg, &b)) {
+               if (code == VIDIOC_DQBUF)
+                       tprintf(", index=%u", b.index);
+               tprints(", memory=");
+               printxval(v4l2_memories, b.memory, "V4L2_MEMORY_???");
+
+               if (b.memory == V4L2_MEMORY_MMAP) {
+                       tprintf(", m.offset=%#x", b.m.offset);
+               } else if (b.memory == V4L2_MEMORY_USERPTR) {
+                       tprints(", m.userptr=");
+                       printaddr(b.m.userptr);
                }
-               tprints("}");
+
+               tprintf(", length=%u, bytesused=%u, flags=",
+                       b.length, b.bytesused);
+               printflags(v4l2_buf_flags, b.flags, "V4L2_BUF_FLAG_???");
+               if (code == VIDIOC_DQBUF) {
+                       tprints(", timestamp = ");
+                       MPERS_FUNC_NAME(print_struct_timeval)(&b.timestamp);
+               }
+               tprints(", ...");
        }
+
+       tprints("}");
+
        return 1;
 }
 
@@ -561,15 +567,19 @@ print_v4l2_standard(struct tcb *const tcp, const kernel_ulong_t arg)
                if (umove_or_printaddr(tcp, arg, &s))
                        return RVAL_DECODED | 1;
                tprintf("{index=%u", s.index);
-       } else {
-               if (!syserror(tcp) && !umove(tcp, arg, &s)) {
-                       PRINT_FIELD_CSTRING(", ", s, name);
-                       tprintf(", frameperiod=" FMT_FRACT,
-                               ARGS_FRACT(s.frameperiod));
-                       tprintf(", framelines=%d", s.framelines);
-               }
-               tprints("}");
+
+               return 0;
+       }
+
+       if (!syserror(tcp) && !umove(tcp, arg, &s)) {
+               PRINT_FIELD_CSTRING(", ", s, name);
+               tprintf(", frameperiod=" FMT_FRACT,
+                       ARGS_FRACT(s.frameperiod));
+               tprintf(", framelines=%d", s.framelines);
        }
+
+       tprints("}");
+
        return 1;
 }
 
@@ -585,15 +595,18 @@ print_v4l2_input(struct tcb *const tcp, const kernel_ulong_t arg)
                if (umove_or_printaddr(tcp, arg, &i))
                        return RVAL_DECODED | 1;
                tprintf("{index=%u", i.index);
-       } else {
-               if (!syserror(tcp) && !umove(tcp, arg, &i)) {
-                       PRINT_FIELD_CSTRING(", ", i, name);
-                       tprints(", type=");
-                       printxval(v4l2_input_types, i.type,
-                                 "V4L2_INPUT_TYPE_???");
-               }
-               tprints("}");
+
+               return 0;
+       }
+
+       if (!syserror(tcp) && !umove(tcp, arg, &i)) {
+               PRINT_FIELD_CSTRING(", ", i, name);
+               tprints(", type=");
+               printxval(v4l2_input_types, i.type, "V4L2_INPUT_TYPE_???");
        }
+
+       tprints("}");
+
        return 1;
 }
 
@@ -622,6 +635,7 @@ print_v4l2_control(struct tcb *const tcp, const kernel_ulong_t arg,
        }
 
        tprints("}");
+
        return 1;
 }
 
@@ -729,8 +743,10 @@ print_v4l2_cropcap(struct tcb *const tcp, const kernel_ulong_t arg)
                        return RVAL_DECODED | 1;
                tprints("{type=");
                printxval(v4l2_buf_types, c.type, "V4L2_BUF_TYPE_???");
+
                return 0;
        }
+
        if (!syserror(tcp) && !umove(tcp, arg, &c)) {
                tprintf(", bounds=" FMT_RECT
                        ", defrect=" FMT_RECT
@@ -739,7 +755,9 @@ print_v4l2_cropcap(struct tcb *const tcp, const kernel_ulong_t arg)
                        ARGS_RECT(c.defrect),
                        ARGS_FRACT(c.pixelaspect));
        }
+
        tprints("}");
+
        return 1;
 }
 
@@ -764,6 +782,7 @@ print_v4l2_crop(struct tcb *const tcp, const kernel_ulong_t arg,
        }
 
        tprints("}");
+
        return RVAL_DECODED | 1;
 }
 
@@ -896,6 +915,7 @@ print_v4l2_frmivalenum(struct tcb *const tcp, const kernel_ulong_t arg)
                tprintf(", width=%u, height=%u", f.width, f.height);
                return 0;
        }
+
        if (!syserror(tcp) && !umove(tcp, arg, &f)) {
                tprints(", type=");
                printxval(v4l2_frameinterval_types, f.type,
@@ -915,7 +935,9 @@ print_v4l2_frmivalenum(struct tcb *const tcp, const kernel_ulong_t arg)
                        break;
                }
        }
+
        tprints("}");
+
        return 1;
 }
 #endif /* VIDIOC_ENUM_FRAMEINTERVALS */
@@ -924,6 +946,9 @@ print_v4l2_frmivalenum(struct tcb *const tcp, const kernel_ulong_t arg)
 static int
 print_v4l2_create_buffers(struct tcb *const tcp, const kernel_ulong_t arg)
 {
+       static const char fmt[] = "{index=%u, count=%u}";
+       static char outstr[sizeof(fmt) + sizeof(int) * 6];
+
        struct_v4l2_create_buffers b;
 
        if (entering(tcp)) {
@@ -939,16 +964,15 @@ print_v4l2_create_buffers(struct tcb *const tcp, const kernel_ulong_t arg)
                                      (struct_v4l2_format *) &b.format);
                tprints("}}");
                return 0;
-       } else {
-               static const char fmt[] = "{index=%u, count=%u}";
-               static char outstr[sizeof(fmt) + sizeof(int) * 6];
-
-               if (syserror(tcp) || umove(tcp, arg, &b) < 0)
-                       return 1;
-               sprintf(outstr, fmt, b.index, b.count);
-               tcp->auxstr = outstr;
-               return 1 + RVAL_STR;
        }
+
+       if (syserror(tcp) || umove(tcp, arg, &b))
+               return 1;
+
+       sprintf(outstr, fmt, b.index, b.count);
+       tcp->auxstr = outstr;
+
+       return 1 | RVAL_STR;
 }
 #endif /* VIDIOC_CREATE_BUFS */
 
@@ -1000,7 +1024,7 @@ MPERS_PRINTER_DECL(int, v4l2_ioctl, struct tcb *const tcp,
        case VIDIOC_S_STD: /* W */
                tprints(", ");
                printnum_int64(tcp, arg, "%#" PRIx64);
-               return RVAL_DECODED | 1;
+               break;
 
        case VIDIOC_ENUMSTD: /* RW */
                return print_v4l2_standard(tcp, arg);
@@ -1026,7 +1050,7 @@ MPERS_PRINTER_DECL(int, v4l2_ioctl, struct tcb *const tcp,
        case VIDIOC_S_INPUT: /* RW */
                tprints(", ");
                printnum_int(tcp, arg, "%u");
-               return RVAL_DECODED | 1;
+               break;
 
        case VIDIOC_CROPCAP: /* RW */
                return print_v4l2_cropcap(tcp, arg);
@@ -1061,4 +1085,6 @@ MPERS_PRINTER_DECL(int, v4l2_ioctl, struct tcb *const tcp,
        default:
                return RVAL_DECODED;
        }
+
+       return RVAL_DECODED | 1;
 }