Hunt for a disk to operate on, if we're passed a partition mountpoint, etc.
Concept reviewed by: phk
This commit is contained in:
parent
b47d073500
commit
656128586d
@ -80,6 +80,7 @@ struct uufsd {
|
|||||||
/* superblock as buffer */
|
/* superblock as buffer */
|
||||||
} d_sbunion;
|
} d_sbunion;
|
||||||
const char *d_error; /* human readable disk error */
|
const char *d_error; /* human readable disk error */
|
||||||
|
int d_mine; /* internal flags */
|
||||||
#define d_fs d_sbunion.d_fs
|
#define d_fs d_sbunion.d_fs
|
||||||
#define d_sb d_sbunion.d_sb
|
#define d_sb d_sbunion.d_sb
|
||||||
};
|
};
|
||||||
|
@ -39,6 +39,8 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
|
#include <fstab.h>
|
||||||
|
#include <paths.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -46,6 +48,9 @@ __FBSDID("$FreeBSD$");
|
|||||||
|
|
||||||
#include <libufs.h>
|
#include <libufs.h>
|
||||||
|
|
||||||
|
/* Internally, track the 'name' value, it's ours. */
|
||||||
|
#define MINE_NAME 0x01
|
||||||
|
|
||||||
struct uufsd *
|
struct uufsd *
|
||||||
ufs_disk_ctor(const char *name)
|
ufs_disk_ctor(const char *name)
|
||||||
{
|
{
|
||||||
@ -96,19 +101,42 @@ ufs_disk_close(struct uufsd *disk)
|
|||||||
free(disk->d_inoblock);
|
free(disk->d_inoblock);
|
||||||
disk->d_inoblock = NULL;
|
disk->d_inoblock = NULL;
|
||||||
}
|
}
|
||||||
|
if (disk->d_mine & MINE_NAME) {
|
||||||
|
free((char *)(uintptr_t)disk->d_name);
|
||||||
|
disk->d_name = NULL;
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
ufs_disk_fillout(struct uufsd *disk, const char *name)
|
ufs_disk_fillout(struct uufsd *disk, const char *name)
|
||||||
{
|
{
|
||||||
|
struct stat st;
|
||||||
|
struct fstab *fs;
|
||||||
|
const char *oname;
|
||||||
|
char dev[MAXPATHLEN];
|
||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
ERROR(disk, NULL);
|
ERROR(disk, NULL);
|
||||||
|
|
||||||
|
oname = name;
|
||||||
|
fs = getfsfile(name);
|
||||||
|
if (fs != NULL)
|
||||||
|
name = fs->fs_spec;
|
||||||
|
again: if (stat(name, &st) < 0) {
|
||||||
|
if (*name != '/') {
|
||||||
|
if (*name == 'r')
|
||||||
|
name++;
|
||||||
|
snprintf(dev, sizeof(dev), "%s%s", _PATH_DEV, name);
|
||||||
|
name = dev;
|
||||||
|
goto again;
|
||||||
|
}
|
||||||
|
ERROR(disk, "could not find special device");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
fd = open(name, O_RDONLY);
|
fd = open(name, O_RDONLY);
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
ERROR(disk, "failed to open disk for reading");
|
ERROR(disk, "could not open special device");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -117,10 +145,20 @@ ufs_disk_fillout(struct uufsd *disk, const char *name)
|
|||||||
disk->d_inoblock = NULL;
|
disk->d_inoblock = NULL;
|
||||||
disk->d_inomin = 0;
|
disk->d_inomin = 0;
|
||||||
disk->d_inomax = 0;
|
disk->d_inomax = 0;
|
||||||
disk->d_name = name;
|
disk->d_mine = 0;
|
||||||
disk->d_ufs = 0;
|
disk->d_ufs = 0;
|
||||||
disk->d_error = NULL;
|
disk->d_error = NULL;
|
||||||
|
|
||||||
|
if (oname != name) {
|
||||||
|
name = strdup(name);
|
||||||
|
if (name == NULL) {
|
||||||
|
ERROR(disk, "could not allocate memory for disk name");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
disk->d_mine |= MINE_NAME;
|
||||||
|
}
|
||||||
|
disk->d_name = name;
|
||||||
|
|
||||||
if (sbread(disk) == -1) {
|
if (sbread(disk) == -1) {
|
||||||
ERROR(disk, "could not read superblock to fill out disk");
|
ERROR(disk, "could not read superblock to fill out disk");
|
||||||
return -1;
|
return -1;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user