X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Ffind_root_device.c;h=dfe0cfa7b5cbb7c11b40a4d61581b4ff3e48241f;hb=4e9deec8bf465552ff621a80421721b702051747;hp=75ed1a979be024a75f2a52028207532c1c3289c6;hpb=c911a4389bbaa5ac85d725c8c05e452dfba8583d;p=oweals%2Fbusybox.git diff --git a/libbb/find_root_device.c b/libbb/find_root_device.c index 75ed1a979..dfe0cfa7b 100644 --- a/libbb/find_root_device.c +++ b/libbb/find_root_device.c @@ -2,9 +2,7 @@ /* * Utility routines. * - * Copyright (C) tons of folks. Tracking down who wrote what - * isn't something I'm going to worry about... If you wrote something - * here, please feel free to acknowledge your work. + * Copyright (C) 1999-2004 by Erik Andersen * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -19,67 +17,34 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - * - * Based in part on code from sash, Copyright (c) 1999 by David I. Bell - * Permission has been granted to redistribute this code under the GPL. - * */ +#include #include #include #include #include #include "libbb.h" - - -extern char *find_real_root_device_name(const char* name) +extern char *find_block_device(char *path) { DIR *dir; struct dirent *entry; - struct stat statBuf, rootStat; - char *fileName; - - if (stat("/", &rootStat) != 0) { - error_msg("could not stat '/'"); - return NULL; - } - - dir = opendir("/dev"); - if (!dir) { - error_msg("could not open '/dev'"); - return NULL; - } + struct stat st; + dev_t dev; + char *retpath=NULL; + if(stat(path, &st) || !(dir = opendir("/dev"))) return NULL; + dev = (st.st_mode & S_IFMT) == S_IFBLK ? st.st_rdev : st.st_dev; while((entry = readdir(dir)) != NULL) { - - /* Must skip ".." since that is "/", and so we - * would get a false positive on ".." */ - if (strcmp(entry->d_name, "..") == 0) - continue; - - fileName = concat_path_file("/dev/", entry->d_name); - - /* Some char devices have the same dev_t as block - * devices, so make sure this is a block device */ - if (stat(fileName, &statBuf) == 0 && - S_ISBLK(statBuf.st_mode)!=0 && - statBuf.st_rdev == rootStat.st_rdev) { - return fileName; + char devpath[PATH_MAX]; + sprintf(devpath,"/dev/%s", entry->d_name); + if(!stat(devpath, &st) && S_ISBLK(st.st_mode) && st.st_rdev == dev) { + retpath = bb_xstrdup(devpath); + break; } - free(fileName); } closedir(dir); - return NULL; + return retpath; } - - -/* END CODE */ -/* -Local Variables: -c-file-style: "linux" -c-basic-offset: 4 -tab-width: 4 -End: -*/