io.c revision c6cc577089355345b5d6e6e70c8f0a8be55d5346
1/* 2 * Copyright (c) 1991, 1992 Paul Kranenburg <pk@cs.few.eur.nl> 3 * Copyright (c) 1993 Branko Lankester <branko@hacktic.nl> 4 * Copyright (c) 1993, 1994, 1995, 1996 Rick Sladkey <jrs@world.std.com> 5 * Copyright (c) 1996-1999 Wichert Akkerman <wichert@cistron.nl> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. The name of the author may not be used to endorse or promote products 17 * derived from this software without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 20 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 21 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 22 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 23 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 24 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 28 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 * 30 * $Id$ 31 */ 32 33#include "defs.h" 34 35#include <fcntl.h> 36#if HAVE_SYS_UIO_H 37#include <sys/uio.h> 38#endif 39 40#ifdef HAVE_LONG_LONG_OFF_T 41/* 42 * Hacks for systems that have a long long off_t 43 */ 44 45#define sys_pread64 sys_pread 46#define sys_pwrite64 sys_pwrite 47#endif 48 49int 50sys_read(tcp) 51struct tcb *tcp; 52{ 53 if (entering(tcp)) { 54 tprintf("%ld, ", tcp->u_arg[0]); 55 } else { 56 if (syserror(tcp)) 57 tprintf("%#lx", tcp->u_arg[1]); 58 else 59 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 60 tprintf(", %lu", tcp->u_arg[2]); 61 } 62 return 0; 63} 64 65int 66sys_write(tcp) 67struct tcb *tcp; 68{ 69 if (entering(tcp)) { 70 tprintf("%ld, ", tcp->u_arg[0]); 71 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 72 tprintf(", %lu", tcp->u_arg[2]); 73 } 74 return 0; 75} 76 77#if HAVE_SYS_UIO_H 78void 79tprint_iov(tcp, len, addr) 80struct tcb * tcp; 81int len; 82long addr; 83{ 84 struct iovec *iov; 85 int i; 86 87 88 if (!len) { 89 tprintf("[]"); 90 return; 91 } 92 93 if ((iov = (struct iovec *) malloc(len * sizeof *iov)) == NULL) { 94 fprintf(stderr, "No memory"); 95 return; 96 } 97 if (umoven(tcp, addr, 98 len * sizeof *iov, (char *) iov) < 0) { 99 tprintf("%#lx", tcp->u_arg[1]); 100 } else { 101 tprintf("["); 102 for (i = 0; i < len; i++) { 103 if (i) 104 tprintf(", "); 105 tprintf("{"); 106 printstr(tcp, (long) iov[i].iov_base, 107 iov[i].iov_len); 108 tprintf(", %lu}", (unsigned long)iov[i].iov_len); 109 } 110 tprintf("]"); 111 } 112 free((char *) iov); 113} 114 115int 116sys_readv(tcp) 117struct tcb *tcp; 118{ 119 if (entering(tcp)) { 120 tprintf("%ld, ", tcp->u_arg[0]); 121 } else { 122 if (syserror(tcp)) { 123 tprintf("%#lx, %lu", 124 tcp->u_arg[1], tcp->u_arg[2]); 125 return 0; 126 } 127 tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1]); 128 tprintf(", %lu", tcp->u_arg[2]); 129 } 130 return 0; 131} 132 133int 134sys_writev(tcp) 135struct tcb *tcp; 136{ 137 if (entering(tcp)) { 138 tprintf("%ld, ", tcp->u_arg[0]); 139 tprint_iov(tcp, tcp->u_arg[2], tcp->u_arg[1]); 140 tprintf(", %lu", tcp->u_arg[2]); 141 } 142 return 0; 143} 144#endif 145 146#if defined(SVR4) 147 148int 149sys_pread(tcp) 150struct tcb *tcp; 151{ 152 if (entering(tcp)) { 153 tprintf("%ld, ", tcp->u_arg[0]); 154 } else { 155 if (syserror(tcp)) 156 tprintf("%#lx", tcp->u_arg[1]); 157 else 158 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 159#if UNIXWARE 160 /* off_t is signed int */ 161 tprintf(", %lu, %ld", tcp->u_arg[2], tcp->u_arg[3]); 162#else 163 tprintf(", %lu, %llu", tcp->u_arg[2], 164 (((unsigned long long) tcp->u_arg[4]) << 32 165 | (unsigned) tcp->u_arg[3])); 166#endif 167 } 168 return 0; 169} 170 171int 172sys_pwrite(tcp) 173struct tcb *tcp; 174{ 175 if (entering(tcp)) { 176 tprintf("%ld, ", tcp->u_arg[0]); 177 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 178#if UNIXWARE 179 /* off_t is signed int */ 180 tprintf(", %lu, %ld", tcp->u_arg[2], tcp->u_arg[3]); 181#else 182 tprintf(", %lu, %llu", tcp->u_arg[2], 183 (((unsigned long long) tcp->u_arg[4]) << 32 184 | (unsigned) tcp->u_arg[3])); 185#endif 186 } 187 return 0; 188} 189#endif /* SVR4 */ 190 191#ifdef FREEBSD 192#include <sys/types.h> 193#include <sys/socket.h> 194 195int 196sys_sendfile(tcp) 197struct tcb *tcp; 198{ 199 if (entering(tcp)) { 200 tprintf("%ld, %ld, %llu, %lu", tcp->u_arg[0], tcp->u_arg[1], 201 (((unsigned long long) tcp->u_arg[3]) << 32 | 202 (unsigned) tcp->u_arg[2]), tcp->u_arg[4]); 203 } else { 204 off_t offset; 205 206 if (!tcp->u_arg[5]) 207 tprintf(", NULL"); 208 else { 209 struct sf_hdtr hdtr; 210 211 if (umove(tcp, tcp->u_arg[5], &hdtr) < 0) 212 tprintf(", %#lx", tcp->u_arg[5]); 213 else { 214 tprintf(", { "); 215 tprint_iov(tcp, hdtr.hdr_cnt, hdtr.headers); 216 tprintf(", %u, ", hdtr.hdr_cnt); 217 tprint_iov(tcp, hdtr.trl_cnt, hdtr.trailers); 218 tprintf(", %u }", hdtr.hdr_cnt); 219 } 220 } 221 if (!tcp->u_arg[6]) 222 tprintf(", NULL"); 223 else if (umove(tcp, tcp->u_arg[6], &offset) < 0) 224 tprintf(", %#lx", tcp->u_arg[6]); 225 else 226 tprintf(", [%llu]", offset); 227 tprintf(", %lu", tcp->u_arg[7]); 228 } 229 return 0; 230} 231#endif /* FREEBSD */ 232 233#ifdef LINUX 234int 235sys_pread(tcp) 236struct tcb *tcp; 237{ 238 if (entering(tcp)) { 239 tprintf("%ld, ", tcp->u_arg[0]); 240 } else { 241 if (syserror(tcp)) 242 tprintf("%#lx", tcp->u_arg[1]); 243 else 244 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 245 ALIGN64 (tcp, 3); /* PowerPC alignment restriction */ 246 tprintf(", %lu, %llu", tcp->u_arg[2], 247 *(unsigned long long *)&tcp->u_arg[3]); 248 } 249 return 0; 250} 251 252int 253sys_pwrite(tcp) 254struct tcb *tcp; 255{ 256 if (entering(tcp)) { 257 tprintf("%ld, ", tcp->u_arg[0]); 258 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 259 ALIGN64 (tcp, 3); /* PowerPC alignment restriction */ 260 tprintf(", %lu, %llu", tcp->u_arg[2], 261 *(unsigned long long *)&tcp->u_arg[3]); 262 } 263 return 0; 264} 265 266int 267sys_sendfile(tcp) 268struct tcb *tcp; 269{ 270 if (entering(tcp)) { 271 off_t offset; 272 273 tprintf("%ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1]); 274 if (!tcp->u_arg[2]) 275 tprintf("NULL"); 276 else if (umove(tcp, tcp->u_arg[2], &offset) < 0) 277 tprintf("%#lx", tcp->u_arg[2]); 278 else 279 tprintf("[%lu]", offset); 280 tprintf(", %lu", tcp->u_arg[3]); 281 } 282 return 0; 283} 284 285int 286sys_sendfile64(tcp) 287struct tcb *tcp; 288{ 289 if (entering(tcp)) { 290 loff_t offset; 291 292 tprintf("%ld, %ld, ", tcp->u_arg[0], tcp->u_arg[1]); 293 if (!tcp->u_arg[2]) 294 tprintf("NULL"); 295 else if (umove(tcp, tcp->u_arg[2], &offset) < 0) 296 tprintf("%#lx", tcp->u_arg[2]); 297 else 298 tprintf("[%llu]", (unsigned long long int) offset); 299 tprintf(", %lu", tcp->u_arg[3]); 300 } 301 return 0; 302} 303 304#endif /* LINUX */ 305 306#if _LFS64_LARGEFILE || HAVE_LONG_LONG_OFF_T 307int 308sys_pread64(tcp) 309struct tcb *tcp; 310{ 311 if (entering(tcp)) { 312 tprintf("%ld, ", tcp->u_arg[0]); 313 } else { 314 ALIGN64 (tcp, 3); 315 if (syserror(tcp)) 316 tprintf("%#lx", tcp->u_arg[1]); 317 else 318 printstr(tcp, tcp->u_arg[1], tcp->u_rval); 319 tprintf(", %lu, %#llx", tcp->u_arg[2], 320 LONG_LONG(tcp->u_arg[3], tcp->u_arg[4])); 321 } 322 return 0; 323} 324 325int 326sys_pwrite64(tcp) 327struct tcb *tcp; 328{ 329 if (entering(tcp)) { 330 ALIGN64 (tcp, 3); 331 tprintf("%ld, ", tcp->u_arg[0]); 332 printstr(tcp, tcp->u_arg[1], tcp->u_arg[2]); 333 tprintf(", %lu, %#llx", tcp->u_arg[2], 334 LONG_LONG(tcp->u_arg[3], tcp->u_arg[4])); 335 } 336 return 0; 337} 338#endif 339 340int 341sys_ioctl(tcp) 342struct tcb *tcp; 343{ 344 char *symbol; 345 346 if (entering(tcp)) { 347 tprintf("%ld, ", tcp->u_arg[0]); 348 symbol = ioctl_lookup(tcp->u_arg[1]); 349 if (symbol) 350 tprintf("%s", symbol); 351 else 352 tprintf("%#lx", tcp->u_arg[1]); 353 ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]); 354 } 355 else { 356 int ret; 357 if (!(ret = ioctl_decode(tcp, tcp->u_arg[1], tcp->u_arg[2]))) 358 tprintf(", %#lx", tcp->u_arg[2]); 359 else 360 return ret - 1; 361 } 362 return 0; 363} 364