From afb2fb552003fe76fd084916166dfa64d7ee9ed6 Mon Sep 17 00:00:00 2001 From: Kobi Cohen-Arazi Date: Mon, 26 Jul 2010 12:48:36 -0600 Subject: 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 . --- rootdev.c | 49 ++++++++++++++++++++++++++++++++++++++++--------- 1 file 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; } -- cgit v1.2.3