1266989Smarkj#! /usr/bin/ksh 2266989Smarkj# 3266989Smarkj# 4266989Smarkj# This file and its contents are supplied under the terms of the 5266989Smarkj# Common Development and Distribution License ("CDDL"), version 1.0. 6266989Smarkj# You may only use this file in accordance with the terms of version 7266989Smarkj# 1.0 of the CDDL. 8266989Smarkj# 9266989Smarkj# A full copy of the text of the CDDL should have accompanied this 10266989Smarkj# source. A copy of the CDDL is also available via the Internet at 11266989Smarkj# http://www.illumos.org/license/CDDL. 12266989Smarkj# 13266989Smarkj 14266989Smarkj# 15266989Smarkj# Copyright (c) 2013 Joyent, Inc. All rights reserved. 16266989Smarkj# 17266989Smarkj 18266989Smarkj# 19266989Smarkj# This test is checking that we can read members and that pointers inside 20266989Smarkj# members point to valid data that is intelligible, eg. strings. 21266989Smarkj# 22266989Smarkj 23266989Smarkjif [ $# != 1 ]; then 24266989Smarkj echo expected one argument: '<'dtrace-path'>' 25266989Smarkj exit 2 26266989Smarkjfi 27266989Smarkj 28266989Smarkjdtrace=$1 29266989Smarkjt="zelda_info_t" 30266989Smarkjexe="tst.chasestrings.exe" 31266989Smarkj 32271693Smarkjelfdump -c "./$exe" | grep -Fq 'sh_name: .SUNW_ctf' 33266989Smarkjif [[ $? -ne 0 ]]; then 34266989Smarkj echo "CTF does not exist in $exe, that's a bug" >&2 35266989Smarkj exit 1 36266989Smarkjfi 37266989Smarkj 38266989Smarkj./$exe & 39266989Smarkjpid=$! 40266989Smarkj 41266989Smarkj$dtrace -qs /dev/stdin <<EOF 42266989Smarkjpid$pid::has_princess:entry 43266989Smarkj/next == 0/ 44266989Smarkj{ 45266989Smarkj this->t = (pid$pid\`$t *)(copyin(arg0, sizeof (pid$pid\`$t))); 46266989Smarkj printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n", 47266989Smarkj copyinstr((uintptr_t)this->t->zi_gamename), this->t->zi_ndungeons, 48266989Smarkj copyinstr((uintptr_t)this->t->zi_villain), this->t->zi_haszelda); 49266989Smarkj next = 1; 50266989Smarkj} 51266989Smarkj 52266989Smarkjpid$pid::has_dungeons:entry 53266989Smarkj/next == 1/ 54266989Smarkj{ 55266989Smarkj this->t = (pid$pid\`$t *)(copyin(arg0, sizeof (pid$pid\`$t))); 56266989Smarkj printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n", 57266989Smarkj copyinstr((uintptr_t)this->t->zi_gamename), this->t->zi_ndungeons, 58266989Smarkj copyinstr((uintptr_t)this->t->zi_villain), this->t->zi_haszelda); 59266989Smarkj next = 2; 60266989Smarkj} 61266989Smarkj 62266989Smarkjpid$pid::has_villain:entry 63266989Smarkj/next == 2/ 64266989Smarkj{ 65266989Smarkj this->t = (pid$pid\`$t *)(copyin(arg0, sizeof (pid$pid\`$t))); 66266989Smarkj printf("game: %s, dungeon: %d, villain: %s, zelda: %d\n", 67266989Smarkj copyinstr((uintptr_t)this->t->zi_gamename), this->t->zi_ndungeons, 68266989Smarkj copyinstr((uintptr_t)this->t->zi_villain), this->t->zi_haszelda); 69266989Smarkj exit(0); 70266989Smarkj} 71266989SmarkjEOF 72266989Smarkjrc=$? 73266989Smarkj 74266989Smarkjkill -9 $pid 75266989Smarkj 76266989Smarkjexit $rc 77