summaryrefslogtreecommitdiff
path: root/block_device.c
blob: 87e7209c0ae59a408cdf1a94938c8a0589400c94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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;
	}
}