hush/block_device.c

65 lines
1.4 KiB
C
Raw Normal View History

1999-10-05 16:24:54 +00:00
#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;
}
}