HPUX fsctl[2]

fsctl(2) fsctl(2)
NAME
fsctl - file system control
SYNOPSIS
#include <sys/fsctl.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.)
Hewlett-Packard Company - 1 - HP-UX Release 9.0: August 1992
fsctl(2) fsctl(2)
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.
Hewlett-Packard Company - 2 - HP-UX Release 9.0: August 1992
fsctl(2) fsctl(2)
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.
Hewlett-Packard Company - 3 - HP-UX Release 9.0: August 1992
fsctl(2) fsctl(2)
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] outlen is negative, or fildes does not refer to a
CDFS file system.
SEE ALSO
statfs(2), cdfs(4), cdfsdir(4), cdnode(4), cdrom(4).
Hewlett-Packard Company - 4 - HP-UX Release 9.0: August 1992