| Index: rootdev.c | 
| diff --git a/rootdev.c b/rootdev.c | 
| index 053745d41b750a1d05c36b63f9952b9ecb7a2f81..c3dc175d8fc99221c44f1231f5996b9bffe37d24 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; | 
| } | 
|  |