summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKobi Cohen-Arazi <kobic@codeaurora.org>2010-07-26 12:48:36 -0600
committerBrian Daugherty <bdaugher@codeaurora.org>2010-07-26 12:48:36 -0600
commitafb2fb552003fe76fd084916166dfa64d7ee9ed6 (patch)
tree2308dd2fbe40254f7be238833e01c17024b4cac0
parentcc97f1875c66a6fbe65772e8c09526a0e785fd0c (diff)
downloadplatform_external_rootdev-afb2fb552003fe76fd084916166dfa64d7ee9ed6.tar.gz
platform_external_rootdev-afb2fb552003fe76fd084916166dfa64d7ee9ed6.tar.bz2
platform_external_rootdev-afb2fb552003fe76fd084916166dfa64d7ee9ed6.zip
rootdev.c: Added -d option to strip trailing partition number
Change-Id: I2afbb0a8546f48224292433e2efcf0a868c7a1c6 Review URL: http://codereview.chromium.org/2814040 Patch from Kobi Cohen-Arazi <kobic@codeaurora.org>.
-rw-r--r--rootdev.c49
1 files changed, 40 insertions, 9 deletions
diff --git a/rootdev.c b/rootdev.c
index 053745d..c3dc175 100644
--- a/rootdev.c
+++ b/rootdev.c
@@ -13,7 +13,7 @@
static int
-find_dev_recursive(char *dirnamebuf, int number) {
+find_dev_recursive(char *dirnamebuf, int number, int deviceOnly) {
DIR *dp;
struct dirent *dir;
struct stat s;
@@ -31,10 +31,23 @@ find_dev_recursive(char *dirnamebuf, int number) {
strcpy(dirnamebuf+dirnamelen+1, dir->d_name);
if (lstat(dirnamebuf, &s) < 0)
continue;
- if ((s.st_mode & S_IFMT) == S_IFBLK && s.st_rdev == number)
+ if ((s.st_mode & S_IFMT) == S_IFBLK && s.st_rdev == number){
+ if (deviceOnly) {
+ int len = strlen(dirnamebuf);
+ char c = 0;
+ do {
+ c = dirnamebuf[len-1];
+ --len;
+ }while(c > 0 && c < 9 && len > 0);
+ /* arm has "p" for partition */
+ if (dirnamebuf[len-1] == 'p')
+ --len;
+ dirnamebuf[len]='\0';
+ }
return 1;
+ }
if ((s.st_mode & S_IFMT) == S_IFDIR &&
- find_dev_recursive(dirnamebuf, number))
+ find_dev_recursive(dirnamebuf, number, deviceOnly))
return 1;
}
dirnamebuf[dirnamelen] = 0;
@@ -42,28 +55,46 @@ find_dev_recursive(char *dirnamebuf, int number) {
return 0;
}
+void usage(){
+ printf ("rootdev \n\t-d (for device only)\n");
+}
+
int main(int argc, char *argv[]) {
struct stat s;
char *file = "/";
static char name[PATH_MAX+1];
-
- if (argc > 1)
- file = argv[1];
+ int deviceOnly=0;
+ int c;
+ extern char *optarg;
+ extern int optind, optopt;
+ while ((c = getopt(argc, argv, "hd")) != -1) {
+ switch(c) {
+ case 'd':
+ deviceOnly=1;
+ break;
+ case 'h':
+ default:
+ usage();
+ return 1;
+ }
+ }
+ if (argc - optind >= 1)
+ file = argv[optind];
if (stat(file, &s) < 0)
err(1, "unable to stat %s", file);
-
+
if (!s.st_dev)
err(1, "unknown device number 0");
strcpy(name, "/dev");
- if (!find_dev_recursive(name, s.st_dev)) {
+ if (!find_dev_recursive(name, s.st_dev, deviceOnly)) {
fprintf(stderr, "unable to find match\n");
return 1;
}
printf("%s\n", name);
-
+
return 0;
}