NAME
fsctl — file system control
SYNOPSIS
#include <sys/unistd.h>
int fsctl(
int fildes,
int command,
void *outbuf,
size_t outlen
);
DESCRIPTION
fsctl()
provides access to file-system-specific information.
fildes
is an open file descriptor for a file in the file system of interest.
The possible values for
command
depend on the type of file system.
Currently, defined
commands
exist only for the CDFS file system (see
sys/cdfsdir.h).
outbuf
is a pointer to the data area in which data is
returned from the file system.
outlen
gives the length of the data area pointed to by
outbuf.
The CDFS
commands
are:
- CDFS_DIR_REC
Returns the directory record for the file or directory indicated by
fildes.
The record is returned in a structure of type
cddir,
defined in
<sys/cdfsdir.h>.
- CDFS_XAR
Returns the extended attribute record, if any,
for the file or directory indicated by
fildes.
Because the size of an extended attribute record varies, be sure
outbuf
points to a data area of sufficient size.
To find the necessary size, do the following:
- 1.
Use
statfs(2).
to get the logical block size of the CDFS volume.
- 2.
Use an
fsctl()
call with the
CDFS_DIR_REC
command to get the extended attribute record size (in blocks)
for the file or directory of interest.
The
mincdd_xar_len
field in the returned structure contains the size
of the extended attribute record in logical blocks.
(If this field is zero, the file or directory
has no extended attribute record.)
- 3.
Multiply
mincdd_xar_len
by the logical block size obtained in step 1 to get the total space needed.
- 4.
Once you get the extended attribute record, cast
outbuf
into a pointer to a structure of type
cdxar_iso
(defined in
<sys/cdfsdir.h>).
This enables you to access those fields
that are common to all extended attribute records.
(See
EXAMPLES
below for an example of this process.)
If the extended attribute record contains additional system use
or application use data, that data will have to be accessed manually.
- CDFS_AFID
Returns the abstract file identifier for the primary volume
whose root directory is specified by
fildes,
terminated with a NULL character. Note that the constant
CDMAXNAMLEN
defined in
<sys/cdfsdir.h>
gives the maximum length a file identifier can have.
Thus,
CDMAXNAMLEN
+ 1 can be used for
outlen
and the size of
outbuf.
- CDFS_BFID
Returns the bibliographic file identifier for the primary volume
whose root directory is specified by
fildes,
terminated with a NULL character.
CDMAXNAMLEN
+ 1 can be used for the value of
outlen
and the size of
outbuf.
- CDFS_CFID
Returns the copyright file identifier
for the primary volume whose root directory is specified by
fildes,
terminated with a NULL character.
CDMAXNAMLEN
+ 1 can be used for the value of
outlen
and the size of
outbuf.
- CDFS_VOL_ID
Returns the volume ID for the primary volume specified by
fildes,
terminated with a NULL character.
The maximum size of the volume ID is 32 bytes, so a length of 33 can be used for
outlen
and the size of
utbuf.
- CDFS_VOL_SET_ID
Returns the volume set ID for the primary volume specified by
fildes,
terminated with a NULL character.
The maximum size of the volume set ID is 128 bytes, so a length of 129 can be used for
outlen
and the size of
outbuf.
EXAMPLES
The following code fragment gets the extended attribute record
for a file on a CDFS volume.
The filename is passed in as the first argument to the routine.
Note that error checking is omitted for brevity.
#include <sys/types.h>
#include <sys/vfs.h>
#include <fcntl.h>
#include <sys/cdfsdir.h>
main(argc, argv)
int argc;
char *argv[];
{
int fildes, size = 0;
char *malloc(), *outbuf;
struct statfs buf;
struct cddir cdrec;
struct cdxar_iso *xar;
.
.
.
statfs(argv[1], &buf); /* get logical block size */
fildes = open(argv[1], O_RDONLY); /* open file arg */
/* get directory record for file arg */
fsctl(fildes, CDFS_DIR_REC, &cdrec, sizeof(cdrec));
size = buf.f_bsize * cdrec.cdd_min.mincdd_xar_len; /* compute size */
if(size) { /* if size != 0 then there is an xar */
outbuf = malloc(size); /* malloc sufficient memory */
fsctl(fildes, CDFS_XAR, outbuf, size); /* get xar */
xar = (struct cdxar_iso *)outbuf; /* cast outbuf to access fields */
.
.
.
}
.
.
.
}
RETURN VALUE
fsctl()
returns the number of bytes read if successful.
If an error occurs, -1 is returned and
errno
is set to indicate the error.
ERRORS
fsctl()
fails if any of the following conditions are encountered:
- [EBADF]
fildes
is not a valid open file descriptor.
- [EFAULT]
outbuf
points to an invalid address.
- [ENOENT]
The requested information does not exist.
- [EINVAL]
command
is not a valid command.
- [EINVAL]
fildes
does not refer to a CDFS file system.