1*4d495c6eSApple OSS Distributions /* 2*4d495c6eSApple OSS Distributions * Copyright (c) 2007 Apple, Inc. All rights reserved. 3*4d495c6eSApple OSS Distributions * 4*4d495c6eSApple OSS Distributions * @APPLE_LICENSE_HEADER_START@ 5*4d495c6eSApple OSS Distributions * 6*4d495c6eSApple OSS Distributions * The contents of this file constitute Original Code as defined in and 7*4d495c6eSApple OSS Distributions * are subject to the Apple Public Source License Version 1.1 (the 8*4d495c6eSApple OSS Distributions * "License"). You may not use this file except in compliance with the 9*4d495c6eSApple OSS Distributions * License. Please obtain a copy of the License at 10*4d495c6eSApple OSS Distributions * http://www.apple.com/publicsource and read it before using this file. 11*4d495c6eSApple OSS Distributions * 12*4d495c6eSApple OSS Distributions * This Original Code and all software distributed under the License are 13*4d495c6eSApple OSS Distributions * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER 14*4d495c6eSApple OSS Distributions * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 15*4d495c6eSApple OSS Distributions * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 16*4d495c6eSApple OSS Distributions * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the 17*4d495c6eSApple OSS Distributions * License for the specific language governing rights and limitations 18*4d495c6eSApple OSS Distributions * under the License. 19*4d495c6eSApple OSS Distributions * 20*4d495c6eSApple OSS Distributions * @APPLE_LICENSE_HEADER_END@ 21*4d495c6eSApple OSS Distributions */ 22*4d495c6eSApple OSS Distributions 23*4d495c6eSApple OSS Distributions #pragma D depends_on library darwin.d 24*4d495c6eSApple OSS Distributions #pragma D depends_on module mach_kernel 25*4d495c6eSApple OSS Distributions #pragma D depends_on provider io 26*4d495c6eSApple OSS Distributions 27*4d495c6eSApple OSS Distributions inline int B_WRITE = 0x0000; 28*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_WRITE 29*4d495c6eSApple OSS Distributions inline int B_READ = 0x0001; 30*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_READ 31*4d495c6eSApple OSS Distributions inline int B_ASYNC = 0x0002; 32*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_ASYNC 33*4d495c6eSApple OSS Distributions inline int B_NOCACHE = 0x0004; 34*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_NOCACHE 35*4d495c6eSApple OSS Distributions inline int B_DELWRI = 0x0008; 36*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_DELWRI 37*4d495c6eSApple OSS Distributions inline int B_LOCKED = 0x0010; 38*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_LOCKED 39*4d495c6eSApple OSS Distributions inline int B_PHYS = 0x0020; 40*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_PHYS 41*4d495c6eSApple OSS Distributions inline int B_CLUSTER = 0x0040; 42*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_CLUSTER 43*4d495c6eSApple OSS Distributions inline int B_PAGEIO = 0x0080; 44*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_PAGEIO 45*4d495c6eSApple OSS Distributions inline int B_META = 0x0100; 46*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_META 47*4d495c6eSApple OSS Distributions inline int B_RAW = 0x0200; 48*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_RAW 49*4d495c6eSApple OSS Distributions inline int B_FUA = 0x0400; 50*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_FUA 51*4d495c6eSApple OSS Distributions inline int B_PASSIVE = 0x0800; 52*4d495c6eSApple OSS Distributions #pragma D binding "1.0" B_PASSIVE 53*4d495c6eSApple OSS Distributions 54*4d495c6eSApple OSS Distributions typedef struct bufinfo { 55*4d495c6eSApple OSS Distributions int b_flags; /* buffer status */ 56*4d495c6eSApple OSS Distributions size_t b_bcount; /* number of bytes */ 57*4d495c6eSApple OSS Distributions caddr_t b_addr; /* buffer address */ 58*4d495c6eSApple OSS Distributions uint64_t b_lblkno; /* block # on device */ 59*4d495c6eSApple OSS Distributions uint64_t b_blkno; /* expanded block # on device */ 60*4d495c6eSApple OSS Distributions size_t b_resid; /* # of bytes not transferred */ 61*4d495c6eSApple OSS Distributions size_t b_bufsize; /* size of allocated buffer */ 62*4d495c6eSApple OSS Distributions caddr_t b_iodone; /* I/O completion routine */ 63*4d495c6eSApple OSS Distributions int b_error; /* expanded error field */ 64*4d495c6eSApple OSS Distributions dev_t b_edev; /* extended device */ 65*4d495c6eSApple OSS Distributions } bufinfo_t; 66*4d495c6eSApple OSS Distributions 67*4d495c6eSApple OSS Distributions #pragma D binding "1.0" translator 68*4d495c6eSApple OSS Distributions translator bufinfo_t < struct buf *B > { 69*4d495c6eSApple OSS Distributions b_flags = B->b_flags; 70*4d495c6eSApple OSS Distributions b_addr = (caddr_t)B->b_datap; 71*4d495c6eSApple OSS Distributions b_bcount = B->b_bcount; 72*4d495c6eSApple OSS Distributions b_lblkno = B->b_lblkno; 73*4d495c6eSApple OSS Distributions b_blkno = B->b_blkno; 74*4d495c6eSApple OSS Distributions b_resid = B->b_resid; 75*4d495c6eSApple OSS Distributions b_bufsize = B->b_bufsize; 76*4d495c6eSApple OSS Distributions b_iodone = (caddr_t)B->b_iodone; 77*4d495c6eSApple OSS Distributions b_error = B->b_error; 78*4d495c6eSApple OSS Distributions b_edev = B->b_dev; 79*4d495c6eSApple OSS Distributions }; 80*4d495c6eSApple OSS Distributions 81*4d495c6eSApple OSS Distributions typedef struct devinfo { 82*4d495c6eSApple OSS Distributions int dev_major; /* major number */ 83*4d495c6eSApple OSS Distributions int dev_minor; /* minor number */ 84*4d495c6eSApple OSS Distributions int dev_instance; /* instance number */ 85*4d495c6eSApple OSS Distributions string dev_name; /* name of device */ 86*4d495c6eSApple OSS Distributions string dev_statname; /* name of device + instance/minor */ 87*4d495c6eSApple OSS Distributions string dev_pathname; /* pathname of device */ 88*4d495c6eSApple OSS Distributions } devinfo_t; 89*4d495c6eSApple OSS Distributions 90*4d495c6eSApple OSS Distributions #pragma D binding "1.0" translator 91*4d495c6eSApple OSS Distributions translator devinfo_t < struct buf *B > { 92*4d495c6eSApple OSS Distributions dev_major = getmajor(B->b_dev); 93*4d495c6eSApple OSS Distributions dev_minor = getminor(B->b_dev); 94*4d495c6eSApple OSS Distributions dev_instance = getminor(B->b_dev); 95*4d495c6eSApple OSS Distributions dev_name = "??"; /* XXX */ 96*4d495c6eSApple OSS Distributions dev_statname = "??"; /* XXX */ 97*4d495c6eSApple OSS Distributions dev_pathname = "??"; /* XXX */ 98*4d495c6eSApple OSS Distributions }; 99*4d495c6eSApple OSS Distributions 100*4d495c6eSApple OSS Distributions typedef off_t offset_t; 101*4d495c6eSApple OSS Distributions 102*4d495c6eSApple OSS Distributions typedef struct fileinfo { 103*4d495c6eSApple OSS Distributions string fi_name; /* name (basename of fi_pathname) */ 104*4d495c6eSApple OSS Distributions string fi_dirname; /* directory (dirname of fi_pathname) */ 105*4d495c6eSApple OSS Distributions string fi_pathname; /* full pathname */ 106*4d495c6eSApple OSS Distributions offset_t fi_offset; /* offset within file */ 107*4d495c6eSApple OSS Distributions string fi_fs; /* filesystem */ 108*4d495c6eSApple OSS Distributions string fi_mount; /* mount point of file system */ 109*4d495c6eSApple OSS Distributions int fi_oflags; /* open(2) flags for file descriptor */ 110*4d495c6eSApple OSS Distributions } fileinfo_t; 111*4d495c6eSApple OSS Distributions 112*4d495c6eSApple OSS Distributions #pragma D binding "1.0" translator 113*4d495c6eSApple OSS Distributions translator fileinfo_t < struct buf *B > { 114*4d495c6eSApple OSS Distributions fi_name = B->b_vp->v_name == NULL ? "<unknown (NULL v_name)>" : B->b_vp->v_name; 115*4d495c6eSApple OSS Distributions 116*4d495c6eSApple OSS Distributions fi_dirname = B->b_vp->v_parent == NULL ? "<unknown (NULL v_parent)>" : 117*4d495c6eSApple OSS Distributions (B->b_vp->v_parent->v_name == NULL ? "<unknown (NULL v_name)>" : B->b_vp->v_parent->v_name); 118*4d495c6eSApple OSS Distributions 119*4d495c6eSApple OSS Distributions fi_pathname = strjoin("??/", 120*4d495c6eSApple OSS Distributions strjoin(B->b_vp->v_parent == NULL ? "<unknown (NULL v_parent)>" : 121*4d495c6eSApple OSS Distributions (B->b_vp->v_parent->v_name == NULL ? "<unknown (NULL v_name)>" : B->b_vp->v_parent->v_name), 122*4d495c6eSApple OSS Distributions strjoin("/", 123*4d495c6eSApple OSS Distributions B->b_vp->v_name == NULL ? "<unknown (NULL v_name)>" : B->b_vp->v_name))); 124*4d495c6eSApple OSS Distributions 125*4d495c6eSApple OSS Distributions fi_offset = B->b_upl == NULL ? -1 : ((upl_t)B->b_upl)->u_offset; 126*4d495c6eSApple OSS Distributions 127*4d495c6eSApple OSS Distributions fi_fs = B->b_vp->v_mount->mnt_vtable->vfc_name; 128*4d495c6eSApple OSS Distributions 129*4d495c6eSApple OSS Distributions fi_mount = B->b_vp->v_mount->mnt_vnodecovered == NULL ? "/" : B->b_vp->v_mount->mnt_vnodecovered->v_name; 130*4d495c6eSApple OSS Distributions 131*4d495c6eSApple OSS Distributions fi_oflags = 0; 132*4d495c6eSApple OSS Distributions }; 133*4d495c6eSApple OSS Distributions 134*4d495c6eSApple OSS Distributions /* 135*4d495c6eSApple OSS Distributions * The following inline constants can be used to examine fi_oflags when using 136*4d495c6eSApple OSS Distributions * the fds[] array or a translated fileglob *. Note that the various open 137*4d495c6eSApple OSS Distributions * flags behave as a bit-field *except* for O_RDONLY, O_WRONLY, and O_RDWR. 138*4d495c6eSApple OSS Distributions * To test the open mode, you write code similar to that used with the fcntl(2) 139*4d495c6eSApple OSS Distributions * F_GET[X]FL command, such as: if ((fi_oflags & O_ACCMODE) == O_WRONLY). 140*4d495c6eSApple OSS Distributions */ 141*4d495c6eSApple OSS Distributions inline int O_ACCMODE = 0x0003; 142*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_ACCMODE 143*4d495c6eSApple OSS Distributions 144*4d495c6eSApple OSS Distributions inline int O_RDONLY = 0x0000; 145*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_RDONLY 146*4d495c6eSApple OSS Distributions inline int O_WRONLY = 0x0001; 147*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_WRONLY 148*4d495c6eSApple OSS Distributions inline int O_RDWR = 0x0002; 149*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_RDWR 150*4d495c6eSApple OSS Distributions 151*4d495c6eSApple OSS Distributions inline int O_NONBLOCK = 0x0004; 152*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_NONBLOCK 153*4d495c6eSApple OSS Distributions inline int O_APPEND = 0x0008; 154*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_APPEND 155*4d495c6eSApple OSS Distributions inline int O_SHLOCK = 0x0010; 156*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_SHLOCK 157*4d495c6eSApple OSS Distributions inline int O_EXLOCK = 0x0020; 158*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_EXLOCK 159*4d495c6eSApple OSS Distributions inline int O_ASYNC = 0x0040; 160*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_ASYNC 161*4d495c6eSApple OSS Distributions inline int O_SYNC = 0x0080; 162*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_SYNC 163*4d495c6eSApple OSS Distributions inline int O_NOFOLLOW = 0x0100; 164*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_NOFOLLOW 165*4d495c6eSApple OSS Distributions inline int O_CREAT = 0x0200; 166*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_CREAT 167*4d495c6eSApple OSS Distributions inline int O_TRUNC = 0x0400; 168*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_TRUNC 169*4d495c6eSApple OSS Distributions inline int O_EXCL = 0x0800; 170*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_EXCL 171*4d495c6eSApple OSS Distributions inline int O_RESOLVE_BENEATH = 0x1000; 172*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_RESOLVE_BENEATH 173*4d495c6eSApple OSS Distributions inline int O_EVTONLY = 0x8000; 174*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_EVTONLY 175*4d495c6eSApple OSS Distributions inline int O_NOCTTY = 0x20000; 176*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_NOCTTY 177*4d495c6eSApple OSS Distributions inline int O_DIRECTORY = 0x100000; 178*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_DIRECTORY 179*4d495c6eSApple OSS Distributions inline int O_SYMLINK = 0x200000; 180*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_SYMLINK 181*4d495c6eSApple OSS Distributions inline int O_NOFOLLOW_ANY = 0x20000000; 182*4d495c6eSApple OSS Distributions #pragma D binding "1.1" O_NOFOLLOW_ANY 183*4d495c6eSApple OSS Distributions 184*4d495c6eSApple OSS Distributions /* From bsd/sys/file_internal.h */ 185*4d495c6eSApple OSS Distributions inline int DTYPE_VNODE = 1; 186*4d495c6eSApple OSS Distributions #pragma D binding "1.1" DTYPE_VNODE 187*4d495c6eSApple OSS Distributions inline int DTYPE_SOCKET = 2; 188*4d495c6eSApple OSS Distributions #pragma D binding "1.1" DTYPE_SOCKET 189*4d495c6eSApple OSS Distributions inline int DTYPE_PSXSHM = 3; 190*4d495c6eSApple OSS Distributions #pragma D binding "1.1" DTYPE_PSXSHM 191*4d495c6eSApple OSS Distributions inline int DTYPE_PSXSEM = 4; 192*4d495c6eSApple OSS Distributions #pragma D binding "1.1" DTYPE_PSXSEM 193*4d495c6eSApple OSS Distributions inline int DTYPE_KQUEUE = 5; 194*4d495c6eSApple OSS Distributions #pragma D binding "1.1" DTYPE_KQUEUE 195*4d495c6eSApple OSS Distributions inline int DTYPE_PIPE = 6; 196*4d495c6eSApple OSS Distributions #pragma D binding "1.1" DTYPE_PIPE 197*4d495c6eSApple OSS Distributions inline int DTYPE_FSEVENTS = 7; 198*4d495c6eSApple OSS Distributions #pragma D binding "1.1" DTYPE_FSEVENTS 199*4d495c6eSApple OSS Distributions 200*4d495c6eSApple OSS Distributions #pragma D binding "1.1" translator 201*4d495c6eSApple OSS Distributions translator fileinfo_t < struct fileglob *F > { 202*4d495c6eSApple OSS Distributions fi_name = (F == NULL) ? "<none>" : 203*4d495c6eSApple OSS Distributions F->fg_ops->fo_type == DTYPE_VNODE ? 204*4d495c6eSApple OSS Distributions ((struct vnode *)F->fg_data)->v_name == NULL ? "<unknown (NULL v_name)>" : ((struct vnode *)F->fg_data)->v_name : 205*4d495c6eSApple OSS Distributions F->fg_ops->fo_type == DTYPE_SOCKET ? "<socket>" : 206*4d495c6eSApple OSS Distributions F->fg_ops->fo_type == DTYPE_PSXSHM ? "<shared memory>" : 207*4d495c6eSApple OSS Distributions F->fg_ops->fo_type == DTYPE_PSXSEM ? "<semaphore>" : 208*4d495c6eSApple OSS Distributions F->fg_ops->fo_type == DTYPE_KQUEUE ? "<kqueue>" : 209*4d495c6eSApple OSS Distributions F->fg_ops->fo_type == DTYPE_PIPE ? "<pipe>" : 210*4d495c6eSApple OSS Distributions F->fg_ops->fo_type == DTYPE_FSEVENTS ? "<fsevents>" : "<unknown (BAD fo_type)>"; 211*4d495c6eSApple OSS Distributions 212*4d495c6eSApple OSS Distributions fi_dirname = (F == NULL) ? "<none>" : 213*4d495c6eSApple OSS Distributions F->fg_ops->fo_type != DTYPE_VNODE ? "<unknown (not a vnode)>" : 214*4d495c6eSApple OSS Distributions ((struct vnode *)F->fg_data)->v_parent == NULL ? "<unknown (NULL v_parent)>" : 215*4d495c6eSApple OSS Distributions (((struct vnode *)F->fg_data)->v_parent->v_name == NULL ? "<unknown (NULL v_name)>" : 216*4d495c6eSApple OSS Distributions ((struct vnode *)F->fg_data)->v_parent->v_name); 217*4d495c6eSApple OSS Distributions 218*4d495c6eSApple OSS Distributions fi_pathname = (F == NULL) ? "<none>" : 219*4d495c6eSApple OSS Distributions F->fg_ops->fo_type != DTYPE_VNODE ? "<unknown (not a vnode)>" : 220*4d495c6eSApple OSS Distributions strjoin("??/", 221*4d495c6eSApple OSS Distributions strjoin(((struct vnode *)F->fg_data)->v_parent == NULL ? "<unknown (NULL v_parent)>" : 222*4d495c6eSApple OSS Distributions (((struct vnode *)F->fg_data)->v_parent->v_name == NULL ? "<unknown (NULL v_name)>" : 223*4d495c6eSApple OSS Distributions ((struct vnode *)F->fg_data)->v_parent->v_name), 224*4d495c6eSApple OSS Distributions strjoin("/", 225*4d495c6eSApple OSS Distributions ((struct vnode *)F->fg_data)->v_name == NULL ? "<unknown (NULL v_name)>" : 226*4d495c6eSApple OSS Distributions ((struct vnode *)F->fg_data)->v_name))); 227*4d495c6eSApple OSS Distributions 228*4d495c6eSApple OSS Distributions fi_offset = (F == NULL) ? 0 : 229*4d495c6eSApple OSS Distributions F->fg_offset; 230*4d495c6eSApple OSS Distributions 231*4d495c6eSApple OSS Distributions fi_fs = (F == NULL) ? "<none>" : 232*4d495c6eSApple OSS Distributions F->fg_ops->fo_type != DTYPE_VNODE ? "<unknown (not a vnode)>" : 233*4d495c6eSApple OSS Distributions ((struct vnode *)F->fg_data)->v_mount->mnt_vtable->vfc_name; 234*4d495c6eSApple OSS Distributions 235*4d495c6eSApple OSS Distributions fi_mount = (F == NULL) ? "<none>" : 236*4d495c6eSApple OSS Distributions F->fg_ops->fo_type != DTYPE_VNODE ? "<unknown (not a vnode)>" : 237*4d495c6eSApple OSS Distributions ((struct vnode *)F->fg_data)->v_mount->mnt_vnodecovered == NULL ? "/" : 238*4d495c6eSApple OSS Distributions ((struct vnode *)F->fg_data)->v_mount->mnt_vnodecovered->v_name; 239*4d495c6eSApple OSS Distributions 240*4d495c6eSApple OSS Distributions fi_oflags = (F == NULL) ? 0 : 241*4d495c6eSApple OSS Distributions F->fg_flag - 1; /* Subtract one to map FREAD/FWRITE bitfield to O_RD/WR open() flags. */ 242*4d495c6eSApple OSS Distributions }; 243*4d495c6eSApple OSS Distributions 244*4d495c6eSApple OSS Distributions inline fileinfo_t fds[int fd] = xlate <fileinfo_t> ( 245*4d495c6eSApple OSS Distributions (fd >= 0 && fd < curproc->p_fd.fd_afterlast) ? 246*4d495c6eSApple OSS Distributions (struct fileglob *)(curproc->p_fd.fd_ofiles[fd]->fp_glob) : 247*4d495c6eSApple OSS Distributions (struct fileglob *)NULL); 248*4d495c6eSApple OSS Distributions 249*4d495c6eSApple OSS Distributions #pragma D attributes Stable/Stable/Common fds 250*4d495c6eSApple OSS Distributions #pragma D binding "1.1" fds 251*4d495c6eSApple OSS Distributions 252*4d495c6eSApple OSS Distributions #pragma D binding "1.2" translator 253*4d495c6eSApple OSS Distributions translator fileinfo_t < struct vnode *V > { 254*4d495c6eSApple OSS Distributions fi_name = V->v_name == NULL ? "<unknown (NULL v_name)>" : V->v_name; 255*4d495c6eSApple OSS Distributions 256*4d495c6eSApple OSS Distributions fi_dirname = V->v_parent == NULL ? "<unknown (NULL v_parent)>" : 257*4d495c6eSApple OSS Distributions (V->v_parent->v_name == NULL ? "<unknown (NULL v_name)>" : V->v_parent->v_name); 258*4d495c6eSApple OSS Distributions 259*4d495c6eSApple OSS Distributions fi_pathname = strjoin("??/", 260*4d495c6eSApple OSS Distributions strjoin(V->v_parent == NULL ? "<unknown (NULL v_parent)>" : 261*4d495c6eSApple OSS Distributions (V->v_parent->v_name == NULL ? "<unknown (NULL v_name)>" : V->v_parent->v_name), 262*4d495c6eSApple OSS Distributions strjoin("/", 263*4d495c6eSApple OSS Distributions V->v_name == NULL ? "<unknown (NULL v_name)>" : V->v_name))); 264*4d495c6eSApple OSS Distributions 265*4d495c6eSApple OSS Distributions fi_fs = V->v_mount->mnt_vtable->vfc_name; 266*4d495c6eSApple OSS Distributions 267*4d495c6eSApple OSS Distributions fi_mount = V->v_mount->mnt_vnodecovered == NULL ? "/" : V->v_mount->mnt_vnodecovered->v_name; 268*4d495c6eSApple OSS Distributions }; 269*4d495c6eSApple OSS Distributions 270