Jump to content United States-English
HP.com Home Products and Services Support and Drivers Solutions How to Buy
» Contact HP
More options
HP.com home
HP-UX Reference > F

fsctl(2)

HP-UX 11i Version 3: February 2007
» 

Technical documentation

» Feedback
Content starts here

 » Table of Contents

 » Index

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.

Printable version
Privacy statement Using this site means you accept its terms Feedback to webmaster
© 1983-2007 Hewlett-Packard Development Company, L.P.