MFhead @ r275688
This commit is contained in:
commit
d455aba884
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/projects/building-blocks/; revision=275689
@ -1,5 +1,5 @@
|
|||||||
.\" $File: file.man,v 1.106 2014/03/07 23:11:51 christos Exp $
|
.\" $File: file.man,v 1.106 2014/03/07 23:11:51 christos Exp $
|
||||||
.Dd January 30, 2014
|
.Dd December 3, 2014
|
||||||
.Dt FILE __CSECTION__
|
.Dt FILE __CSECTION__
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -385,6 +385,7 @@ options.
|
|||||||
.Xr hexdump 1 ,
|
.Xr hexdump 1 ,
|
||||||
.Xr od 1 ,
|
.Xr od 1 ,
|
||||||
.Xr strings 1 ,
|
.Xr strings 1 ,
|
||||||
|
.Xr fstyp 8
|
||||||
.Sh STANDARDS CONFORMANCE
|
.Sh STANDARDS CONFORMANCE
|
||||||
This program is believed to exceed the System V Interface Definition
|
This program is believed to exceed the System V Interface Definition
|
||||||
of FILE(CMD), as near as one can determine from the vague language
|
of FILE(CMD), as near as one can determine from the vague language
|
||||||
|
@ -35,10 +35,12 @@
|
|||||||
switch (type) {
|
switch (type) {
|
||||||
#ifdef ELFCORE
|
#ifdef ELFCORE
|
||||||
case ET_CORE:
|
case ET_CORE:
|
||||||
|
phnum = elf_getu16(swap, elfhdr.e_phnum);
|
||||||
|
if (phnum > MAX_PHNUM)
|
||||||
|
return toomany(ms, "program", phnum);
|
||||||
flags |= FLAGS_IS_CORE;
|
flags |= FLAGS_IS_CORE;
|
||||||
if (dophn_core(ms, clazz, swap, fd,
|
if (dophn_core(ms, clazz, swap, fd,
|
||||||
(off_t)elf_getu(swap, elfhdr.e_phoff),
|
(off_t)elf_getu(swap, elfhdr.e_phoff), phnum,
|
||||||
elf_getu16(swap, elfhdr.e_phnum),
|
|
||||||
(size_t)elf_getu16(swap, elfhdr.e_phentsize),
|
(size_t)elf_getu16(swap, elfhdr.e_phentsize),
|
||||||
fsize, &flags) == -1)
|
fsize, &flags) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
@ -46,18 +48,24 @@
|
|||||||
#endif
|
#endif
|
||||||
case ET_EXEC:
|
case ET_EXEC:
|
||||||
case ET_DYN:
|
case ET_DYN:
|
||||||
|
phnum = elf_getu16(swap, elfhdr.e_phnum);
|
||||||
|
if (phnum > MAX_PHNUM)
|
||||||
|
return toomany(ms, "program", phnum);
|
||||||
|
shnum = elf_getu16(swap, elfhdr.e_shnum);
|
||||||
|
if (shnum > MAX_SHNUM)
|
||||||
|
return toomany(ms, "section", shnum);
|
||||||
if (dophn_exec(ms, clazz, swap, fd,
|
if (dophn_exec(ms, clazz, swap, fd,
|
||||||
(off_t)elf_getu(swap, elfhdr.e_phoff),
|
(off_t)elf_getu(swap, elfhdr.e_phoff), phnum,
|
||||||
elf_getu16(swap, elfhdr.e_phnum),
|
|
||||||
(size_t)elf_getu16(swap, elfhdr.e_phentsize),
|
(size_t)elf_getu16(swap, elfhdr.e_phentsize),
|
||||||
fsize, &flags, elf_getu16(swap, elfhdr.e_shnum))
|
fsize, &flags, shnum) == -1)
|
||||||
== -1)
|
|
||||||
return -1;
|
return -1;
|
||||||
/*FALLTHROUGH*/
|
/*FALLTHROUGH*/
|
||||||
case ET_REL:
|
case ET_REL:
|
||||||
|
shnum = elf_getu16(swap, elfhdr.e_shnum);
|
||||||
|
if (shnum > MAX_SHNUM)
|
||||||
|
return toomany(ms, "section", shnum);
|
||||||
if (doshn(ms, clazz, swap, fd,
|
if (doshn(ms, clazz, swap, fd,
|
||||||
(off_t)elf_getu(swap, elfhdr.e_shoff),
|
(off_t)elf_getu(swap, elfhdr.e_shoff), shnum,
|
||||||
elf_getu16(swap, elfhdr.e_shnum),
|
|
||||||
(size_t)elf_getu16(swap, elfhdr.e_shentsize),
|
(size_t)elf_getu16(swap, elfhdr.e_shentsize),
|
||||||
fsize, &flags, elf_getu16(swap, elfhdr.e_machine),
|
fsize, &flags, elf_getu16(swap, elfhdr.e_machine),
|
||||||
(int)elf_getu16(swap, elfhdr.e_shstrndx)) == -1)
|
(int)elf_getu16(swap, elfhdr.e_shstrndx)) == -1)
|
||||||
|
@ -482,6 +482,14 @@ protected int file_regexec(file_regex_t *, const char *, size_t, regmatch_t *,
|
|||||||
protected void file_regfree(file_regex_t *);
|
protected void file_regfree(file_regex_t *);
|
||||||
protected void file_regerror(file_regex_t *, int, struct magic_set *);
|
protected void file_regerror(file_regex_t *, int, struct magic_set *);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *buf;
|
||||||
|
uint32_t offset;
|
||||||
|
} file_pushbuf_t;
|
||||||
|
|
||||||
|
protected file_pushbuf_t *file_push_buffer(struct magic_set *);
|
||||||
|
protected char *file_pop_buffer(struct magic_set *, file_pushbuf_t *);
|
||||||
|
|
||||||
#ifndef COMPILE_ONLY
|
#ifndef COMPILE_ONLY
|
||||||
extern const char *file_names[];
|
extern const char *file_names[];
|
||||||
extern const size_t file_nnames;
|
extern const size_t file_nnames;
|
||||||
|
@ -491,3 +491,43 @@ file_regerror(file_regex_t *rx, int rc, struct magic_set *ms)
|
|||||||
file_magerror(ms, "regex error %d for `%s', (%s)", rc, rx->pat,
|
file_magerror(ms, "regex error %d for `%s', (%s)", rc, rx->pat,
|
||||||
errmsg);
|
errmsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected file_pushbuf_t *
|
||||||
|
file_push_buffer(struct magic_set *ms)
|
||||||
|
{
|
||||||
|
file_pushbuf_t *pb;
|
||||||
|
|
||||||
|
if (ms->event_flags & EVENT_HAD_ERR)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if ((pb = (CAST(file_pushbuf_t *, malloc(sizeof(*pb))))) == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
pb->buf = ms->o.buf;
|
||||||
|
pb->offset = ms->offset;
|
||||||
|
|
||||||
|
ms->o.buf = NULL;
|
||||||
|
ms->offset = 0;
|
||||||
|
|
||||||
|
return pb;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected char *
|
||||||
|
file_pop_buffer(struct magic_set *ms, file_pushbuf_t *pb)
|
||||||
|
{
|
||||||
|
char *rbuf;
|
||||||
|
|
||||||
|
if (ms->event_flags & EVENT_HAD_ERR) {
|
||||||
|
free(pb->buf);
|
||||||
|
free(pb);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
rbuf = ms->o.buf;
|
||||||
|
|
||||||
|
ms->o.buf = pb->buf;
|
||||||
|
ms->offset = pb->offset;
|
||||||
|
|
||||||
|
free(pb);
|
||||||
|
return rbuf;
|
||||||
|
}
|
||||||
|
@ -60,6 +60,18 @@ private uint16_t getu16(int, uint16_t);
|
|||||||
private uint32_t getu32(int, uint32_t);
|
private uint32_t getu32(int, uint32_t);
|
||||||
private uint64_t getu64(int, uint64_t);
|
private uint64_t getu64(int, uint64_t);
|
||||||
|
|
||||||
|
#define MAX_PHNUM 256
|
||||||
|
#define MAX_SHNUM 1024
|
||||||
|
|
||||||
|
private int
|
||||||
|
toomany(struct magic_set *ms, const char *name, uint16_t num)
|
||||||
|
{
|
||||||
|
if (file_printf(ms, ", too many %s header sections (%u)", name, num
|
||||||
|
) == -1)
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
private uint16_t
|
private uint16_t
|
||||||
getu16(int swap, uint16_t value)
|
getu16(int swap, uint16_t value)
|
||||||
{
|
{
|
||||||
@ -477,6 +489,13 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
|
|||||||
uint32_t namesz, descsz;
|
uint32_t namesz, descsz;
|
||||||
unsigned char *nbuf = CAST(unsigned char *, vbuf);
|
unsigned char *nbuf = CAST(unsigned char *, vbuf);
|
||||||
|
|
||||||
|
if (xnh_sizeof + offset > size) {
|
||||||
|
/*
|
||||||
|
* We're out of note headers.
|
||||||
|
*/
|
||||||
|
return xnh_sizeof + offset;
|
||||||
|
}
|
||||||
|
|
||||||
(void)memcpy(xnh_addr, &nbuf[offset], xnh_sizeof);
|
(void)memcpy(xnh_addr, &nbuf[offset], xnh_sizeof);
|
||||||
offset += xnh_sizeof;
|
offset += xnh_sizeof;
|
||||||
|
|
||||||
@ -492,13 +511,13 @@ donote(struct magic_set *ms, void *vbuf, size_t offset, size_t size,
|
|||||||
if (namesz & 0x80000000) {
|
if (namesz & 0x80000000) {
|
||||||
(void)file_printf(ms, ", bad note name size 0x%lx",
|
(void)file_printf(ms, ", bad note name size 0x%lx",
|
||||||
(unsigned long)namesz);
|
(unsigned long)namesz);
|
||||||
return offset;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (descsz & 0x80000000) {
|
if (descsz & 0x80000000) {
|
||||||
(void)file_printf(ms, ", bad note description size 0x%lx",
|
(void)file_printf(ms, ", bad note description size 0x%lx",
|
||||||
(unsigned long)descsz);
|
(unsigned long)descsz);
|
||||||
return offset;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -900,6 +919,7 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
|
|||||||
Elf32_Shdr sh32;
|
Elf32_Shdr sh32;
|
||||||
Elf64_Shdr sh64;
|
Elf64_Shdr sh64;
|
||||||
int stripped = 1;
|
int stripped = 1;
|
||||||
|
size_t nbadcap = 0;
|
||||||
void *nbuf;
|
void *nbuf;
|
||||||
off_t noff, coff, name_off;
|
off_t noff, coff, name_off;
|
||||||
uint64_t cap_hw1 = 0; /* SunOS 5.x hardware capabilites */
|
uint64_t cap_hw1 = 0; /* SunOS 5.x hardware capabilites */
|
||||||
@ -988,6 +1008,8 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
|
|||||||
goto skip;
|
goto skip;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nbadcap > 5)
|
||||||
|
break;
|
||||||
if (lseek(fd, xsh_offset, SEEK_SET) == (off_t)-1) {
|
if (lseek(fd, xsh_offset, SEEK_SET) == (off_t)-1) {
|
||||||
file_badseek(ms);
|
file_badseek(ms);
|
||||||
return -1;
|
return -1;
|
||||||
@ -1053,6 +1075,8 @@ doshn(struct magic_set *ms, int clazz, int swap, int fd, off_t off, int num,
|
|||||||
(unsigned long long)xcap_tag,
|
(unsigned long long)xcap_tag,
|
||||||
(unsigned long long)xcap_val) == -1)
|
(unsigned long long)xcap_val) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
|
if (nbadcap++ > 2)
|
||||||
|
coff = xsh_size;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1233,7 +1257,7 @@ file_tryelf(struct magic_set *ms, int fd, const unsigned char *buf,
|
|||||||
int flags = 0;
|
int flags = 0;
|
||||||
Elf32_Ehdr elf32hdr;
|
Elf32_Ehdr elf32hdr;
|
||||||
Elf64_Ehdr elf64hdr;
|
Elf64_Ehdr elf64hdr;
|
||||||
uint16_t type;
|
uint16_t type, phnum, shnum;
|
||||||
|
|
||||||
if (ms->flags & (MAGIC_MIME|MAGIC_APPLE))
|
if (ms->flags & (MAGIC_MIME|MAGIC_APPLE))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -67,6 +67,9 @@ private void cvt_32(union VALUETYPE *, const struct magic *);
|
|||||||
private void cvt_64(union VALUETYPE *, const struct magic *);
|
private void cvt_64(union VALUETYPE *, const struct magic *);
|
||||||
|
|
||||||
#define OFFSET_OOB(n, o, i) ((n) < (o) || (i) > ((n) - (o)))
|
#define OFFSET_OOB(n, o, i) ((n) < (o) || (i) > ((n) - (o)))
|
||||||
|
|
||||||
|
#define MAX_RECURSION_LEVEL 10
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* softmagic - lookup one file in parsed, in-memory copy of database
|
* softmagic - lookup one file in parsed, in-memory copy of database
|
||||||
* Passed the name and FILE * of one file to be typed.
|
* Passed the name and FILE * of one file to be typed.
|
||||||
@ -1193,14 +1196,15 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m,
|
|||||||
int flip, int recursion_level, int *printed_something,
|
int flip, int recursion_level, int *printed_something,
|
||||||
int *need_separator, int *returnval)
|
int *need_separator, int *returnval)
|
||||||
{
|
{
|
||||||
uint32_t soffset, offset = ms->offset;
|
uint32_t offset = ms->offset;
|
||||||
uint32_t lhs;
|
uint32_t lhs;
|
||||||
|
file_pushbuf_t *pb;
|
||||||
int rv, oneed_separator, in_type;
|
int rv, oneed_separator, in_type;
|
||||||
char *sbuf, *rbuf;
|
char *rbuf;
|
||||||
union VALUETYPE *p = &ms->ms_value;
|
union VALUETYPE *p = &ms->ms_value;
|
||||||
struct mlist ml;
|
struct mlist ml;
|
||||||
|
|
||||||
if (recursion_level >= 20) {
|
if (recursion_level >= MAX_RECURSION_LEVEL) {
|
||||||
file_error(ms, 0, "recursion nesting exceeded");
|
file_error(ms, 0, "recursion nesting exceeded");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -1644,19 +1648,23 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m,
|
|||||||
case FILE_INDIRECT:
|
case FILE_INDIRECT:
|
||||||
if (offset == 0)
|
if (offset == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (nbytes < offset)
|
if (nbytes < offset)
|
||||||
return 0;
|
return 0;
|
||||||
sbuf = ms->o.buf;
|
|
||||||
soffset = ms->offset;
|
if ((pb = file_push_buffer(ms)) == NULL)
|
||||||
ms->o.buf = NULL;
|
return -1;
|
||||||
ms->offset = 0;
|
|
||||||
rv = file_softmagic(ms, s + offset, nbytes - offset,
|
rv = file_softmagic(ms, s + offset, nbytes - offset,
|
||||||
recursion_level, BINTEST, text);
|
recursion_level, BINTEST, text);
|
||||||
|
|
||||||
if ((ms->flags & MAGIC_DEBUG) != 0)
|
if ((ms->flags & MAGIC_DEBUG) != 0)
|
||||||
fprintf(stderr, "indirect @offs=%u[%d]\n", offset, rv);
|
fprintf(stderr, "indirect @offs=%u[%d]\n", offset, rv);
|
||||||
rbuf = ms->o.buf;
|
|
||||||
ms->o.buf = sbuf;
|
rbuf = file_pop_buffer(ms, pb);
|
||||||
ms->offset = soffset;
|
if (rbuf == NULL && ms->event_flags & EVENT_HAD_ERR)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (rv == 1) {
|
if (rv == 1) {
|
||||||
if ((ms->flags & (MAGIC_MIME|MAGIC_APPLE)) == 0 &&
|
if ((ms->flags & (MAGIC_MIME|MAGIC_APPLE)) == 0 &&
|
||||||
file_printf(ms, F(ms, m, "%u"), offset) == -1) {
|
file_printf(ms, F(ms, m, "%u"), offset) == -1) {
|
||||||
@ -1674,13 +1682,13 @@ mget(struct magic_set *ms, const unsigned char *s, struct magic *m,
|
|||||||
case FILE_USE:
|
case FILE_USE:
|
||||||
if (nbytes < offset)
|
if (nbytes < offset)
|
||||||
return 0;
|
return 0;
|
||||||
sbuf = m->value.s;
|
rbuf = m->value.s;
|
||||||
if (*sbuf == '^') {
|
if (*rbuf == '^') {
|
||||||
sbuf++;
|
rbuf++;
|
||||||
flip = !flip;
|
flip = !flip;
|
||||||
}
|
}
|
||||||
if (file_magicfind(ms, sbuf, &ml) == -1) {
|
if (file_magicfind(ms, rbuf, &ml) == -1) {
|
||||||
file_error(ms, 0, "cannot find entry `%s'", sbuf);
|
file_error(ms, 0, "cannot find entry `%s'", rbuf);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,3 +3,6 @@
|
|||||||
# Automounter master map, see auto_master(5) for details.
|
# Automounter master map, see auto_master(5) for details.
|
||||||
#
|
#
|
||||||
/net -hosts -nobrowse,nosuid
|
/net -hosts -nobrowse,nosuid
|
||||||
|
# When using the -media special map, make sure to edit devd.conf(5)
|
||||||
|
# to move the call to "automount -c" out of the comments section.
|
||||||
|
#/media -media -nosuid
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# $FreeBSD$
|
# $FreeBSD$
|
||||||
|
|
||||||
FILES= include_ldap special_hosts special_null
|
FILES= include_ldap special_hosts special_media special_null
|
||||||
|
|
||||||
NO_OBJ=
|
NO_OBJ=
|
||||||
FILESDIR= /etc/autofs
|
FILESDIR= /etc/autofs
|
||||||
|
93
etc/autofs/special_media
Executable file
93
etc/autofs/special_media
Executable file
@ -0,0 +1,93 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
#
|
||||||
|
# $FreeBSD$
|
||||||
|
#
|
||||||
|
|
||||||
|
# Print newline-separated list of devices available for mounting.
|
||||||
|
# If there is a filesystem label - use it, otherwise use device name.
|
||||||
|
print_available() {
|
||||||
|
local _fstype _fstype_and_label _label _p
|
||||||
|
|
||||||
|
for _p in ${providers}; do
|
||||||
|
_fstype_and_label="$(fstyp -l "/dev/${_p}" 2> /dev/null)"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
# Ignore devices for which we were unable
|
||||||
|
# to determine filesystem type.
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
_fstype="${_fstype_and_label%% *}"
|
||||||
|
if [ "${_fstype}" != "${_fstype_and_label}" ]; then
|
||||||
|
_label="${_fstype_and_label#* }"
|
||||||
|
echo "${_label}"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "${_p}"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print a single map entry.
|
||||||
|
print_one() {
|
||||||
|
local _fstype _fstype_and_label _label _key _p
|
||||||
|
|
||||||
|
_key="$1"
|
||||||
|
|
||||||
|
_fstype="$(fstyp "/dev/${_key}" 2> /dev/null)"
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "-fstype=${_fstype},nosuid :/dev/${_key}"
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
for _p in ${providers}; do
|
||||||
|
_fstype_and_label="$(fstyp -l "/dev/${_p}" 2> /dev/null)"
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
# Ignore devices for which we were unable
|
||||||
|
# to determine filesystem type.
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
_fstype="${_fstype_and_label%% *}"
|
||||||
|
if [ "${_fstype}" = "${_fstype_and_label}" ]; then
|
||||||
|
# No label, try another device.
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
_label="${_fstype_and_label#* }"
|
||||||
|
if [ "${_label}" != "${_key}" ]; then
|
||||||
|
# Labels don't match, try another device.
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "-fstype=${_fstype},nosuid :/dev/${_p}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# No matching device - don't print anything, autofs will handle it.
|
||||||
|
}
|
||||||
|
|
||||||
|
# Obtain a list of (geom-provider-name, access-count) pairs, turning this:
|
||||||
|
#
|
||||||
|
# z0xfffff80005085d00 [shape=hexagon,label="ada0\nr2w2e3\nerr#0\nsector=512\nstripe=0"];
|
||||||
|
#
|
||||||
|
# Into this:
|
||||||
|
#
|
||||||
|
# ada0 r2w2e3
|
||||||
|
#
|
||||||
|
# XXX: It would be easier to use kern.geom.conftxt instead, but it lacks
|
||||||
|
# access counts.
|
||||||
|
pairs=$(sysctl kern.geom.confdot | sed -n 's/^.*hexagon,label="\([^\]*\)\\n\([^\]*\).*/\1 \2/p')
|
||||||
|
|
||||||
|
# Obtain a list of GEOM providers that are not already open - not mounted,
|
||||||
|
# and without other GEOM class, such as gpart, attached. In other words,
|
||||||
|
# grep for "r0w0e0". Skip providers with names containing slashes; we're
|
||||||
|
# not interested in geom_label(4) creations.
|
||||||
|
providers=$(echo "$pairs" | awk '$2 == "r0w0e0" && $1 !~ /\// { print $1 }')
|
||||||
|
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
print_available
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
print_one "$1"
|
||||||
|
exit 0
|
||||||
|
|
@ -318,4 +318,16 @@ notify 0 {
|
|||||||
action "/usr/local/etc/rc.d/postgresql restart";
|
action "/usr/local/etc/rc.d/postgresql restart";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# Discard autofs caches, useful for the -media special map. The one
|
||||||
|
# second delay is for GEOM to finish tasting.
|
||||||
|
#
|
||||||
|
# XXX: We should probably have a devctl(4) event that fires after GEOM
|
||||||
|
# tasting.
|
||||||
|
#
|
||||||
|
notify 100 {
|
||||||
|
match "system" "DEVFS";
|
||||||
|
match "cdev" "(da|mmcsd)[0-9]+";
|
||||||
|
action "sleep 1 && /usr/sbin/automount -c";
|
||||||
|
};
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
@ -886,7 +886,7 @@ sctp_recvv(int sd,
|
|||||||
struct sctp_rcvinfo *rcvinfo;
|
struct sctp_rcvinfo *rcvinfo;
|
||||||
struct sctp_nxtinfo *nxtinfo;
|
struct sctp_nxtinfo *nxtinfo;
|
||||||
|
|
||||||
if (((info != NULL) && (infolen == NULL)) |
|
if (((info != NULL) && (infolen == NULL)) ||
|
||||||
((info == NULL) && (infolen != NULL) && (*infolen != 0)) ||
|
((info == NULL) && (infolen != NULL) && (*infolen != 0)) ||
|
||||||
((info != NULL) && (infotype == NULL))) {
|
((info != NULL) && (infotype == NULL))) {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
|
@ -124,11 +124,13 @@ __sflush(FILE *fp)
|
|||||||
t = _swrite(fp, (char *)p, n);
|
t = _swrite(fp, (char *)p, n);
|
||||||
if (t <= 0) {
|
if (t <= 0) {
|
||||||
/* Reset _p and _w. */
|
/* Reset _p and _w. */
|
||||||
if (p > fp->_p) /* Some was written. */
|
if (p > fp->_p) {
|
||||||
|
/* Some was written. */
|
||||||
memmove(fp->_p, p, n);
|
memmove(fp->_p, p, n);
|
||||||
fp->_p += n;
|
fp->_p += n;
|
||||||
if ((fp->_flags & (__SLBF | __SNBF)) == 0)
|
if ((fp->_flags & (__SLBF | __SNBF)) == 0)
|
||||||
fp->_w -= n;
|
fp->_w -= n;
|
||||||
|
}
|
||||||
fp->_flags |= __SERR;
|
fp->_flags |= __SERR;
|
||||||
return (EOF);
|
return (EOF);
|
||||||
}
|
}
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
.\" @(#)mount.8 8.8 (Berkeley) 6/16/94
|
.\" @(#)mount.8 8.8 (Berkeley) 6/16/94
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd November 22, 2014
|
.Dd December 3, 2014
|
||||||
.Dt MOUNT 8
|
.Dt MOUNT 8
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -549,6 +549,7 @@ support for a particular file system might be provided either on a static
|
|||||||
.Xr fstab 5 ,
|
.Xr fstab 5 ,
|
||||||
.Xr procfs 5 ,
|
.Xr procfs 5 ,
|
||||||
.Xr automount 8 ,
|
.Xr automount 8 ,
|
||||||
|
.Xr fstyp 8 ,
|
||||||
.Xr kldload 8 ,
|
.Xr kldload 8 ,
|
||||||
.Xr mount_cd9660 8 ,
|
.Xr mount_cd9660 8 ,
|
||||||
.Xr mount_msdosfs 8 ,
|
.Xr mount_msdosfs 8 ,
|
||||||
|
@ -9,10 +9,7 @@ MAN= termcap.5
|
|||||||
|
|
||||||
FILES= termcap termcap.db
|
FILES= termcap termcap.db
|
||||||
FILESDIR= ${BINDIR}/misc
|
FILESDIR= ${BINDIR}/misc
|
||||||
CLEANFILES+= termcap termcap.db
|
CLEANFILES+= termcap.db
|
||||||
|
|
||||||
termcap: reorder termcap.src
|
|
||||||
TERM=dumb TERMCAP=dumb: ex - ${.CURDIR}/termcap.src < ${.CURDIR}/reorder
|
|
||||||
|
|
||||||
.include <bsd.endian.mk>
|
.include <bsd.endian.mk>
|
||||||
.if ${TARGET_ENDIANNESS} == "1234"
|
.if ${TARGET_ENDIANNESS} == "1234"
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
# @(#)README 8.1 (Berkeley) 6/8/93
|
# @(#)README 8.1 (Berkeley) 6/8/93
|
||||||
|
#
|
||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
<< 12 May 1983 >>
|
<< 12 May 1983 >>
|
||||||
To install this directory on your system:
|
To install this directory on your system:
|
||||||
@ -19,7 +21,7 @@ common and really should go near the front.
|
|||||||
Third, if you are not a super user and cannot create the directory
|
Third, if you are not a super user and cannot create the directory
|
||||||
/usr/lib/tabset, make a corresponding directory somewhere you can and add
|
/usr/lib/tabset, make a corresponding directory somewhere you can and add
|
||||||
a line to reorder to globally change all /usr/lib/tabset's to your own
|
a line to reorder to globally change all /usr/lib/tabset's to your own
|
||||||
path name. This change is better than just changing the termcap.src file
|
path name. This change is better than just changing the termcap file
|
||||||
because it makes it easier to diff it from newer distributed versions.
|
because it makes it easier to diff it from newer distributed versions.
|
||||||
Try to keep the source as is whenever possible, and put mungings into
|
Try to keep the source as is whenever possible, and put mungings into
|
||||||
reorder.
|
reorder.
|
||||||
|
@ -1,62 +0,0 @@
|
|||||||
" $FreeBSD$
|
|
||||||
/# << EOH -/k a
|
|
||||||
/^adm12|/;.,/^[^ ]/-m'a
|
|
||||||
/^pcplot/;.,/^[^ ]/-m'a
|
|
||||||
/^c100|/;.,/^[^ ]/-m'a
|
|
||||||
/^c100-rv|/;.,/^[^ ]/-m'a
|
|
||||||
/^c100-rv-pp|/;.,/^[^ ]/-m'a
|
|
||||||
/^c108-4p|/;.,/^[^ ]/-m'a
|
|
||||||
/^c108-rv-4p|/;.,/^[^ ]/-m'a
|
|
||||||
/^c108|/;.,/^[^ ]/-m'a
|
|
||||||
/^c108-rv-8p|/;.,/^[^ ]/-m'a
|
|
||||||
/^avt|/;.,/^[^ ]/-m'a
|
|
||||||
/^avt-rv|/;.,/^[^ ]/-m'a
|
|
||||||
/^avt-4p-s|/;.,/^[^ ]/-m'a
|
|
||||||
/^avt-8p-s|/;.,/^[^ ]/-m'a
|
|
||||||
/^ansi.sys|/;.,/^[^ ]/-m'a
|
|
||||||
/^ansi.sysk|/;.,/^[^ ]/-m'a
|
|
||||||
/^nansi.sys|/;.,/^[^ ]/-m'a
|
|
||||||
/^nansi.sysk|/;.,/^[^ ]/-m'a
|
|
||||||
/^h19k|/;.,/^[^ ]/-m'a
|
|
||||||
/^msk22714|/;.,/^[^ ]/-m'a
|
|
||||||
/^msk227am|/;.,/^[^ ]/-m'a
|
|
||||||
/^msk227|/;.,/^[^ ]/-m'a
|
|
||||||
/^pckermit120|/;.,/^[^ ]/-m'a
|
|
||||||
/^pckermit|/;.,/^[^ ]/-m'a
|
|
||||||
/^kermitam|/;.,/^[^ ]/-m'a
|
|
||||||
/^kermit|/;.,/^[^ ]/-m'a
|
|
||||||
/^sun-17|/;.,/^[^ ]/-m'a
|
|
||||||
/^sun-24|/;.,/^[^ ]/-m'a
|
|
||||||
/^sun-34|/;.,/^[^ ]/-m'a
|
|
||||||
/^sun-48|/;.,/^[^ ]/-m'a
|
|
||||||
/^sun-e-s|/;.,/^[^ ]/-m'a
|
|
||||||
/^sun-s|/;.,/^[^ ]/-m'a
|
|
||||||
/^sun-e|/;.,/^[^ ]/-m'a
|
|
||||||
/^sun|/;.,/^[^ ]/-m'a
|
|
||||||
/^xterm|/;.,/^[^ ]/-m'a
|
|
||||||
/^adm3|/;.,/^[^ ]/-m'a
|
|
||||||
/^adm31|/;.,/^[^ ]/-m'a
|
|
||||||
/^adm3a|/;.,/^[^ ]/-m'a
|
|
||||||
/^tvi924vb|/;.,/^[^ ]/-m'a
|
|
||||||
/^tvi924|/;.,/^[^ ]/-m'a
|
|
||||||
/^tvi912|/;.,/^[^ ]/-m'a
|
|
||||||
/^920b|/;.,/^[^ ]/-m'a
|
|
||||||
/^tvi925vb|/;.,/^[^ ]/-m'a
|
|
||||||
/^tvi925|/;.,/^[^ ]/-m'a
|
|
||||||
/^vt100|/;.,/^[^ ]/-m'a
|
|
||||||
/^vt200|/;.,/^[^ ]/-m'a
|
|
||||||
/^hp|/;.,/^[^ ]/-m'a
|
|
||||||
/^hp2645|/;.,/^[^ ]/-m'a
|
|
||||||
/^2621-nl|/;.,/^[^ ]/-m'a
|
|
||||||
/^2621|/;.,/^[^ ]/-m'a
|
|
||||||
/^h29|/;.,/^[^ ]/-m'a
|
|
||||||
/^h19|/;.,/^[^ ]/-m'a
|
|
||||||
/^h19-u|/;.,/^[^ ]/-m'a
|
|
||||||
/^h19-us|/;.,/^[^ ]/-m'a
|
|
||||||
/^h19-e|/;.,/^[^ ]/-m'a
|
|
||||||
/^h19-g|/;.,/^[^ ]/-m'a
|
|
||||||
/^dmd|/;.,/^[^ ]/-m'a
|
|
||||||
/^s/;.,/^#/-m'a
|
|
||||||
'ad
|
|
||||||
w! termcap
|
|
||||||
q
|
|
@ -2651,6 +2651,7 @@ dev/xen/blkback/blkback.c optional xen | xenhvm
|
|||||||
dev/xen/console/console.c optional xen | xenhvm
|
dev/xen/console/console.c optional xen | xenhvm
|
||||||
dev/xen/console/xencons_ring.c optional xen | xenhvm
|
dev/xen/console/xencons_ring.c optional xen | xenhvm
|
||||||
dev/xen/control/control.c optional xen | xenhvm
|
dev/xen/control/control.c optional xen | xenhvm
|
||||||
|
dev/xen/grant_table/grant_table.c optional xen | xenhvm
|
||||||
dev/xen/netback/netback.c optional xen | xenhvm
|
dev/xen/netback/netback.c optional xen | xenhvm
|
||||||
dev/xen/netfront/netfront.c optional xen | xenhvm
|
dev/xen/netfront/netfront.c optional xen | xenhvm
|
||||||
dev/xen/xenpci/xenpci.c optional xenpci
|
dev/xen/xenpci/xenpci.c optional xenpci
|
||||||
@ -4000,7 +4001,6 @@ vm/vm_reserv.c standard
|
|||||||
vm/vm_unix.c standard
|
vm/vm_unix.c standard
|
||||||
vm/vm_zeroidle.c standard
|
vm/vm_zeroidle.c standard
|
||||||
vm/vnode_pager.c standard
|
vm/vnode_pager.c standard
|
||||||
xen/gnttab.c optional xen | xenhvm
|
|
||||||
xen/features.c optional xen | xenhvm
|
xen/features.c optional xen | xenhvm
|
||||||
xen/xenbus/xenbus_if.m optional xen | xenhvm
|
xen/xenbus/xenbus_if.m optional xen | xenhvm
|
||||||
xen/xenbus/xenbus.c optional xen | xenhvm
|
xen/xenbus/xenbus.c optional xen | xenhvm
|
||||||
|
@ -68,7 +68,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#define MII_KSZPHY_RX_DATA_PAD_SKEW 0x105
|
#define MII_KSZPHY_RX_DATA_PAD_SKEW 0x105
|
||||||
#define MII_KSZPHY_TX_DATA_PAD_SKEW 0x106
|
#define MII_KSZPHY_TX_DATA_PAD_SKEW 0x106
|
||||||
|
|
||||||
#define PS_TO_REG(p) (p / 200)
|
#define PS_TO_REG(p) ((p) / 200)
|
||||||
|
|
||||||
static int micphy_probe(device_t);
|
static int micphy_probe(device_t);
|
||||||
static int micphy_attach(device_t);
|
static int micphy_attach(device_t);
|
||||||
@ -104,7 +104,8 @@ static const struct mii_phy_funcs micphy_funcs = {
|
|||||||
mii_phy_reset
|
mii_phy_reset
|
||||||
};
|
};
|
||||||
|
|
||||||
static void micphy_write(struct mii_softc *sc, uint32_t reg, uint32_t val)
|
static void
|
||||||
|
micphy_write(struct mii_softc *sc, uint32_t reg, uint32_t val)
|
||||||
{
|
{
|
||||||
|
|
||||||
PHY_WRITE(sc, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | reg);
|
PHY_WRITE(sc, MII_KSZPHY_EXTREG, KSZPHY_EXTREG_WRITE | reg);
|
||||||
|
@ -659,16 +659,59 @@ gnttab_expand(unsigned int req_entries)
|
|||||||
return (error);
|
return (error);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
MTX_SYSINIT(gnttab, &gnttab_list_lock, "GNTTAB LOCK", MTX_DEF);
|
||||||
gnttab_init(device_t dev)
|
|
||||||
|
/*------------------ Private Device Attachment Functions --------------------*/
|
||||||
|
/**
|
||||||
|
* \brief Identify instances of this device type in the system.
|
||||||
|
*
|
||||||
|
* \param driver The driver performing this identify action.
|
||||||
|
* \param parent The NewBus parent device for any devices this method adds.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
granttable_identify(driver_t *driver __unused, device_t parent)
|
||||||
|
{
|
||||||
|
|
||||||
|
KASSERT(xen_domain(),
|
||||||
|
("Trying to attach grant-table device on non Xen domain"));
|
||||||
|
/*
|
||||||
|
* A single device instance for our driver is always present
|
||||||
|
* in a system operating under Xen.
|
||||||
|
*/
|
||||||
|
if (BUS_ADD_CHILD(parent, 0, driver->name, 0) == NULL)
|
||||||
|
panic("unable to attach Xen Grant-table device");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Probe for the existence of the Xen Grant-table device
|
||||||
|
*
|
||||||
|
* \param dev NewBus device_t for this instance.
|
||||||
|
*
|
||||||
|
* \return Always returns 0 indicating success.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
granttable_probe(device_t dev)
|
||||||
|
{
|
||||||
|
|
||||||
|
device_set_desc(dev, "Xen Grant-table Device");
|
||||||
|
return (BUS_PROBE_NOWILDCARD);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* \brief Attach the Xen Grant-table device.
|
||||||
|
*
|
||||||
|
* \param dev NewBus device_t for this instance.
|
||||||
|
*
|
||||||
|
* \return On success, 0. Otherwise an errno value indicating the
|
||||||
|
* type of failure.
|
||||||
|
*/
|
||||||
|
static int
|
||||||
|
granttable_attach(device_t dev)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
unsigned int max_nr_glist_frames;
|
unsigned int max_nr_glist_frames;
|
||||||
unsigned int nr_init_grefs;
|
unsigned int nr_init_grefs;
|
||||||
|
|
||||||
if (!is_running_on_xen())
|
|
||||||
return (ENODEV);
|
|
||||||
|
|
||||||
nr_grant_frames = 1;
|
nr_grant_frames = 1;
|
||||||
boot_max_nr_grant_frames = __max_nr_grant_frames();
|
boot_max_nr_grant_frames = __max_nr_grant_frames();
|
||||||
|
|
||||||
@ -714,7 +757,20 @@ gnttab_init(device_t dev)
|
|||||||
free(gnttab_list[i], M_DEVBUF);
|
free(gnttab_list[i], M_DEVBUF);
|
||||||
free(gnttab_list, M_DEVBUF);
|
free(gnttab_list, M_DEVBUF);
|
||||||
return (ENOMEM);
|
return (ENOMEM);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
MTX_SYSINIT(gnttab, &gnttab_list_lock, "GNTTAB LOCK", MTX_DEF);
|
/*-------------------- Private Device Attachment Data -----------------------*/
|
||||||
|
static device_method_t granttable_methods[] = {
|
||||||
|
/* Device interface */
|
||||||
|
DEVMETHOD(device_identify, granttable_identify),
|
||||||
|
DEVMETHOD(device_probe, granttable_probe),
|
||||||
|
DEVMETHOD(device_attach, granttable_attach),
|
||||||
|
|
||||||
|
DEVMETHOD_END
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE_CLASS_0(granttable, granttable_driver, granttable_methods, 0);
|
||||||
|
devclass_t granttable_devclass;
|
||||||
|
|
||||||
|
DRIVER_MODULE_ORDERED(granttable, xenpv, granttable_driver, granttable_devclass,
|
||||||
|
NULL, NULL, SI_ORDER_FIRST);
|
@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <sys/sysent.h>
|
#include <sys/sysent.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
#include <sys/kernel.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <sys/signalvar.h>
|
#include <sys/signalvar.h>
|
||||||
#include <sys/vmmeter.h>
|
#include <sys/vmmeter.h>
|
||||||
|
@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
|
|||||||
#include <sys/syscall.h>
|
#include <sys/syscall.h>
|
||||||
#include <sys/sysent.h>
|
#include <sys/sysent.h>
|
||||||
#include <sys/systm.h>
|
#include <sys/systm.h>
|
||||||
|
#include <sys/kernel.h>
|
||||||
#include <sys/uio.h>
|
#include <sys/uio.h>
|
||||||
#include <sys/signalvar.h>
|
#include <sys/signalvar.h>
|
||||||
#include <sys/vmmeter.h>
|
#include <sys/vmmeter.h>
|
||||||
|
@ -425,6 +425,17 @@ xen_intr_bind_isrc(struct xenisrc **isrcp, evtchn_port_t local_port,
|
|||||||
/* Assign the opaque handler (the event channel port) */
|
/* Assign the opaque handler (the event channel port) */
|
||||||
*port_handlep = &isrc->xi_port;
|
*port_handlep = &isrc->xi_port;
|
||||||
|
|
||||||
|
#ifdef SMP
|
||||||
|
if (type == EVTCHN_TYPE_PORT) {
|
||||||
|
/*
|
||||||
|
* By default all interrupts are assigned to vCPU#0
|
||||||
|
* unless specified otherwise, so shuffle them to balance
|
||||||
|
* the interrupt load.
|
||||||
|
*/
|
||||||
|
xen_intr_assign_cpu(&isrc->xi_intsrc, intr_next_cpu());
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
if (filter == NULL && handler == NULL) {
|
if (filter == NULL && handler == NULL) {
|
||||||
/*
|
/*
|
||||||
* No filter/handler provided, leave the event channel
|
* No filter/handler provided, leave the event channel
|
||||||
@ -851,7 +862,7 @@ xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
|
|||||||
struct evtchn_bind_vcpu bind_vcpu;
|
struct evtchn_bind_vcpu bind_vcpu;
|
||||||
struct xenisrc *isrc;
|
struct xenisrc *isrc;
|
||||||
u_int to_cpu, vcpu_id;
|
u_int to_cpu, vcpu_id;
|
||||||
int error;
|
int error, masked;
|
||||||
|
|
||||||
#ifdef XENHVM
|
#ifdef XENHVM
|
||||||
if (xen_vector_callback_enabled == 0)
|
if (xen_vector_callback_enabled == 0)
|
||||||
@ -869,6 +880,11 @@ xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
|
|||||||
return (EINVAL);
|
return (EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mask the event channel while binding it to prevent interrupt
|
||||||
|
* delivery with an inconsistent state in isrc->xi_cpu.
|
||||||
|
*/
|
||||||
|
masked = evtchn_test_and_set_mask(isrc->xi_port);
|
||||||
if ((isrc->xi_type == EVTCHN_TYPE_VIRQ) ||
|
if ((isrc->xi_type == EVTCHN_TYPE_VIRQ) ||
|
||||||
(isrc->xi_type == EVTCHN_TYPE_IPI)) {
|
(isrc->xi_type == EVTCHN_TYPE_IPI)) {
|
||||||
/*
|
/*
|
||||||
@ -879,29 +895,25 @@ xen_intr_assign_cpu(struct intsrc *base_isrc, u_int apic_id)
|
|||||||
evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port);
|
evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port);
|
||||||
isrc->xi_cpu = to_cpu;
|
isrc->xi_cpu = to_cpu;
|
||||||
evtchn_cpu_unmask_port(isrc->xi_cpu, isrc->xi_port);
|
evtchn_cpu_unmask_port(isrc->xi_cpu, isrc->xi_port);
|
||||||
mtx_unlock(&xen_intr_isrc_lock);
|
goto out;
|
||||||
return (0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bind_vcpu.port = isrc->xi_port;
|
bind_vcpu.port = isrc->xi_port;
|
||||||
bind_vcpu.vcpu = vcpu_id;
|
bind_vcpu.vcpu = vcpu_id;
|
||||||
|
|
||||||
/*
|
|
||||||
* Allow interrupts to be fielded on the new VCPU before
|
|
||||||
* we ask the hypervisor to deliver them there.
|
|
||||||
*/
|
|
||||||
evtchn_cpu_unmask_port(to_cpu, isrc->xi_port);
|
|
||||||
error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu);
|
error = HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &bind_vcpu);
|
||||||
if (isrc->xi_cpu != to_cpu) {
|
if (isrc->xi_cpu != to_cpu) {
|
||||||
if (error == 0) {
|
if (error == 0) {
|
||||||
/* Commit to new binding by removing the old one. */
|
/* Commit to new binding by removing the old one. */
|
||||||
evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port);
|
evtchn_cpu_mask_port(isrc->xi_cpu, isrc->xi_port);
|
||||||
isrc->xi_cpu = to_cpu;
|
isrc->xi_cpu = to_cpu;
|
||||||
} else {
|
evtchn_cpu_unmask_port(isrc->xi_cpu, isrc->xi_port);
|
||||||
/* Roll-back to previous binding. */
|
|
||||||
evtchn_cpu_mask_port(to_cpu, isrc->xi_port);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (masked == 0)
|
||||||
|
evtchn_unmask_port(isrc->xi_port);
|
||||||
mtx_unlock(&xen_intr_isrc_lock);
|
mtx_unlock(&xen_intr_isrc_lock);
|
||||||
return (0);
|
return (0);
|
||||||
#else
|
#else
|
||||||
|
@ -66,15 +66,6 @@ static int
|
|||||||
xenpv_attach(device_t dev)
|
xenpv_attach(device_t dev)
|
||||||
{
|
{
|
||||||
device_t child;
|
device_t child;
|
||||||
int error;
|
|
||||||
|
|
||||||
/* Initialize grant table before any Xen specific device is attached */
|
|
||||||
error = gnttab_init(dev);
|
|
||||||
if (error != 0) {
|
|
||||||
device_printf(dev, "error initializing grant table: %d\n",
|
|
||||||
error);
|
|
||||||
return (error);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Let our child drivers identify any child devices that they
|
* Let our child drivers identify any child devices that they
|
||||||
|
@ -51,8 +51,6 @@ struct gnttab_free_callback {
|
|||||||
uint16_t count;
|
uint16_t count;
|
||||||
};
|
};
|
||||||
|
|
||||||
int gnttab_init(device_t);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Allocate a grant table reference and return it in *result. Returns
|
* Allocate a grant table reference and return it in *result. Returns
|
||||||
* zero on success or errno on error.
|
* zero on success or errno on error.
|
||||||
|
@ -25,6 +25,7 @@ SUBDIR= adduser \
|
|||||||
extattr \
|
extattr \
|
||||||
extattrctl \
|
extattrctl \
|
||||||
fifolog \
|
fifolog \
|
||||||
|
fstyp \
|
||||||
fwcontrol \
|
fwcontrol \
|
||||||
gstat \
|
gstat \
|
||||||
i2c \
|
i2c \
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" $FreeBSD$
|
.\" $FreeBSD$
|
||||||
.\"
|
.\"
|
||||||
.Dd November 21, 2014
|
.Dd November 22, 2014
|
||||||
.Dt AUTO_MASTER 5
|
.Dt AUTO_MASTER 5
|
||||||
.Os
|
.Os
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
@ -213,14 +213,17 @@ Supported special maps are:
|
|||||||
.Pp
|
.Pp
|
||||||
.Bl -tag -width "-hosts" -compact
|
.Bl -tag -width "-hosts" -compact
|
||||||
.It Li -hosts
|
.It Li -hosts
|
||||||
This map queries the remote NFS server and maps exported volumes.
|
Query the remote NFS server and map exported shares.
|
||||||
It is traditionally mounted on
|
This map is traditionally mounted on
|
||||||
.Pa /net .
|
.Pa /net .
|
||||||
It enables access to files on a remote NFS server by accessing
|
Access to files on a remote NFS server is provided through the
|
||||||
.Pa /net/nfs-server-ip/share-name/
|
.Pa /net/nfs-server-ip/share-name/
|
||||||
directory, without the need for any further configuration.
|
directory without any additional configuration.
|
||||||
|
.It Li -media
|
||||||
|
Query devices that are not yet mounted, but contain valid filesystems.
|
||||||
|
Generally used to access files on removable media.
|
||||||
.It Li -null
|
.It Li -null
|
||||||
This map prevents the
|
Prevent
|
||||||
.Xr automountd 8
|
.Xr automountd 8
|
||||||
from mounting anything on the mountpoint.
|
from mounting anything on the mountpoint.
|
||||||
.El
|
.El
|
||||||
|
9
usr.sbin/fstyp/Makefile
Normal file
9
usr.sbin/fstyp/Makefile
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
# $FreeBSD$
|
||||||
|
|
||||||
|
PROG= fstyp
|
||||||
|
SRCS= fstyp.c ext2fs.c cd9660.c msdosfs.c ntfs.c ufs.c
|
||||||
|
MAN= fstyp.8
|
||||||
|
|
||||||
|
WARNS= 6
|
||||||
|
|
||||||
|
.include <bsd.prog.mk>
|
72
usr.sbin/fstyp/cd9660.c
Normal file
72
usr.sbin/fstyp/cd9660.c
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2004 Pawel Jakub Dawidek <pjd@FreeBSD.org>
|
||||||
|
* Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
* from the FreeBSD Foundation.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "fstyp.h"
|
||||||
|
|
||||||
|
#define G_LABEL_ISO9660_DIR "iso9660"
|
||||||
|
|
||||||
|
#define ISO9660_MAGIC "\x01" "CD001" "\x01\x00"
|
||||||
|
#define ISO9660_OFFSET 0x8000
|
||||||
|
#define VOLUME_LEN 32
|
||||||
|
|
||||||
|
int
|
||||||
|
fstyp_cd9660(FILE *fp, char *label, size_t size)
|
||||||
|
{
|
||||||
|
char *sector, *volume;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
sector = read_buf(fp, ISO9660_OFFSET, 512);
|
||||||
|
if (sector == NULL)
|
||||||
|
return (1);
|
||||||
|
if (bcmp(sector, ISO9660_MAGIC, sizeof(ISO9660_MAGIC) - 1) != 0) {
|
||||||
|
free(sector);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
volume = sector + 0x28;
|
||||||
|
bzero(label, size);
|
||||||
|
strlcpy(label, volume, MIN(size, VOLUME_LEN));
|
||||||
|
free(sector);
|
||||||
|
for (i = size - 1; i > 0; i--) {
|
||||||
|
if (label[i] == '\0')
|
||||||
|
continue;
|
||||||
|
else if (label[i] == ' ')
|
||||||
|
label[i] = '\0';
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return (0);
|
||||||
|
}
|
90
usr.sbin/fstyp/ext2fs.c
Normal file
90
usr.sbin/fstyp/ext2fs.c
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2005 Stanislav Sedov
|
||||||
|
* Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
* from the FreeBSD Foundation.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "fstyp.h"
|
||||||
|
|
||||||
|
#define EXT2FS_SB_OFFSET 1024
|
||||||
|
#define EXT2_SUPER_MAGIC 0xef53
|
||||||
|
#define EXT2_DYNAMIC_REV 1
|
||||||
|
|
||||||
|
typedef struct e2sb {
|
||||||
|
uint8_t fake1[56];
|
||||||
|
uint16_t s_magic;
|
||||||
|
uint8_t fake2[18];
|
||||||
|
uint32_t s_rev_level;
|
||||||
|
uint8_t fake3[40];
|
||||||
|
char s_volume_name[16];
|
||||||
|
} e2sb_t;
|
||||||
|
|
||||||
|
int
|
||||||
|
fstyp_ext2fs(FILE *fp, char *label, size_t size)
|
||||||
|
{
|
||||||
|
e2sb_t *fs;
|
||||||
|
char *s_volume_name;
|
||||||
|
|
||||||
|
fs = (e2sb_t *)read_buf(fp, EXT2FS_SB_OFFSET, 512);
|
||||||
|
if (fs == NULL)
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
/* Check for magic and versio n*/
|
||||||
|
if (fs->s_magic == EXT2_SUPER_MAGIC &&
|
||||||
|
fs->s_rev_level == EXT2_DYNAMIC_REV) {
|
||||||
|
//G_LABEL_DEBUG(1, "ext2fs file system detected on %s.",
|
||||||
|
// pp->name);
|
||||||
|
} else {
|
||||||
|
free(fs);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
s_volume_name = fs->s_volume_name;
|
||||||
|
/* Terminate label */
|
||||||
|
s_volume_name[sizeof(fs->s_volume_name) - 1] = '\0';
|
||||||
|
|
||||||
|
if (s_volume_name[0] == '/')
|
||||||
|
s_volume_name += 1;
|
||||||
|
|
||||||
|
/* Check for volume label */
|
||||||
|
if (s_volume_name[0] == '\0') {
|
||||||
|
free(fs);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
strlcpy(label, s_volume_name, size);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
97
usr.sbin/fstyp/fstyp.8
Normal file
97
usr.sbin/fstyp/fstyp.8
Normal file
@ -0,0 +1,97 @@
|
|||||||
|
.\" Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
.\" All rights reserved.
|
||||||
|
.\"
|
||||||
|
.\" This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
.\" from the FreeBSD Foundation.
|
||||||
|
.\"
|
||||||
|
.\" Redistribution and use in source and binary forms, with or without
|
||||||
|
.\" modification, are permitted provided that the following conditions
|
||||||
|
.\" are met:
|
||||||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer.
|
||||||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||||||
|
.\" documentation and/or other materials provided with the distribution.
|
||||||
|
.\"
|
||||||
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||||
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
.\" SUCH DAMAGE.
|
||||||
|
.\"
|
||||||
|
.\" $FreeBSD$
|
||||||
|
.\"
|
||||||
|
.Dd December 6, 2014
|
||||||
|
.Dt FSTYP 8
|
||||||
|
.Os
|
||||||
|
.Sh NAME
|
||||||
|
.Nm fstyp
|
||||||
|
.Nd determine filesystem type
|
||||||
|
.Sh SYNOPSIS
|
||||||
|
.Nm
|
||||||
|
.Op Fl l
|
||||||
|
.Op Fl s
|
||||||
|
.Ar special
|
||||||
|
.Sh DESCRIPTION
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
utility is used to determine the filesystem type on a given device.
|
||||||
|
It can recognize ISO-9660, Ext2, FAT, NTFS, and UFS filesystems.
|
||||||
|
The filesystem name is printed to the standard output
|
||||||
|
as, respectively,
|
||||||
|
.Li cd9660 ,
|
||||||
|
.Li ext2fs ,
|
||||||
|
.Li msdosfs ,
|
||||||
|
.Li ntfs ,
|
||||||
|
or
|
||||||
|
.Li ufs .
|
||||||
|
.Pp
|
||||||
|
Because
|
||||||
|
.Nm
|
||||||
|
is built specifically to detect filesystem types, it differs from
|
||||||
|
.Xr file 1
|
||||||
|
in several ways.
|
||||||
|
The output is machine-parsable, filesystem labels are supported,
|
||||||
|
and only filesystems are identified.
|
||||||
|
Security is improved with
|
||||||
|
.Xr capsicum 4 .
|
||||||
|
.Pp
|
||||||
|
These options are available:
|
||||||
|
.Bl -tag -width ".Fl l"
|
||||||
|
.It Fl l
|
||||||
|
In addition to filesystem type, print filesystem label if available.
|
||||||
|
.It Fl s
|
||||||
|
Ignore file type.
|
||||||
|
By default,
|
||||||
|
.Nm
|
||||||
|
only works on regular files and disk-like device nodes.
|
||||||
|
Trying to read other file types might have unexpected consequences or hang
|
||||||
|
indefinitely.
|
||||||
|
.El
|
||||||
|
.Sh EXIT STATUS
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
utility exits 0 on success, and >0 if an error occurs or the filesystem
|
||||||
|
type is not recognized.
|
||||||
|
.Sh SEE ALSO
|
||||||
|
.Xr file 1 ,
|
||||||
|
.Xr capsicum 4 ,
|
||||||
|
.Xr glabel 8 ,
|
||||||
|
.Xr mount 8
|
||||||
|
.Sh HISTORY
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
command appeared in
|
||||||
|
.Fx 11.0 .
|
||||||
|
.Sh AUTHORS
|
||||||
|
The
|
||||||
|
.Nm
|
||||||
|
utility was developed by
|
||||||
|
.An Edward Tomasz Napierala Aq Mt trasz@FreeBSD.org
|
||||||
|
under sponsorship from the FreeBSD Foundation.
|
210
usr.sbin/fstyp/fstyp.c
Normal file
210
usr.sbin/fstyp/fstyp.c
Normal file
@ -0,0 +1,210 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
* from the FreeBSD Foundation.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <sys/capsicum.h>
|
||||||
|
#include <sys/disk.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <err.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <vis.h>
|
||||||
|
|
||||||
|
#include "fstyp.h"
|
||||||
|
|
||||||
|
#define LABEL_LEN 256
|
||||||
|
|
||||||
|
typedef int (*fstyp_function)(FILE *, char *, size_t);
|
||||||
|
|
||||||
|
static struct {
|
||||||
|
const char *name;
|
||||||
|
fstyp_function function;
|
||||||
|
} fstypes[] = {
|
||||||
|
{ "cd9660", &fstyp_cd9660 },
|
||||||
|
{ "ext2fs", &fstyp_ext2fs },
|
||||||
|
{ "msdosfs", &fstyp_msdosfs },
|
||||||
|
{ "ntfs", &fstyp_ntfs },
|
||||||
|
{ "ufs", &fstyp_ufs },
|
||||||
|
{ NULL, NULL }
|
||||||
|
};
|
||||||
|
|
||||||
|
void *
|
||||||
|
read_buf(FILE *fp, off_t off, size_t len)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
size_t nread;
|
||||||
|
void *buf;
|
||||||
|
|
||||||
|
error = fseek(fp, off, SEEK_SET);
|
||||||
|
if (error != 0) {
|
||||||
|
warn("cannot seek to %jd", (uintmax_t)off);
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = malloc(len);
|
||||||
|
if (buf == 0) {
|
||||||
|
warn("cannot malloc %zd bytes of memory", len);
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
nread = fread(buf, len, 1, fp);
|
||||||
|
if (nread != 1) {
|
||||||
|
free(buf);
|
||||||
|
if (feof(fp) == 0)
|
||||||
|
warn("fread");
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
char *
|
||||||
|
checked_strdup(const char *s)
|
||||||
|
{
|
||||||
|
char *c;
|
||||||
|
|
||||||
|
c = strdup(s);
|
||||||
|
if (c == NULL)
|
||||||
|
err(1, "strdup");
|
||||||
|
return (c);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
usage(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
fprintf(stderr, "usage: fstyp [-l][-s] special\n");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
type_check(const char *path, FILE *fp)
|
||||||
|
{
|
||||||
|
int error, fd;
|
||||||
|
off_t mediasize;
|
||||||
|
struct stat sb;
|
||||||
|
|
||||||
|
fd = fileno(fp);
|
||||||
|
|
||||||
|
error = fstat(fd, &sb);
|
||||||
|
if (error != 0)
|
||||||
|
err(1, "%s: fstat", path);
|
||||||
|
|
||||||
|
if (S_ISREG(sb.st_mode))
|
||||||
|
return;
|
||||||
|
|
||||||
|
error = ioctl(fd, DIOCGMEDIASIZE, &mediasize);
|
||||||
|
if (error != 0)
|
||||||
|
errx(1, "%s: not a disk", path);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
int ch, error, i, nbytes;
|
||||||
|
bool ignore_type = false, show_label = false;
|
||||||
|
char label[LABEL_LEN + 1], strvised[LABEL_LEN * 4 + 1];
|
||||||
|
char *path;
|
||||||
|
FILE *fp;
|
||||||
|
fstyp_function fstyp_f;
|
||||||
|
|
||||||
|
while ((ch = getopt(argc, argv, "ls")) != -1) {
|
||||||
|
switch (ch) {
|
||||||
|
case 'l':
|
||||||
|
show_label = true;
|
||||||
|
break;
|
||||||
|
case 's':
|
||||||
|
ignore_type = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
usage();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
argc -= optind;
|
||||||
|
argv += optind;
|
||||||
|
if (argc != 1)
|
||||||
|
usage();
|
||||||
|
|
||||||
|
path = argv[0];
|
||||||
|
|
||||||
|
fp = fopen(path, "r");
|
||||||
|
if (fp == NULL)
|
||||||
|
err(1, "%s", path);
|
||||||
|
|
||||||
|
error = cap_enter();
|
||||||
|
if (error != 0 && errno != ENOSYS)
|
||||||
|
err(1, "cap_enter");
|
||||||
|
|
||||||
|
if (ignore_type == false)
|
||||||
|
type_check(path, fp);
|
||||||
|
|
||||||
|
memset(label, '\0', sizeof(label));
|
||||||
|
|
||||||
|
for (i = 0;; i++) {
|
||||||
|
fstyp_f = fstypes[i].function;
|
||||||
|
if (fstyp_f == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
|
error = fstyp_f(fp, label, sizeof(label));
|
||||||
|
if (error == 0)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fstypes[i].name == NULL) {
|
||||||
|
warnx("%s: filesystem not recognized", path);
|
||||||
|
return (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (show_label && label[0] != '\0') {
|
||||||
|
/*
|
||||||
|
* XXX: I'd prefer VIS_HTTPSTYLE, but it unconditionally
|
||||||
|
* encodes spaces.
|
||||||
|
*/
|
||||||
|
nbytes = strsnvis(strvised, sizeof(strvised), label,
|
||||||
|
VIS_GLOB | VIS_NL, "\"'$");
|
||||||
|
if (nbytes == -1)
|
||||||
|
err(1, "strsnvis");
|
||||||
|
|
||||||
|
printf("%s %s\n", fstypes[i].name, strvised);
|
||||||
|
} else {
|
||||||
|
printf("%s\n", fstypes[i].name);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
46
usr.sbin/fstyp/fstyp.h
Normal file
46
usr.sbin/fstyp/fstyp.h
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
* from the FreeBSD Foundation.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef FSTYP_H
|
||||||
|
#define FSTYP_H
|
||||||
|
|
||||||
|
#define MIN(a,b) (((a)<(b))?(a):(b))
|
||||||
|
|
||||||
|
void *read_buf(FILE *fp, off_t off, size_t len);
|
||||||
|
char *checked_strdup(const char *s);
|
||||||
|
|
||||||
|
int fstyp_cd9660(FILE *fp, char *label, size_t size);
|
||||||
|
int fstyp_ext2fs(FILE *fp, char *label, size_t size);
|
||||||
|
int fstyp_msdosfs(FILE *fp, char *label, size_t size);
|
||||||
|
int fstyp_ntfs(FILE *fp, char *label, size_t size);
|
||||||
|
int fstyp_ufs(FILE *fp, char *label, size_t size);
|
||||||
|
|
||||||
|
#endif /* !FSTYP_H */
|
183
usr.sbin/fstyp/msdosfs.c
Normal file
183
usr.sbin/fstyp/msdosfs.c
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2004 Pawel Jakub Dawidek <pjd@FreeBSD.org>
|
||||||
|
* Copyright (c) 2006 Tobias Reifenberger
|
||||||
|
* Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
* from the FreeBSD Foundation.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "fstyp.h"
|
||||||
|
#include "msdosfs.h"
|
||||||
|
|
||||||
|
#define LABEL_NO_NAME "NO NAME "
|
||||||
|
|
||||||
|
int
|
||||||
|
fstyp_msdosfs(FILE *fp, char *label, size_t size)
|
||||||
|
{
|
||||||
|
FAT_BSBPB *pfat_bsbpb;
|
||||||
|
FAT32_BSBPB *pfat32_bsbpb;
|
||||||
|
FAT_DES *pfat_entry;
|
||||||
|
uint8_t *sector0, *sector;
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
sector0 = NULL;
|
||||||
|
sector = NULL;
|
||||||
|
|
||||||
|
/* Load 1st sector with boot sector and boot parameter block. */
|
||||||
|
sector0 = (uint8_t *)read_buf(fp, 0, 512);
|
||||||
|
if (sector0 == NULL)
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
/* Check for the FAT boot sector signature. */
|
||||||
|
if (sector0[510] != 0x55 || sector0[511] != 0xaa) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Test if this is really a FAT volume and determine the FAT type.
|
||||||
|
*/
|
||||||
|
|
||||||
|
pfat_bsbpb = (FAT_BSBPB *)sector0;
|
||||||
|
pfat32_bsbpb = (FAT32_BSBPB *)sector0;
|
||||||
|
|
||||||
|
if (UINT16BYTES(pfat_bsbpb->BPB_FATSz16) != 0) {
|
||||||
|
/*
|
||||||
|
* If the BPB_FATSz16 field is not zero and the string "FAT" is
|
||||||
|
* at the right place, this should be a FAT12 or FAT16 volume.
|
||||||
|
*/
|
||||||
|
if (strncmp(pfat_bsbpb->BS_FilSysType, "FAT", 3) != 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* A volume with no name should have "NO NAME " as label. */
|
||||||
|
if (strncmp(pfat_bsbpb->BS_VolLab, LABEL_NO_NAME,
|
||||||
|
sizeof(pfat_bsbpb->BS_VolLab)) == 0) {
|
||||||
|
goto endofchecks;
|
||||||
|
}
|
||||||
|
strlcpy(label, pfat_bsbpb->BS_VolLab,
|
||||||
|
MIN(size, sizeof(pfat_bsbpb->BS_VolLab) + 1));
|
||||||
|
} else if (UINT32BYTES(pfat32_bsbpb->BPB_FATSz32) != 0) {
|
||||||
|
uint32_t fat_FirstDataSector, fat_BytesPerSector, offset;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the BPB_FATSz32 field is not zero and the string "FAT" is
|
||||||
|
* at the right place, this should be a FAT32 volume.
|
||||||
|
*/
|
||||||
|
if (strncmp(pfat32_bsbpb->BS_FilSysType, "FAT", 3) != 0) {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the volume label is not "NO NAME " we're done.
|
||||||
|
*/
|
||||||
|
if (strncmp(pfat32_bsbpb->BS_VolLab, LABEL_NO_NAME,
|
||||||
|
sizeof(pfat32_bsbpb->BS_VolLab)) != 0) {
|
||||||
|
strlcpy(label, pfat32_bsbpb->BS_VolLab,
|
||||||
|
MIN(size, sizeof(pfat32_bsbpb->BS_VolLab) + 1));
|
||||||
|
goto endofchecks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If the volume label "NO NAME " is in the boot sector, the
|
||||||
|
* label of FAT32 volumes may be stored as a special entry in
|
||||||
|
* the root directory.
|
||||||
|
*/
|
||||||
|
fat_FirstDataSector =
|
||||||
|
UINT16BYTES(pfat32_bsbpb->BPB_RsvdSecCnt) +
|
||||||
|
(pfat32_bsbpb->BPB_NumFATs *
|
||||||
|
UINT32BYTES(pfat32_bsbpb->BPB_FATSz32));
|
||||||
|
fat_BytesPerSector = UINT16BYTES(pfat32_bsbpb->BPB_BytsPerSec);
|
||||||
|
|
||||||
|
// fat_FirstDataSector, fat_BytesPerSector);
|
||||||
|
|
||||||
|
for (offset = fat_BytesPerSector * fat_FirstDataSector;;
|
||||||
|
offset += fat_BytesPerSector) {
|
||||||
|
sector = (uint8_t *)read_buf(fp, offset, fat_BytesPerSector);
|
||||||
|
if (sector == NULL)
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
pfat_entry = (FAT_DES *)sector;
|
||||||
|
do {
|
||||||
|
/* No more entries available. */
|
||||||
|
if (pfat_entry->DIR_Name[0] == 0) {
|
||||||
|
goto endofchecks;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip empty or long name entries. */
|
||||||
|
if (pfat_entry->DIR_Name[0] == 0xe5 ||
|
||||||
|
(pfat_entry->DIR_Attr &
|
||||||
|
FAT_DES_ATTR_LONG_NAME) ==
|
||||||
|
FAT_DES_ATTR_LONG_NAME) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The name of the entry is the volume label if
|
||||||
|
* ATTR_VOLUME_ID is set.
|
||||||
|
*/
|
||||||
|
if (pfat_entry->DIR_Attr &
|
||||||
|
FAT_DES_ATTR_VOLUME_ID) {
|
||||||
|
strlcpy(label, pfat_entry->DIR_Name,
|
||||||
|
MIN(size,
|
||||||
|
sizeof(pfat_entry->DIR_Name) + 1));
|
||||||
|
goto endofchecks;
|
||||||
|
}
|
||||||
|
} while((uint8_t *)(++pfat_entry) <
|
||||||
|
(uint8_t *)(sector + fat_BytesPerSector));
|
||||||
|
free(sector);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
endofchecks:
|
||||||
|
for (i = size - 1; i > 0; i--) {
|
||||||
|
if (label[i] == '\0')
|
||||||
|
continue;
|
||||||
|
else if (label[i] == ' ')
|
||||||
|
label[i] = '\0';
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(sector0);
|
||||||
|
free(sector);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
error:
|
||||||
|
free(sector0);
|
||||||
|
free(sector);
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
140
usr.sbin/fstyp/msdosfs.h
Normal file
140
usr.sbin/fstyp/msdosfs.h
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2006 Tobias Reifenberger
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Conversion macros for little endian encoded unsigned integers
|
||||||
|
* in byte streams to the local unsigned integer format.
|
||||||
|
*/
|
||||||
|
#define UINT16BYTES(p) ((uint32_t)((p)[0] + (256*(p)[1])))
|
||||||
|
#define UINT32BYTES(p) ((uint32_t)((p)[0] + (256*(p)[1]) + \
|
||||||
|
(65536*(p)[2]) + (16777216*(p)[3])))
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All following structures are according to:
|
||||||
|
*
|
||||||
|
* Microsoft Extensible Firmware Initiative FAT32 File System Specification
|
||||||
|
* FAT: General Overview of On-Disk Format
|
||||||
|
* Version 1.03, December 6, 2000
|
||||||
|
* Microsoft Corporation
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FAT boot sector and boot parameter block for
|
||||||
|
* FAT12 and FAT16 volumes
|
||||||
|
*/
|
||||||
|
typedef struct fat_bsbpb {
|
||||||
|
/* common fields */
|
||||||
|
uint8_t BS_jmpBoot[3];
|
||||||
|
uint8_t BS_OEMName[8];
|
||||||
|
uint8_t BPB_BytsPerSec[2];
|
||||||
|
uint8_t BPB_SecPerClus;
|
||||||
|
uint8_t BPB_RsvdSecCnt[2];
|
||||||
|
uint8_t BPB_NumFATs;
|
||||||
|
uint8_t BPB_RootEntCnt[2];
|
||||||
|
uint8_t BPB_TotSec16[2];
|
||||||
|
uint8_t BPB_Media;
|
||||||
|
uint8_t BPB_FATSz16[2];
|
||||||
|
uint8_t BPB_SecPerTrack[2];
|
||||||
|
uint8_t BPB_NumHeads[2];
|
||||||
|
uint8_t BPB_HiddSec[4];
|
||||||
|
uint8_t BPB_TotSec32[4];
|
||||||
|
/* FAT12/FAT16 only fields */
|
||||||
|
uint8_t BS_DrvNum;
|
||||||
|
uint8_t BS_Reserved1;
|
||||||
|
uint8_t BS_BootSig;
|
||||||
|
uint8_t BS_VolID[4];
|
||||||
|
uint8_t BS_VolLab[11];
|
||||||
|
uint8_t BS_FilSysType[8];
|
||||||
|
} FAT_BSBPB; /* 62 bytes */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FAT boot sector and boot parameter block for
|
||||||
|
* FAT32 volumes
|
||||||
|
*/
|
||||||
|
typedef struct fat32_bsbpb {
|
||||||
|
/* common fields */
|
||||||
|
uint8_t BS_jmpBoot[3];
|
||||||
|
uint8_t BS_OEMName[8];
|
||||||
|
uint8_t BPB_BytsPerSec[2];
|
||||||
|
uint8_t BPB_SecPerClus;
|
||||||
|
uint8_t BPB_RsvdSecCnt[2];
|
||||||
|
uint8_t BPB_NumFATs;
|
||||||
|
uint8_t BPB_RootEntCnt[2];
|
||||||
|
uint8_t BPB_TotSec16[2];
|
||||||
|
uint8_t BPB_Media;
|
||||||
|
uint8_t BPB_FATSz16[2];
|
||||||
|
uint8_t BPB_SecPerTrack[2];
|
||||||
|
uint8_t BPB_NumHeads[2];
|
||||||
|
uint8_t BPB_HiddSec[4];
|
||||||
|
uint8_t BPB_TotSec32[4];
|
||||||
|
/* FAT32 only fields */
|
||||||
|
uint8_t BPB_FATSz32[4];
|
||||||
|
uint8_t BPB_ExtFlags[2];
|
||||||
|
uint8_t BPB_FSVer[2];
|
||||||
|
uint8_t BPB_RootClus[4];
|
||||||
|
uint8_t BPB_FSInfo[2];
|
||||||
|
uint8_t BPB_BkBootSec[2];
|
||||||
|
uint8_t BPB_Reserved[12];
|
||||||
|
uint8_t BS_DrvNum;
|
||||||
|
uint8_t BS_Reserved1;
|
||||||
|
uint8_t BS_BootSig;
|
||||||
|
uint8_t BS_VolID[4];
|
||||||
|
uint8_t BS_VolLab[11];
|
||||||
|
uint8_t BS_FilSysType[8];
|
||||||
|
} FAT32_BSBPB; /* 90 bytes */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FAT directory entry structure
|
||||||
|
*/
|
||||||
|
#define FAT_DES_ATTR_READ_ONLY 0x01
|
||||||
|
#define FAT_DES_ATTR_HIDDEN 0x02
|
||||||
|
#define FAT_DES_ATTR_SYSTEM 0x04
|
||||||
|
#define FAT_DES_ATTR_VOLUME_ID 0x08
|
||||||
|
#define FAT_DES_ATTR_DIRECTORY 0x10
|
||||||
|
#define FAT_DES_ATTR_ARCHIVE 0x20
|
||||||
|
#define FAT_DES_ATTR_LONG_NAME (FAT_DES_ATTR_READ_ONLY | \
|
||||||
|
FAT_DES_ATTR_HIDDEN | \
|
||||||
|
FAT_DES_ATTR_SYSTEM | \
|
||||||
|
FAT_DES_ATTR_VOLUME_ID)
|
||||||
|
|
||||||
|
typedef struct fat_des {
|
||||||
|
uint8_t DIR_Name[11];
|
||||||
|
uint8_t DIR_Attr;
|
||||||
|
uint8_t DIR_NTRes;
|
||||||
|
uint8_t DIR_CrtTimeTenth;
|
||||||
|
uint8_t DIR_CrtTime[2];
|
||||||
|
uint8_t DIR_CrtDate[2];
|
||||||
|
uint8_t DIR_LstAccDate[2];
|
||||||
|
uint8_t DIR_FstClusHI[2];
|
||||||
|
uint8_t DIR_WrtTime[2];
|
||||||
|
uint8_t DIR_WrtDate[2];
|
||||||
|
uint8_t DIR_FstClusLO[2];
|
||||||
|
uint8_t DIR_FileSize[4];
|
||||||
|
} FAT_DES;
|
165
usr.sbin/fstyp/ntfs.c
Normal file
165
usr.sbin/fstyp/ntfs.c
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2005 Takanori Watanabe
|
||||||
|
* Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
* from the FreeBSD Foundation.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "fstyp.h"
|
||||||
|
|
||||||
|
#define NTFS_A_VOLUMENAME 0x60
|
||||||
|
#define NTFS_FILEMAGIC ((uint32_t)(0x454C4946))
|
||||||
|
#define NTFS_VOLUMEINO 3
|
||||||
|
|
||||||
|
#define G_LABEL_NTFS_DIR "ntfs"
|
||||||
|
|
||||||
|
struct ntfs_attr {
|
||||||
|
uint32_t a_type;
|
||||||
|
uint32_t reclen;
|
||||||
|
uint8_t a_flag;
|
||||||
|
uint8_t a_namelen;
|
||||||
|
uint8_t a_nameoff;
|
||||||
|
uint8_t reserved1;
|
||||||
|
uint8_t a_compression;
|
||||||
|
uint8_t reserved2;
|
||||||
|
uint16_t a_index;
|
||||||
|
uint16_t a_datalen;
|
||||||
|
uint16_t reserved3;
|
||||||
|
uint16_t a_dataoff;
|
||||||
|
uint16_t a_indexed;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct ntfs_filerec {
|
||||||
|
uint32_t fr_hdrmagic;
|
||||||
|
uint16_t fr_hdrfoff;
|
||||||
|
uint16_t fr_hdrfnum;
|
||||||
|
uint8_t reserved[8];
|
||||||
|
uint16_t fr_seqnum;
|
||||||
|
uint16_t fr_nlink;
|
||||||
|
uint16_t fr_attroff;
|
||||||
|
uint16_t fr_flags;
|
||||||
|
uint32_t fr_size;
|
||||||
|
uint32_t fr_allocated;
|
||||||
|
uint64_t fr_mainrec;
|
||||||
|
uint16_t fr_attrnum;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
struct ntfs_bootfile {
|
||||||
|
uint8_t reserved1[3];
|
||||||
|
uint8_t bf_sysid[8];
|
||||||
|
uint16_t bf_bps;
|
||||||
|
uint8_t bf_spc;
|
||||||
|
uint8_t reserved2[7];
|
||||||
|
uint8_t bf_media;
|
||||||
|
uint8_t reserved3[2];
|
||||||
|
uint16_t bf_spt;
|
||||||
|
uint16_t bf_heads;
|
||||||
|
uint8_t reserver4[12];
|
||||||
|
uint64_t bf_spv;
|
||||||
|
uint64_t bf_mftcn;
|
||||||
|
uint64_t bf_mftmirrcn;
|
||||||
|
int8_t bf_mftrecsz;
|
||||||
|
uint32_t bf_ibsz;
|
||||||
|
uint32_t bf_volsn;
|
||||||
|
} __packed;
|
||||||
|
|
||||||
|
int
|
||||||
|
fstyp_ntfs(FILE *fp, char *label, size_t size)
|
||||||
|
{
|
||||||
|
struct ntfs_bootfile *bf;
|
||||||
|
struct ntfs_filerec *fr;
|
||||||
|
struct ntfs_attr *atr;
|
||||||
|
off_t voloff;
|
||||||
|
char *filerecp, *ap;
|
||||||
|
int8_t mftrecsz;
|
||||||
|
char vnchar;
|
||||||
|
int recsize, j;
|
||||||
|
|
||||||
|
filerecp = NULL;
|
||||||
|
|
||||||
|
bf = (struct ntfs_bootfile *)read_buf(fp, 0, 512);
|
||||||
|
if (bf == NULL || strncmp(bf->bf_sysid, "NTFS ", 8) != 0)
|
||||||
|
return (1);
|
||||||
|
|
||||||
|
mftrecsz = bf->bf_mftrecsz;
|
||||||
|
recsize = (mftrecsz > 0) ? (mftrecsz * bf->bf_bps * bf->bf_spc) : (1 << -mftrecsz);
|
||||||
|
|
||||||
|
voloff = bf->bf_mftcn * bf->bf_spc * bf->bf_bps +
|
||||||
|
recsize * NTFS_VOLUMEINO;
|
||||||
|
|
||||||
|
filerecp = read_buf(fp, voloff, recsize);
|
||||||
|
if (filerecp == NULL)
|
||||||
|
goto fail;
|
||||||
|
fr = (struct ntfs_filerec *)filerecp;
|
||||||
|
|
||||||
|
if (fr->fr_hdrmagic != NTFS_FILEMAGIC)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
for (ap = filerecp + fr->fr_attroff;
|
||||||
|
atr = (struct ntfs_attr *)ap, (int)atr->a_type != -1;
|
||||||
|
ap += atr->reclen) {
|
||||||
|
if (atr->a_type == NTFS_A_VOLUMENAME) {
|
||||||
|
if(atr->a_datalen >= size *2){
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
*UNICODE to ASCII.
|
||||||
|
* Should we need to use iconv(9)?
|
||||||
|
*/
|
||||||
|
for (j = 0; j < atr->a_datalen; j++) {
|
||||||
|
vnchar = *(ap + atr->a_dataoff + j);
|
||||||
|
if (j & 1) {
|
||||||
|
if (vnchar) {
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
label[j / 2] = vnchar;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
label[j / 2] = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(bf);
|
||||||
|
free(filerecp);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
|
||||||
|
fail:
|
||||||
|
free(bf);
|
||||||
|
free(filerecp);
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
109
usr.sbin/fstyp/ufs.c
Normal file
109
usr.sbin/fstyp/ufs.c
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2002, 2003 Gordon Tetlow
|
||||||
|
* Copyright (c) 2006 Pawel Jakub Dawidek <pjd@FreeBSD.org>
|
||||||
|
* Copyright (c) 2014 The FreeBSD Foundation
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* This software was developed by Edward Tomasz Napierala under sponsorship
|
||||||
|
* from the FreeBSD Foundation.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHORS AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/cdefs.h>
|
||||||
|
__FBSDID("$FreeBSD$");
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <ufs/ufs/dinode.h>
|
||||||
|
#include <ufs/ffs/fs.h>
|
||||||
|
|
||||||
|
#include "fstyp.h"
|
||||||
|
|
||||||
|
static const int superblocks[] = SBLOCKSEARCH;
|
||||||
|
|
||||||
|
int
|
||||||
|
fstyp_ufs(FILE *fp, char *label, size_t labelsize)
|
||||||
|
{
|
||||||
|
int sb, superblock;
|
||||||
|
struct fs *fs;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Walk through the standard places that superblocks hide and look
|
||||||
|
* for UFS magic. If we find magic, then check that the size in the
|
||||||
|
* superblock corresponds to the size of the underlying provider.
|
||||||
|
* Finally, look for a volume label and create an appropriate
|
||||||
|
* provider based on that.
|
||||||
|
*/
|
||||||
|
for (sb = 0; (superblock = superblocks[sb]) != -1; sb++) {
|
||||||
|
fs = (struct fs *)read_buf(fp, superblock, SBLOCKSIZE);
|
||||||
|
if (fs == NULL)
|
||||||
|
continue;
|
||||||
|
/*
|
||||||
|
* Check for magic. We also need to check if file system size is equal
|
||||||
|
* to providers size, because sysinstall(8) used to bogusly put first
|
||||||
|
* partition at offset 0 instead of 16, and glabel/ufs would find file
|
||||||
|
* system on slice instead of partition.
|
||||||
|
*/
|
||||||
|
#ifdef notyet
|
||||||
|
if (fs->fs_magic == FS_UFS1_MAGIC && fs->fs_fsize > 0 &&
|
||||||
|
((pp->mediasize / fs->fs_fsize == fs->fs_old_size) ||
|
||||||
|
(pp->mediasize / fs->fs_fsize == fs->fs_providersize))) {
|
||||||
|
/* Valid UFS1. */
|
||||||
|
} else if (fs->fs_magic == FS_UFS2_MAGIC && fs->fs_fsize > 0 &&
|
||||||
|
((pp->mediasize / fs->fs_fsize == fs->fs_size) ||
|
||||||
|
(pp->mediasize / fs->fs_fsize == fs->fs_providersize))) {
|
||||||
|
/* Valid UFS2. */
|
||||||
|
} else {
|
||||||
|
g_free(fs);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (fs->fs_magic == FS_UFS1_MAGIC && fs->fs_fsize > 0) {
|
||||||
|
/* Valid UFS1. */
|
||||||
|
} else if (fs->fs_magic == FS_UFS2_MAGIC && fs->fs_fsize > 0) {
|
||||||
|
/* Valid UFS2. */
|
||||||
|
} else {
|
||||||
|
free(fs);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (fs->fs_sblockloc != superblock || fs->fs_ncg < 1 ||
|
||||||
|
fs->fs_bsize < MINBSIZE ||
|
||||||
|
(size_t)fs->fs_bsize < sizeof(struct fs)) {
|
||||||
|
free(fs);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
strlcpy(label, fs->fs_volname, labelsize);
|
||||||
|
|
||||||
|
free(fs);
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (1);
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user