summaryrefslogtreecommitdiff
path: root/block_device.c
diff options
context:
space:
mode:
Diffstat (limited to 'block_device.c')
-rw-r--r--block_device.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/block_device.c b/block_device.c
new file mode 100644
index 0000000..87e7209
--- /dev/null
+++ b/block_device.c
@@ -0,0 +1,64 @@
+#include "internal.h"
+#include <dirent.h>
+#include <string.h>
+#include <stdio.h>
+
+const char block_device_usage[] = "block_device mount-point";
+
+static dev_t *my_device;
+static char *my_device_name;
+
+int
+match_mount(const struct FileInfo * i) {
+ if ( S_ISBLK(i->stat.st_mode)
+ && (i->stat.st_rdev == *my_device)) {
+ my_device_name=strdup(i->source);
+ return 1;
+ } else
+ return 0;
+}
+
+extern int
+block_device_main(struct FileInfo * i, int argc, char * * argv)
+{
+ char *device_name = block_device(argv[1],i);
+ if ( device_name == NULL )
+ return -1;
+ printf("%s\n", device_name);
+ exit(0);
+}
+
+char * block_device(const char *name, struct FileInfo *i)
+{
+ struct stat s;
+ char *buf;
+ int dinam=0;
+
+ if ( stat(name, &s) ) return (char *) NULL;
+ if (!i) {
+ i=(struct FileInfo*)malloc(sizeof(struct FileInfo));
+ dinam = 1;
+ }
+ memset((void *)i, 0, sizeof(struct FileInfo));
+ my_device=(dev_t *)malloc(sizeof(dev_t));
+ *my_device = s.st_dev;
+ my_device_name = NULL;
+ i->source = "/dev";
+ i->stat = s;
+ i->processDirectoriesAfterTheirContents=1;
+ descend(i, match_mount);
+ if (dinam) free(i);
+ if ( my_device_name ) {
+ buf = strdup(my_device_name);
+ free(my_device);
+ free(my_device_name);
+ return buf;
+ } else {
+ fprintf( stderr
+ ,"Can't find special file for block device %d, %d.\n"
+ ,(int) *my_device >> 8 & 0xff
+ ,(int) *my_device & 0xff);
+ free(my_device);
+ return (char *) NULL;
+ }
+}