print_timespec.c revision 39bac055674d23770b9a724221b728e443196ea7
1/* 2 * Copyright (c) 2015-2016 Dmitry V. Levin <ldv@altlinux.org> 3 * Copyright (c) 2016-2017 The strace developers. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#include "defs.h" 30 31#include DEF_MPERS_TYPE(timespec_t) 32 33typedef struct timespec timespec_t; 34 35#include MPERS_DEFS 36 37#ifndef UTIME_NOW 38# define UTIME_NOW ((1l << 30) - 1l) 39#endif 40#ifndef UTIME_OMIT 41# define UTIME_OMIT ((1l << 30) - 2l) 42#endif 43 44static const char timespec_fmt[] = "{tv_sec=%lld, tv_nsec=%llu}"; 45 46static void 47print_timespec_t(const timespec_t *t) 48{ 49 tprintf(timespec_fmt, (long long) t->tv_sec, 50 zero_extend_signed_to_ull(t->tv_nsec)); 51} 52 53static void 54print_timespec_t_utime(const timespec_t *t) 55{ 56 switch (t->tv_nsec) { 57 case UTIME_NOW: 58 tprints("UTIME_NOW"); 59 break; 60 case UTIME_OMIT: 61 tprints("UTIME_OMIT"); 62 break; 63 default: 64 print_timespec_t(t); 65 tprints_comment(sprinttime_nsec(t->tv_sec, 66 zero_extend_signed_to_ull(t->tv_nsec))); 67 break; 68 } 69} 70 71MPERS_PRINTER_DECL(void, print_timespec, 72 struct tcb *const tcp, const kernel_ulong_t addr) 73{ 74 timespec_t t; 75 76 if (umove_or_printaddr(tcp, addr, &t)) 77 return; 78 79 print_timespec_t(&t); 80} 81 82MPERS_PRINTER_DECL(const char *, sprint_timespec, 83 struct tcb *const tcp, const kernel_ulong_t addr) 84{ 85 timespec_t t; 86 static char buf[sizeof(timespec_fmt) + 3 * sizeof(t)]; 87 88 if (!addr) { 89 strcpy(buf, "NULL"); 90 } else if (!verbose(tcp) || (exiting(tcp) && syserror(tcp)) || 91 umove(tcp, addr, &t)) { 92 snprintf(buf, sizeof(buf), "%#" PRI_klx, addr); 93 } else { 94 snprintf(buf, sizeof(buf), timespec_fmt, 95 (long long) t.tv_sec, 96 zero_extend_signed_to_ull(t.tv_nsec)); 97 } 98 99 return buf; 100} 101 102MPERS_PRINTER_DECL(void, print_timespec_utime_pair, 103 struct tcb *const tcp, const kernel_ulong_t addr) 104{ 105 timespec_t t[2]; 106 107 if (umove_or_printaddr(tcp, addr, &t)) 108 return; 109 110 tprints("["); 111 print_timespec_t_utime(&t[0]); 112 tprints(", "); 113 print_timespec_t_utime(&t[1]); 114 tprints("]"); 115} 116 117MPERS_PRINTER_DECL(void, print_itimerspec, 118 struct tcb *const tcp, const kernel_ulong_t addr) 119{ 120 timespec_t t[2]; 121 122 if (umove_or_printaddr(tcp, addr, &t)) 123 return; 124 125 tprints("{it_interval="); 126 print_timespec_t(&t[0]); 127 tprints(", it_value="); 128 print_timespec_t(&t[1]); 129 tprints("}"); 130} 131