1 /* 2 * This file and its contents are supplied under the terms of the 3 * Common Development and Distribution License ("CDDL"), version 1.0. 4 * You may only use this file in accordance with the terms of version 5 * 1.0 of the CDDL. 6 * 7 * A full copy of the text of the CDDL should have accompanied this 8 * source. A copy of the CDDL is also available via the Internet at 9 * http://www.illumos.org/license/CDDL. 10 */ 11 12 /* 13 * Copyright 2021 Tintri by DDN, Inc. All rights reserved. 14 */ 15 16 #include <stdio.h> 17 #include <strings.h> 18 #include <sys/cmn_err.h> 19 #include <sys/varargs.h> 20 21 #include "utils.h" 22 23 void 24 hexdump(const uchar_t *buf, int len) 25 { 26 int idx; 27 char ascii[24]; 28 char *pa = ascii; 29 30 bzero(ascii, sizeof (ascii)); 31 32 idx = 0; 33 while (len--) { 34 if ((idx & 15) == 0) { 35 printf("%04X: ", idx); 36 pa = ascii; 37 } 38 if (*buf > ' ' && *buf <= '~') 39 *pa++ = *buf; 40 else 41 *pa++ = '.'; 42 printf("%02x ", *buf++); 43 44 idx++; 45 if ((idx & 3) == 0) { 46 *pa++ = ' '; 47 (void) putchar(' '); 48 } 49 if ((idx & 15) == 0) { 50 *pa = '\0'; 51 printf("%s\n", ascii); 52 } 53 } 54 55 if ((idx & 15) != 0) { 56 *pa = '\0'; 57 /* column align the last ascii row */ 58 while ((idx & 15) != 0) { 59 if ((idx & 3) == 0) 60 (void) putchar(' '); 61 printf(" "); 62 idx++; 63 } 64 printf("%s\n", ascii); 65 } 66 } 67 68 /* 69 * Provide a real function (one that prints something) to replace 70 * the stub in libfakekernel. This prints cmn_err() messages. 71 */ 72 void 73 fakekernel_putlog(char *msg, size_t len, int flags) 74 { 75 76 (void) fwrite(msg, 1, len, stdout); 77 (void) fflush(stdout); 78 } 79 80 /* 81 * Build a UIO for the input or output buffer 82 * Arbitrarily splits into 2 segs for testing uio. 83 */ 84 void 85 make_uio(void *buf, size_t buflen, uio_t *uio, iovec_t *iov, int iovmax) 86 { 87 size_t maxseg = 512; 88 size_t tlen; 89 int i; 90 91 bzero(uio, sizeof (*uio)); 92 uio->uio_resid = buflen; 93 uio->uio_segflg = UIO_SYSSPACE; 94 95 for (i = 0; i < iovmax; i++) { 96 if (buflen <= 0) 97 break; 98 tlen = buflen; 99 if (tlen > maxseg) 100 tlen = maxseg; 101 iov[i].iov_base = buf; 102 iov[i].iov_len = tlen; 103 buf += tlen; 104 buflen -= tlen; 105 } 106 107 uio->uio_iov = iov; 108 uio->uio_iovcnt = i; 109 } 110