1/* 2 * lkud.c -- device lookup functions for lsof library 3 */ 4 5 6/* 7 * Copyright 1997 Purdue Research Foundation, West Lafayette, Indiana 8 * 47907. All rights reserved. 9 * 10 * Written by Victor A. Abell 11 * 12 * This software is not subject to any license of the American Telephone 13 * and Telegraph Company or the Regents of the University of California. 14 * 15 * Permission is granted to anyone to use this software for any purpose on 16 * any computer system, and to alter it and redistribute it freely, subject 17 * to the following restrictions: 18 * 19 * 1. Neither the authors nor Purdue University are responsible for any 20 * consequences of the use of this software. 21 * 22 * 2. The origin of this software must not be misrepresented, either by 23 * explicit claim or by omission. Credit to the authors and Purdue 24 * University must appear in documentation and sources. 25 * 26 * 3. Altered versions must be plainly marked as such, and must not be 27 * misrepresented as being the original software. 28 * 29 * 4. This notice may not be removed or altered. 30 */ 31 32 33/* 34 * lkud.c -- lookup device 35 * 36 * The caller may define: 37 * 38 * HASBLKDEV to activate block device lookup 39 */ 40 41 42#include "../machine.h" 43 44#if defined(HASBLKDEV) || defined(USE_LIB_LKUPDEV) 45 46# if !defined(lint) 47static char copyright[] = 48"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n"; 49static char *rcsid = "$Id: lkud.c,v 1.7 2008/10/21 16:12:36 abe Exp $"; 50# endif /* !defined(lint) */ 51 52#include "../lsof.h" 53 54#else /* !defined(HASBLKDEV) && !defined(USE_LIB_LKUPDEV) */ 55char lkud_d1[] = "d"; char *lkud_d2 = lkud_d1; 56#endif /* defined(HASBLKDEV) || defined(USE_LIB_LKUPDEV) */ 57 58 59 60#if defined(HASBLKDEV) 61/* 62 * lkupbdev() - look up a block device 63 */ 64 65struct l_dev * 66lkupbdev(dev, rdev, i, r) 67 dev_t *dev; /* pointer to device number */ 68 dev_t *rdev; /* pointer to raw device number */ 69 int i; /* inode match status */ 70 int r; /* if 1, rebuild the device cache with 71 * rereaddev() when no match is found 72 * and HASDCACHE is defined and 73 * DCunsafe is one */ 74{ 75 INODETYPE inode = (INODETYPE)0; 76 int low, hi, mid; 77 struct l_dev *dp; 78 int ty = 0; 79 80 if (*dev != DevDev) 81 return((struct l_dev *)NULL); 82 readdev(0); 83 if (i) { 84 inode = Lf->inode; 85 ty = Lf->inp_ty; 86 } 87/* 88 * Search block device table for match. 89 */ 90 91# if defined(HASDCACHE) 92 93lkupbdev_again: 94 95# endif /* defined(HASDCACHE) */ 96 97 low = mid = 0; 98 hi = BNdev - 1; 99 while (low <= hi) { 100 mid = (low + hi) / 2; 101 dp = BSdev[mid]; 102 if (*rdev < dp->rdev) 103 hi = mid - 1; 104 else if (*rdev > dp->rdev) 105 low = mid + 1; 106 else { 107 if ((i == 0) || (ty != 1) || (inode == dp->inode)) { 108 109# if defined(HASDCACHE) 110 if (DCunsafe && !dp->v && !vfy_dev(dp)) 111 goto lkupbdev_again; 112# endif /* defined(HASDCACHE) */ 113 114 return(dp); 115 } 116 if (inode < dp->inode) 117 hi = mid - 1; 118 else 119 low = mid + 1; 120 } 121 } 122 123# if defined(HASDCACHE) 124 if (DCunsafe && r) { 125 (void) rereaddev(); 126 goto lkupbdev_again; 127 } 128# endif /* defined(HASDCACHE) */ 129 130 return((struct l_dev *)NULL); 131} 132#endif /* defined(HASBLKDEV) */ 133 134 135#if defined(USE_LIB_LKUPDEV) 136/* 137 * lkupdev() - look up a character device 138 */ 139 140struct l_dev * 141lkupdev(dev, rdev, i, r) 142 dev_t *dev; /* pointer to device number */ 143 dev_t *rdev; /* pointer to raw device number */ 144 int i; /* inode match status */ 145 int r; /* if 1, rebuild the device cache with 146 * rereaddev() when no match is found 147 * and HASDCACHE is defined and 148 * DCunsafe is one */ 149{ 150 INODETYPE inode = (INODETYPE)0; 151 int low, hi, mid; 152 struct l_dev *dp; 153 int ty = 0; 154 155 if (*dev != DevDev) 156 return((struct l_dev *)NULL); 157 readdev(0); 158 if (i) { 159 inode = Lf->inode; 160 ty = Lf->inp_ty; 161 } 162/* 163 * Search device table for match. 164 */ 165 166# if defined(HASDCACHE) 167 168lkupdev_again: 169 170# endif /* defined(HASDCACHE) */ 171 172 low = mid = 0; 173 hi = Ndev - 1; 174 while (low <= hi) { 175 mid = (low + hi) / 2; 176 dp = Sdev[mid]; 177 if (*rdev < dp->rdev) 178 hi = mid - 1; 179 else if (*rdev > dp->rdev) 180 low = mid + 1; 181 else { 182 if ((i == 0) || (ty != 1) || (inode == dp->inode)) { 183 184# if defined(HASDCACHE) 185 if (DCunsafe && !dp->v && !vfy_dev(dp)) 186 goto lkupdev_again; 187# endif /* defined(HASDCACHE) */ 188 189 return(dp); 190 } 191 if (inode < dp->inode) 192 hi = mid - 1; 193 else 194 low = mid + 1; 195 } 196 } 197 198# if defined(HASDCACHE) 199 if (DCunsafe && r) { 200 (void) rereaddev(); 201 goto lkupdev_again; 202 } 203# endif /* defined(HASDCACHE) */ 204 205 return((struct l_dev *)NULL); 206} 207#endif /* defined(USE_LIB_LKUPDEV) */ 208