diff -urN ../strace-4.5.16-orig/Makefile.am Makefile.am --- ../strace-4.5.16-orig/Makefile.am 2007-08-27 19:36:34 +0900 +++ Makefile.am 2007-08-27 19:39:23 +0900 @@ -20,6 +20,8 @@ strace_SOURCES += loop.c +strace_SOURCES += sound.c + EXTRA_DIST = $(man_MANS) errnoent.sh signalent.sh syscallent.sh ioctlsort.c \ debian/changelog debian/control debian/copyright debian/rules \ strace.spec \ diff -urN ../strace-4.5.16-orig/Makefile.in Makefile.in --- ../strace-4.5.16-orig/Makefile.in 2007-08-27 19:36:34 +0900 +++ Makefile.in 2007-08-27 19:39:46 +0900 @@ -67,6 +67,7 @@ strace_OBJECTS = $(am_strace_OBJECTS) strace_LDADD = $(LDADD) am_strace_OBJECTS += loop.$(OBJEXT) +am_strace_OBJECTS += sound.$(OBJEXT) binSCRIPT_INSTALL = $(INSTALL_SCRIPT) SCRIPTS = $(bin_SCRIPTS) DEFAULT_INCLUDES = -I.@am__isrc@ @@ -208,6 +209,7 @@ noinst_HEADERS = defs.h strace_SOURCES += loop.c +strace_SOURCES += sound.c EXTRA_DIST = $(man_MANS) errnoent.sh signalent.sh syscallent.sh ioctlsort.c \ debian/changelog debian/control debian/copyright debian/rules \ strace.spec \ @@ -387,6 +389,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ioctl.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipc.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/loop.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sound.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/proc.Po@am__quote@ diff -urN ../strace-4.5.16-orig/ioctl.c ioctl.c --- ../strace-4.5.16-orig/ioctl.c 2007-08-27 19:36:34 +0900 +++ ioctl.c 2007-08-27 19:37:18 +0900 @@ -117,6 +117,10 @@ { switch ((code >> 8) & 0xff) { #ifdef LINUX + case 'M': case 'P': + return sound_ioctl(tcp, code, arg); +#endif +#ifdef LINUX #if defined(ALPHA) || defined(POWERPC) case 'f': case 't': case 'T': #else /* !ALPHA */ diff -urN ../strace-4.5.16-orig/sound.c sound.c --- ../strace-4.5.16-orig/sound.c 1970-01-01 09:00:00 +0900 +++ sound.c 2007-08-27 19:37:18 +0900 @@ -0,0 +1,195 @@ +/* + * Copyright (c) 2004 Andrew Church + * 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. + * + * $Id: $ + */ + +#include "defs.h" + +#ifdef LINUX + +#include + +static struct xlat mixer_device_mask[] = { + { SOUND_MASK_VOLUME, "SOUND_MASK_VOLUME" }, + { SOUND_MASK_BASS, "SOUND_MASK_BASS" }, + { SOUND_MASK_TREBLE, "SOUND_MASK_TREBLE" }, + { SOUND_MASK_SYNTH, "SOUND_MASK_SYNTH" }, + { SOUND_MASK_PCM, "SOUND_MASK_PCM" }, + { SOUND_MASK_SPEAKER, "SOUND_MASK_SPEAKER" }, + { SOUND_MASK_LINE, "SOUND_MASK_LINE" }, + { SOUND_MASK_MIC, "SOUND_MASK_MIC" }, + { SOUND_MASK_CD, "SOUND_MASK_CD" }, + { SOUND_MASK_IMIX, "SOUND_MASK_IMIX" }, + { SOUND_MASK_ALTPCM, "SOUND_MASK_ALTPCM" }, + { SOUND_MASK_RECLEV, "SOUND_MASK_RECLEV" }, + { SOUND_MASK_IGAIN, "SOUND_MASK_IGAIN" }, + { SOUND_MASK_OGAIN, "SOUND_MASK_OGAIN" }, + { SOUND_MASK_LINE1, "SOUND_MASK_LINE1" }, + { SOUND_MASK_LINE2, "SOUND_MASK_LINE2" }, + { SOUND_MASK_LINE3, "SOUND_MASK_LINE3" }, + { SOUND_MASK_DIGITAL1, "SOUND_MASK_DIGITAL1" }, + { SOUND_MASK_DIGITAL2, "SOUND_MASK_DIGITAL2" }, + { SOUND_MASK_DIGITAL3, "SOUND_MASK_DIGITAL3" }, + { SOUND_MASK_PHONEIN, "SOUND_MASK_PHONEIN" }, + { SOUND_MASK_PHONEOUT, "SOUND_MASK_PHONEOUT" }, + { SOUND_MASK_RADIO, "SOUND_MASK_RADIO" }, + { SOUND_MASK_VIDEO, "SOUND_MASK_VIDEO" }, + { SOUND_MASK_MONITOR, "SOUND_MASK_MONITOR" }, + { 0, NULL } +}; + +int +sound_ioctl(struct tcb *tcp, int code, int arg) +{ + int val; + struct count_info ci; + + switch (code) { + case SOUND_MIXER_READ_VOLUME: + case SOUND_MIXER_READ_BASS: + case SOUND_MIXER_READ_TREBLE: + case SOUND_MIXER_READ_SYNTH: + case SOUND_MIXER_READ_PCM: + case SOUND_MIXER_READ_SPEAKER: + case SOUND_MIXER_READ_LINE: + case SOUND_MIXER_READ_MIC: + case SOUND_MIXER_READ_CD: + case SOUND_MIXER_READ_IMIX: + case SOUND_MIXER_READ_ALTPCM: + case SOUND_MIXER_READ_RECLEV: + case SOUND_MIXER_READ_IGAIN: + case SOUND_MIXER_READ_OGAIN: + case SOUND_MIXER_READ_LINE1: + case SOUND_MIXER_READ_LINE2: + case SOUND_MIXER_READ_LINE3: + /* Pointer to result */ + if (entering(tcp)) + return 1; + if (arg == 0) + tprintf(", NULL"); + else if (syserror(tcp)) + tprintf(", %#x", arg); + else if (umove(tcp, arg, &val) < 0) + tprintf(", ..."); + else + tprintf(", %d:%d", (val>>8) & 0xFF, val & 0xFF); + return 1; + + case SNDCTL_DSP_RESET: + case SNDCTL_DSP_SYNC: + case SNDCTL_DSP_POST: + /* No parameter */ + return 1; + + case SNDCTL_DSP_SPEED: + case SNDCTL_DSP_STEREO: + case SNDCTL_DSP_GETBLKSIZE: + case SNDCTL_DSP_SETFMT: + case SNDCTL_DSP_CHANNELS: + case SNDCTL_DSP_SUBDIVIDE: + /* Pointer to parameter and result */ + if (arg == 0) { + if (entering(tcp)) + tprintf(", NULL"); + } else if (syserror(tcp)) { + if (entering(tcp)) + tprintf(", %#x", arg); + } else if (umove(tcp, arg, &val) < 0) { + if (entering(tcp)) + tprintf(", ..."); + } else { + tprintf("%s %d", entering(tcp) ? "," : " ->", val); + } + return 1; + + case SNDCTL_DSP_SETFRAGMENT: + /* Pointer to parameter and result */ + if (arg == 0) { + if (entering(tcp)) + tprintf(", NULL"); + } else if (syserror(tcp)) { + if (entering(tcp)) + tprintf(", %#x", arg); + } else if (umove(tcp, arg, &val) < 0) { + if (entering(tcp)) + tprintf(", ..."); + } else { + tprintf("%s %d", entering(tcp) ? "," : " ->", val); + } + return 1; + + case SNDCTL_DSP_GETFMTS: + case SNDCTL_DSP_GETCAPS: + /* Pointer to result */ + if (entering(tcp)) + return 1; + if (arg == 0) + tprintf(", NULL"); + else if (syserror(tcp)) + tprintf(", %#x", arg); + else if (umove(tcp, arg, &val) < 0) + tprintf(", ..."); + else + tprintf(", %#x", val); + return 1; + + case SNDCTL_DSP_GETOSPACE: + case SNDCTL_DSP_GETISPACE: + case SNDCTL_DSP_GETODELAY: + /* Pointer to result */ + if (entering(tcp)) + return 1; + if (arg == 0) + tprintf(", NULL"); + else if (syserror(tcp)) + tprintf(", %#x", arg); + else if (umove(tcp, arg, &val) < 0) + tprintf(", ..."); + else + tprintf(", %d", val); + return 1; + + case SNDCTL_DSP_GETIPTR: + case SNDCTL_DSP_GETOPTR: + /* Pointer to count_info result */ + if (entering(tcp)) + return 1; + if (arg == 0) + tprintf(", NULL"); + else if (syserror(tcp)) + tprintf(", %#x", arg); + else if (umove(tcp, arg, &ci) < 0) + tprintf(", ..."); + else + tprintf(", {%d,%d,%#x}", ci.bytes, ci.blocks, ci.ptr); + return 1; + } + + return 0; +} + +#endif /* LINUX */