Fail silently on failure to read tar header, its unfortunate that many tar implementa...
[oweals/busybox.git] / libbb / find_root_device.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * Copyright (C) 2000,2001 by Lineo, inc.
4  * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
5  *
6  * Patched by a bunch of people.  Feel free to acknowledge your work.
7  *
8  * This program is free software; you can redistribute it and/or modify
9  * it under the terms of the GNU General Public License as published by
10  * the Free Software Foundation; either version 2 of the License, or
11  * (at your option) any later version.
12  *
13  * This program is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * General Public License for more details.
17  *
18  * You should have received a copy of the GNU General Public License
19  * along with this program; if not, write to the Free Software
20  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21  *
22  */
23
24 #include <stdio.h>
25 #include <string.h>
26 #include <dirent.h>
27 #include <stdlib.h>
28 #include "libbb.h"
29
30
31
32 extern char *find_real_root_device_name(const char* name)
33 {
34         DIR *dir;
35         struct dirent *entry;
36         struct stat statBuf, rootStat;
37         char *fileName = NULL;
38         dev_t dev;
39
40         if (stat("/", &rootStat) != 0) 
41                 perror_msg("could not stat '/'");
42         else {
43                 if ((dev = rootStat.st_rdev)==0) 
44                         dev=rootStat.st_dev;
45
46                 dir = opendir("/dev");
47                 if (!dir) 
48                         perror_msg("could not open '/dev'");
49                 else {
50                         while((entry = readdir(dir)) != NULL) {
51
52                                 /* Must skip ".." since that is "/", and so we 
53                                  * would get a false positive on ".."  */
54                                 if (strcmp(entry->d_name, "..") == 0)
55                                         continue;
56
57                                 fileName = concat_path_file("/dev", entry->d_name);
58
59                                 /* Some char devices have the same dev_t as block
60                                  * devices, so make sure this is a block device */
61                                 if (stat(fileName, &statBuf) == 0 && 
62                                                 S_ISBLK(statBuf.st_mode)!=0 &&
63                                                 statBuf.st_rdev == dev) 
64                                         break;
65                                 free(fileName);
66                                 fileName=NULL;
67                         }
68                         closedir(dir);
69                 }
70         }
71         if(fileName==NULL)
72                 fileName=xstrdup("/dev/root");
73         return fileName;
74 }
75
76
77 /* END CODE */
78 /*
79 Local Variables:
80 c-file-style: "linux"
81 c-basic-offset: 4
82 tab-width: 4
83 End:
84 */