X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Ffind_root_device.c;h=c595321dfe832f0197e2363047a387f997664edf;hb=1dc0ccafddf9b5f540008b7cabbf3ab1f4f53ee3;hp=75ed1a979be024a75f2a52028207532c1c3289c6;hpb=c911a4389bbaa5ac85d725c8c05e452dfba8583d;p=oweals%2Fbusybox.git diff --git a/libbb/find_root_device.c b/libbb/find_root_device.c index 75ed1a979..c595321df 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-2003 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,10 +17,6 @@ * 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 @@ -38,40 +32,43 @@ extern char *find_real_root_device_name(const char* name) DIR *dir; struct dirent *entry; struct stat statBuf, rootStat; - char *fileName; + char *fileName = NULL; + dev_t dev; - if (stat("/", &rootStat) != 0) { - error_msg("could not stat '/'"); - return NULL; - } + if (stat("/", &rootStat) != 0) + bb_perror_msg("could not stat '/'"); + else { + if ((dev = rootStat.st_rdev)==0) + dev=rootStat.st_dev; - dir = opendir("/dev"); - if (!dir) { - error_msg("could not open '/dev'"); - return NULL; - } + dir = opendir("/dev"); + if (!dir) + bb_perror_msg("could not open '/dev'"); + else { + while((entry = readdir(dir)) != NULL) { + const char *myname = entry->d_name; + /* Must skip ".." since that is "/", and so we + * would get a false positive on ".." */ + if (myname[0] == '.' && myname[1] == '.' && !myname[2]) + continue; - while((entry = readdir(dir)) != NULL) { + fileName = concat_path_file("/dev", myname); - /* 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; + /* 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 == dev) + break; + free(fileName); + fileName=NULL; + } + closedir(dir); } - free(fileName); } - closedir(dir); - - return NULL; + if(fileName==NULL) + fileName = bb_xstrdup("/dev/root"); + return fileName; }