#include "../machine.h"
#if defined(HASBLKDEV) || defined(USE_LIB_LKUPDEV)
# if !defined(lint)
static char copyright[] =
"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
static char *rcsid = "$Id: lkud.c,v 1.7 2008/10/21 16:12:36 abe Exp $";
# endif
#include "../lsof.h"
#else
char lkud_d1[] = "d"; char *lkud_d2 = lkud_d1;
#endif
#if defined(HASBLKDEV)
struct l_dev *
lkupbdev(dev, rdev, i, r)
dev_t *dev;
dev_t *rdev;
int i;
int r;
{
INODETYPE inode = (INODETYPE)0;
int low, hi, mid;
struct l_dev *dp;
int ty = 0;
if (*dev != DevDev)
return((struct l_dev *)NULL);
readdev(0);
if (i) {
inode = Lf->inode;
ty = Lf->inp_ty;
}
# if defined(HASDCACHE)
lkupbdev_again:
# endif
low = mid = 0;
hi = BNdev - 1;
while (low <= hi) {
mid = (low + hi) / 2;
dp = BSdev[mid];
if (*rdev < dp->rdev)
hi = mid - 1;
else if (*rdev > dp->rdev)
low = mid + 1;
else {
if ((i == 0) || (ty != 1) || (inode == dp->inode)) {
# if defined(HASDCACHE)
if (DCunsafe && !dp->v && !vfy_dev(dp))
goto lkupbdev_again;
# endif
return(dp);
}
if (inode < dp->inode)
hi = mid - 1;
else
low = mid + 1;
}
}
# if defined(HASDCACHE)
if (DCunsafe && r) {
(void) rereaddev();
goto lkupbdev_again;
}
# endif
return((struct l_dev *)NULL);
}
#endif
#if defined(USE_LIB_LKUPDEV)
struct l_dev *
lkupdev(dev, rdev, i, r)
dev_t *dev;
dev_t *rdev;
int i;
int r;
{
INODETYPE inode = (INODETYPE)0;
int low, hi, mid;
struct l_dev *dp;
int ty = 0;
if (*dev != DevDev)
return((struct l_dev *)NULL);
readdev(0);
if (i) {
inode = Lf->inode;
ty = Lf->inp_ty;
}
# if defined(HASDCACHE)
lkupdev_again:
# endif
low = mid = 0;
hi = Ndev - 1;
while (low <= hi) {
mid = (low + hi) / 2;
dp = Sdev[mid];
if (*rdev < dp->rdev)
hi = mid - 1;
else if (*rdev > dp->rdev)
low = mid + 1;
else {
if ((i == 0) || (ty != 1) || (inode == dp->inode)) {
# if defined(HASDCACHE)
if (DCunsafe && !dp->v && !vfy_dev(dp))
goto lkupdev_again;
# endif
return(dp);
}
if (inode < dp->inode)
hi = mid - 1;
else
low = mid + 1;
}
}
# if defined(HASDCACHE)
if (DCunsafe && r) {
(void) rereaddev();
goto lkupdev_again;
}
# endif
return((struct l_dev *)NULL);
}
#endif