| /* |
| * Check decoding of PTP_* commands of ioctl syscall. |
| * |
| * Copyright (c) 2018 Harsha Sharma <harshasharmaiitr@gmail.com> |
| * Copyright (c) 2018 The strace developers. |
| * All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. Redistributions in binary form must reproduce the above copyright |
| * notice, this list of conditions and the following disclaimer in the |
| * documentation and/or other materials provided with the distribution. |
| * 3. The name of the author may not be used to endorse or promote products |
| * derived from this software without specific prior written permission. |
| * |
| * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR |
| * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
| * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. |
| * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, |
| * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT |
| * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
| * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| */ |
| |
| #include "tests.h" |
| |
| #ifdef HAVE_STRUCT_PTP_SYS_OFFSET |
| |
| #include <errno.h> |
| #include <fcntl.h> |
| #include <inttypes.h> |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <unistd.h> |
| #include <sys/ioctl.h> |
| #include <linux/ptp_clock.h> |
| |
| #include "xlat.h" |
| #include "xlat/ptp_flags_options.h" |
| |
| static void |
| test_no_device(void) |
| { |
| TAIL_ALLOC_OBJECT_CONST_PTR(struct ptp_clock_caps, caps); |
| fill_memory(caps, sizeof(*caps)); |
| |
| TAIL_ALLOC_OBJECT_CONST_PTR(struct ptp_sys_offset, sysoff); |
| fill_memory(sysoff, sizeof(*sysoff)); |
| |
| TAIL_ALLOC_OBJECT_CONST_PTR(struct ptp_extts_request, extts); |
| fill_memory(extts, sizeof(*extts)); |
| |
| TAIL_ALLOC_OBJECT_CONST_PTR(struct ptp_perout_request, perout); |
| fill_memory(perout, sizeof(*perout)); |
| |
| int saved_errno; |
| |
| /* PTP_CLOCK_GETCAPS */ |
| ioctl(-1, PTP_CLOCK_GETCAPS, NULL); |
| printf("ioctl(-1, PTP_CLOCK_GETCAPS, NULL) = -1 EBADF (%m)\n"); |
| ioctl(-1, PTP_CLOCK_GETCAPS, caps); |
| printf("ioctl(-1, PTP_CLOCK_GETCAPS, %p) = -1 EBADF (%m)\n", caps); |
| |
| /* PTP_SYS_OFFSET */ |
| ioctl(-1, PTP_SYS_OFFSET, NULL); |
| printf("ioctl(-1, PTP_SYS_OFFSET, NULL) = -1 EBADF (%m)\n"); |
| ioctl(-1, PTP_SYS_OFFSET, sysoff); |
| printf("ioctl(-1, PTP_SYS_OFFSET, {n_samples=%u}) = -1 EBADF (%m)\n", |
| sysoff->n_samples); |
| |
| /* PTP_ENABLE_PPS */ |
| ioctl(-1, PTP_ENABLE_PPS, 0); |
| printf("ioctl(-1, PTP_ENABLE_PPS, 0) = -1 EBADF (%m)\n"); |
| ioctl(-1, PTP_ENABLE_PPS, 1); |
| printf("ioctl(-1, PTP_ENABLE_PPS, 1) = -1 EBADF (%m)\n"); |
| |
| /* PTP_EXTTS_REQUEST */ |
| ioctl(-1, PTP_EXTTS_REQUEST, NULL); |
| printf("ioctl(-1, PTP_EXTTS_REQUEST, NULL) = -1 EBADF (%m)\n"); |
| ioctl(-1, PTP_EXTTS_REQUEST, extts); |
| saved_errno = errno; |
| printf("ioctl(-1, PTP_EXTTS_REQUEST, {index=%d, flags=", extts->index); |
| printflags(ptp_flags_options, extts->flags, "PTP_???"); |
| errno = saved_errno; |
| printf("}) = -1 EBADF (%m)\n"); |
| |
| /* PTP_PEROUT_REQUEST */ |
| ioctl(-1, PTP_PEROUT_REQUEST, NULL); |
| printf("ioctl(-1, PTP_PEROUT_REQUEST, NULL) = -1 EBADF (%m)\n"); |
| ioctl(-1, PTP_PEROUT_REQUEST, perout); |
| saved_errno = errno; |
| printf("ioctl(-1, PTP_PEROUT_REQUEST, {start={sec=%" PRId64 |
| ", nsec=%" PRIu32 "}, period={sec=%" PRId64 ", nsec=%" PRIu32 "}" |
| ", index=%d, flags=", |
| (int64_t) perout->start.sec, perout->start.nsec, |
| (int64_t)perout->period.sec, perout->period.nsec, perout->index); |
| printflags(ptp_flags_options, perout->flags, "PTP_???"); |
| errno = saved_errno; |
| printf("}) = -1 EBADF (%m)\n"); |
| |
| /* unrecognized */ |
| ioctl(-1, _IOC(_IOC_READ, PTP_CLK_MAGIC, 0xff, 0xfe), 0); |
| printf("ioctl(-1, _IOC(_IOC_READ, %#x, 0xff, 0xfe), 0)" |
| " = -1 EBADF (%m)\n", PTP_CLK_MAGIC); |
| |
| const unsigned long arg = (unsigned long) 0xfacefeeddeadbeefULL; |
| ioctl(-1, _IOC(_IOC_WRITE, PTP_CLK_MAGIC, 0xfd, 0xfc), arg); |
| printf("ioctl(-1, _IOC(_IOC_WRITE, %#x, 0xfd, 0xfc), %#lx)" |
| " = -1 EBADF (%m)\n", PTP_CLK_MAGIC, arg); |
| } |
| |
| int |
| main(void) |
| { |
| test_no_device(); |
| |
| puts("+++ exited with 0 +++"); |
| return 0; |
| } |
| |
| #else |
| |
| SKIP_MAIN_UNDEFINED("HAVE_STRUCT_PTP_SYS_OFFSET") |
| |
| #endif /* HAVE_STRUCT_PTP_SYS_OFFSET */ |