Lionel Cons
2013-09-17 16:53:26 UTC
Forwarding a question from a coworker:
How can I access fpathconf() via getconf(1)?
Lionel
---------- Forwarded message ----------
From: Roland Mainz <roland.mainz at nrubsig.org>
Date: 31 August 2013 02:31
Subject: Re: [ast-developers] AT&T Software Technology ast alpha
software download update
To: "ast-developers at research.att.com" <ast-developers at research.att.com>
Cc: lionelcons1972 at gmail.com, ????? ????????????
<olga.kryzhanovska at gmail.com>, Glenn Fowler <gsf at research.att.com>
might satisfy Glenn's love for /dev/file and marry it with a sane
approach to access files in xattr directories.
I'm looking at this over the long US weekend and am having
an off-list discussion picking olga's brain -- this will be resolved
one way or another tuesday
my "love" isn't so much /dev/file but rather an ast C and script
abstraction the contains the effects of attribute directories
Grumpf... I wish it would be easy. The best advice I can offer (after
today's) mayhem: Please just accept that accessing NFSv4 extended
attributes only works through a file descriptor for now (the
"advantage" is that it makes an emulation on Windows easier because
every acces must go through a fd).
If someone wishes to have an absolute path IMO the best option is to
return /proc/$$/fd/$fd/ because it ensures at least access for the
current and other processes as long as the fd is valid.
[snip]
One more datapoint (since Olga asked and forwarded an email): NFSv4
XATTR directories support subdirectories but only if the underlying
filesystem supports it (Solaris "zfs" and "ufs" don't... I'm not sure
about swap filesystem "tmpfs").
Think about the NFSv4 XATTR directories like a "branch" of the normal
filesystem which has been "cut off". All normal operations apply
(except getting XATTR dirs within XATTR dirs, e.g. nesting is not
allowed), including hard- and softlinks, pipes, fifos and
subdirectories if the underlying filesystems support it (Sun tried to
make it "easier" for itself and treats the XATTR directories as plain
single-level data storage, e.g. doesn't support softlinks, pipe/fifos,
subdirs and softlinks but does support hardlinks for zfs and ufs;
other filesystems are not required to be so restrictive) but all
references are contained within this "cut off branch of the
filesystem", e.g. hardlinks can only reference files inside the XATTR
directory and not files outside it (the same restriction would apply
to relative softlinks).
BTW: Last XATTR hint for today: See |fpathconf(2)| ... the *XATTR* attributes:
-- snip --
System Calls fpathconf(2)
NAME
fpathconf, pathconf - get configurable pathname variables
SYNOPSIS
#include <unistd.h>
long fpathconf(int fildes, int name);
long pathconf(const char *path, int name);
DESCRIPTION
The fpathconf() and pathconf() functions determine the
current value of a configurable limit or option ( variable )
that is associated with a file or directory.
For pathconf(), the path argument points to the pathname of
a file or directory.
For fpathconf(), the fildes argument is an open file
descriptor.
The name argument represents the variable to be queried
relative to that file or directory. The variables in the
following table come from <limits.h> or <unistd.h> and the
symbolic constants, defined in <unistd.h>, are the
corresponding values used for name:
System Calls fpathconf(2)
SunOS 5.11 Last change: 1 Sep 2009 2
System Calls fpathconf(2)
_______________________________________________________________________
Variable Value of name Notes
_______________________________________________________________________
{ACL_ENABLED} _PC_ACL_ENABLED 10
_______________________________________________________________________
{FILESIZEBITS} _PC_FILESIZEBITS 3,4
_______________________________________________________________________
{LINK_MAX} _PC_LINK_MAX 1
_______________________________________________________________________
{MAX_CANON} _PC_MAX_CANON 2
_______________________________________________________________________
{MAX_INPUT} _PC_MAX_INPUT 2
_______________________________________________________________________
{MIN_HOLE_SIZE} _PC_MIN_HOLE_SIZE 11
_______________________________________________________________________
{NAME_MAX} _PC_NAME_MAX 3, 4
_______________________________________________________________________
{PATH_MAX} _PC_PATH_MAX 4,5
_______________________________________________________________________
{PIPE_BUF} _PC_PIPE_BUF 6
_______________________________________________________________________
{POSIX_ALLOC_SIZE_MIN} _PC_ALLOC_SIZE_MIN
_______________________________________________________________________
{POSIX_REC_INCR_XFER_SIZE} _PC_REC_INCR_XFER_SIZE
_______________________________________________________________________
{POSIX_REC_MAX_XFER_SIZE} _PC_REC_MAX_XFER_SIZE
_______________________________________________________________________
{POSIX_REC_MIN_XFER_SIZE} _PC_REC_MIN_XFER_SIZE
_______________________________________________________________________
{POSIX_REC_XFER_ALIGN} _PC_REC_XFER_ALIGN
_______________________________________________________________________
{SYMLINK_MAX} _PC_SYMLINK_MAX 4, 9
_______________________________________________________________________
{XATTR_ENABLED} _PC_XATTR_ENABLED 1
_______________________________________________________________________
{SATTR_ENABLED} _PC_SATTR_ENABLED
_______________________________________________________________________
{XATTR_EXISTS} _PC_XATTR_EXISTS 1
_______________________________________________________________________
{SATTR_EXISTS} _PC_SATTR_EXISTS
_______________________________________________________________________
{ACCESS_FILTERING} _PC_ACCESS_FILTERING 12
_______________________________________________________________________
_POSIX_CHOWN_RESTRICTED _PC_CHOWN_RESTRICTED 7
_______________________________________________________________________
_POSIX_NO_TRUNC _PC_NO_TRUNC 3, 4
_______________________________________________________________________
_POSIX_VDISABLE _PC_VDISABLE 2
_______________________________________________________________________
_POSIX_ASYNC_IO _PC_ASYNC_IO 8
_______________________________________________________________________
_POSIX_PRIO_IO _PC_PRIO_IO 8
SunOS 5.11 Last change: 1 Sep 2009 3
System Calls fpathconf(2)
_______________________________________________________________________
| _POSIX_SYNC_IO | _PC_SYNC_IO | 8 |
|____________________________|__________________________|______________|
| _POSIX_TIMESTAMP_RESOLUTION| _PC_TIMESTAMP_RESOLUTION| 1 |
|____________________________|__________________________|______________|
Notes:
1. If path or fildes refers to a directory, the value
returned applies to the directory itself.
2. If path or fildes does not refer to a terminal
file, it is unspecified whether an implementation
supports an association of the variable name with
the specified file.
3. If path or fildes refers to a directory, the value
returned applies to filenames within the directory.
4. If path or fildes does not refer to a directory, it
is unspecified whether an implementation supports
an association of the variable name with the speci-
fied file.
5. If path or fildes refers to a directory, the value
returned is the maximum length of a relative path-
name when the specified directory is the working
directory.
6. If path refers to a FIFO, or fildes refers to a
pipe or FIFO, the value returned applies to the
referenced object. If path or fildes refers to a
directory, the value returned applies to any FIFO
that exists or can be created within the directory.
If path or fildes refers to any other type of file,
it is unspecified whether an implementation sup-
ports an association of the variable name with the
specified file.
7. If path or fildes refers to a directory, the value
returned applies to any files, other than direc-
tories, that exist or can be created within the
directory.
8. If path or fildes refers to a directory, it is
unspecified whether an implementation supports an
association of the variable name with the specified
file.
9. If path or fildes refers to a directory, the value
SunOS 5.11 Last change: 1 Sep 2009 4
System Calls fpathconf(2)
returned is the maximum length of the string that a
symbolic link in that directory can contain.
10. If path or fildes refers to a file or directory in
a file system that supports ACLs, the value
returned is the bitwise inclusive OR of the follow-
ing flags associated with ACL types supported by
the file system; otherwise 0 is returned.
_ACL_ACE_ENABLED The file system supports ACE
ACLs.
_ACL_ACLENT_ENABLED The file system supports UFS
aclent ACLs.
11. If a filesystem supports the reporting of holes
(see lseek(2), pathconf() and fpathconf() return a
positive number that represents the minimum hole
size returned in bytes. The offsets of holes
returned will be aligned to this same value. A spe-
cial value of 1 is returned if the filesystem does
not specify the minimum hole size but still reports
holes.
12. If path or fildes refers to a directory and the
file system in which the directory resides supports
access filtering, a non-zero value is returned.
Otherwise, 0 is returned.
RETURN VALUES
If name is an invalid value, both pathconf() and fpathconf()
return -1 and errno is set to indicate the error.
If the variable corresponding to name has no limit for the
path or file descriptor, both pathconf() and fpathconf()
return -1 without changing errno. If pathconf() needs to use
path to determine the value of name and pathconf() does not
support the association of name with the file specified by
path, or if the process did not have appropriate privileges
to query the file specified by path, or path does not exist,
pathconf() returns -1 and errno is set to indicate the
error.
If fpathconf() needs to use fildes to determine the value of
name and fpathconf() does not support the association of
name with the file specified by fildes, or if fildes is an
invalid file descriptor, fpathconf() returns -1 and errno is
set to indicate the error.
SunOS 5.11 Last change: 1 Sep 2009 5
System Calls fpathconf(2)
Otherwise pathconf() or fpathconf() returns the current
variable value for the file or directory without changing
errno. The value returned will not be more restrictive than
the corresponding value available to the application when it
was compiled with <limits.h> or <unistd.h>.
ERRORS
The pathconf() function will fail if:
EINVAL The value of name is not valid.
ELOOP A loop exists in symbolic links encountered during
resolution of the path argument.
The fpathconf() function will fail if:
EINVAL The value of name is not valid.
The pathconf() function may fail if:
EACCES Search permission is denied for a component
of the path prefix.
EINVAL An association of the variable name with the
specified file is not supported.
ENAMETOOLONG The length of the path argument exceeds
{PATH_MAX} or a pathname component is longer
than {NAME_MAX}.
ENAMETOOLONG As a result of encountering a symbolic link
in resolution of the path argument, the
length of the substituted pathname string
exceeded {PATH_MAX}.
ENOENT A component of path does not name an exist-
ing file or path is an empty string.
ENOTDIR A component of the path prefix is not a
directory.
SunOS 5.11 Last change: 1 Sep 2009 6
System Calls fpathconf(2)
The fpathconf() function may fail if:
EBADF The fildes argument is not a valid file descrip-
tor.
EINVAL An association of the variable name with the
specified file is not supported.
USAGE
The {SYMLINK_MAX} variable applies only to the fpathconf()
function.
ATTRIBUTES
See attributes(5) for descriptions of the following attri-
butes:
____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|_____________________________|_____________________________|
| Interface Stability | Committed |
|_____________________________|_____________________________|
| MT-Level | Async-Signal-Safe |
|_____________________________|_____________________________|
| Standard | See standards(5). |
|_____________________________|_____________________________|
SEE ALSO
lseek(2), confstr(3C), limits.h(3HEAD), sysconf(3C), attri-
butes(5), standards(5)
-- snip --
----
Bye,
Roland
--
__ . . __
(o.\ \/ /.o) roland.mainz at nrubsig.org
\__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer
/O /==\ O\ TEL +49 641 3992797
(;O/ \/ \O;)
How can I access fpathconf() via getconf(1)?
Lionel
---------- Forwarded message ----------
From: Roland Mainz <roland.mainz at nrubsig.org>
Date: 31 August 2013 02:31
Subject: Re: [ast-developers] AT&T Software Technology ast alpha
software download update
To: "ast-developers at research.att.com" <ast-developers at research.att.com>
Cc: lionelcons1972 at gmail.com, ????? ????????????
<olga.kryzhanovska at gmail.com>, Glenn Fowler <gsf at research.att.com>
ksh -c 'mkdir -p foo2 ; redirect {d}<foo2/ ; redirect
foo2 ; ls ; cat myxattr' myxattr SUNWattr_ro SUNWattr_rw
bla
Do you have a patch for that? It sounds you found a middle way whichfoo2 ; ls ; cat myxattr' myxattr SUNWattr_ro SUNWattr_rw
bla
might satisfy Glenn's love for /dev/file and marry it with a sane
approach to access files in xattr directories.
an off-list discussion picking olga's brain -- this will be resolved
one way or another tuesday
my "love" isn't so much /dev/file but rather an ast C and script
abstraction the contains the effects of attribute directories
today's) mayhem: Please just accept that accessing NFSv4 extended
attributes only works through a file descriptor for now (the
"advantage" is that it makes an emulation on Windows easier because
every acces must go through a fd).
If someone wishes to have an absolute path IMO the best option is to
return /proc/$$/fd/$fd/ because it ensures at least access for the
current and other processes as long as the fd is valid.
One more datapoint (since Olga asked and forwarded an email): NFSv4
XATTR directories support subdirectories but only if the underlying
filesystem supports it (Solaris "zfs" and "ufs" don't... I'm not sure
about swap filesystem "tmpfs").
Think about the NFSv4 XATTR directories like a "branch" of the normal
filesystem which has been "cut off". All normal operations apply
(except getting XATTR dirs within XATTR dirs, e.g. nesting is not
allowed), including hard- and softlinks, pipes, fifos and
subdirectories if the underlying filesystems support it (Sun tried to
make it "easier" for itself and treats the XATTR directories as plain
single-level data storage, e.g. doesn't support softlinks, pipe/fifos,
subdirs and softlinks but does support hardlinks for zfs and ufs;
other filesystems are not required to be so restrictive) but all
references are contained within this "cut off branch of the
filesystem", e.g. hardlinks can only reference files inside the XATTR
directory and not files outside it (the same restriction would apply
to relative softlinks).
BTW: Last XATTR hint for today: See |fpathconf(2)| ... the *XATTR* attributes:
-- snip --
System Calls fpathconf(2)
NAME
fpathconf, pathconf - get configurable pathname variables
SYNOPSIS
#include <unistd.h>
long fpathconf(int fildes, int name);
long pathconf(const char *path, int name);
DESCRIPTION
The fpathconf() and pathconf() functions determine the
current value of a configurable limit or option ( variable )
that is associated with a file or directory.
For pathconf(), the path argument points to the pathname of
a file or directory.
For fpathconf(), the fildes argument is an open file
descriptor.
The name argument represents the variable to be queried
relative to that file or directory. The variables in the
following table come from <limits.h> or <unistd.h> and the
symbolic constants, defined in <unistd.h>, are the
corresponding values used for name:
System Calls fpathconf(2)
SunOS 5.11 Last change: 1 Sep 2009 2
System Calls fpathconf(2)
_______________________________________________________________________
Variable Value of name Notes
_______________________________________________________________________
{ACL_ENABLED} _PC_ACL_ENABLED 10
_______________________________________________________________________
{FILESIZEBITS} _PC_FILESIZEBITS 3,4
_______________________________________________________________________
{LINK_MAX} _PC_LINK_MAX 1
_______________________________________________________________________
{MAX_CANON} _PC_MAX_CANON 2
_______________________________________________________________________
{MAX_INPUT} _PC_MAX_INPUT 2
_______________________________________________________________________
{MIN_HOLE_SIZE} _PC_MIN_HOLE_SIZE 11
_______________________________________________________________________
{NAME_MAX} _PC_NAME_MAX 3, 4
_______________________________________________________________________
{PATH_MAX} _PC_PATH_MAX 4,5
_______________________________________________________________________
{PIPE_BUF} _PC_PIPE_BUF 6
_______________________________________________________________________
{POSIX_ALLOC_SIZE_MIN} _PC_ALLOC_SIZE_MIN
_______________________________________________________________________
{POSIX_REC_INCR_XFER_SIZE} _PC_REC_INCR_XFER_SIZE
_______________________________________________________________________
{POSIX_REC_MAX_XFER_SIZE} _PC_REC_MAX_XFER_SIZE
_______________________________________________________________________
{POSIX_REC_MIN_XFER_SIZE} _PC_REC_MIN_XFER_SIZE
_______________________________________________________________________
{POSIX_REC_XFER_ALIGN} _PC_REC_XFER_ALIGN
_______________________________________________________________________
{SYMLINK_MAX} _PC_SYMLINK_MAX 4, 9
_______________________________________________________________________
{XATTR_ENABLED} _PC_XATTR_ENABLED 1
_______________________________________________________________________
{SATTR_ENABLED} _PC_SATTR_ENABLED
_______________________________________________________________________
{XATTR_EXISTS} _PC_XATTR_EXISTS 1
_______________________________________________________________________
{SATTR_EXISTS} _PC_SATTR_EXISTS
_______________________________________________________________________
{ACCESS_FILTERING} _PC_ACCESS_FILTERING 12
_______________________________________________________________________
_POSIX_CHOWN_RESTRICTED _PC_CHOWN_RESTRICTED 7
_______________________________________________________________________
_POSIX_NO_TRUNC _PC_NO_TRUNC 3, 4
_______________________________________________________________________
_POSIX_VDISABLE _PC_VDISABLE 2
_______________________________________________________________________
_POSIX_ASYNC_IO _PC_ASYNC_IO 8
_______________________________________________________________________
_POSIX_PRIO_IO _PC_PRIO_IO 8
SunOS 5.11 Last change: 1 Sep 2009 3
System Calls fpathconf(2)
_______________________________________________________________________
| _POSIX_SYNC_IO | _PC_SYNC_IO | 8 |
|____________________________|__________________________|______________|
| _POSIX_TIMESTAMP_RESOLUTION| _PC_TIMESTAMP_RESOLUTION| 1 |
|____________________________|__________________________|______________|
Notes:
1. If path or fildes refers to a directory, the value
returned applies to the directory itself.
2. If path or fildes does not refer to a terminal
file, it is unspecified whether an implementation
supports an association of the variable name with
the specified file.
3. If path or fildes refers to a directory, the value
returned applies to filenames within the directory.
4. If path or fildes does not refer to a directory, it
is unspecified whether an implementation supports
an association of the variable name with the speci-
fied file.
5. If path or fildes refers to a directory, the value
returned is the maximum length of a relative path-
name when the specified directory is the working
directory.
6. If path refers to a FIFO, or fildes refers to a
pipe or FIFO, the value returned applies to the
referenced object. If path or fildes refers to a
directory, the value returned applies to any FIFO
that exists or can be created within the directory.
If path or fildes refers to any other type of file,
it is unspecified whether an implementation sup-
ports an association of the variable name with the
specified file.
7. If path or fildes refers to a directory, the value
returned applies to any files, other than direc-
tories, that exist or can be created within the
directory.
8. If path or fildes refers to a directory, it is
unspecified whether an implementation supports an
association of the variable name with the specified
file.
9. If path or fildes refers to a directory, the value
SunOS 5.11 Last change: 1 Sep 2009 4
System Calls fpathconf(2)
returned is the maximum length of the string that a
symbolic link in that directory can contain.
10. If path or fildes refers to a file or directory in
a file system that supports ACLs, the value
returned is the bitwise inclusive OR of the follow-
ing flags associated with ACL types supported by
the file system; otherwise 0 is returned.
_ACL_ACE_ENABLED The file system supports ACE
ACLs.
_ACL_ACLENT_ENABLED The file system supports UFS
aclent ACLs.
11. If a filesystem supports the reporting of holes
(see lseek(2), pathconf() and fpathconf() return a
positive number that represents the minimum hole
size returned in bytes. The offsets of holes
returned will be aligned to this same value. A spe-
cial value of 1 is returned if the filesystem does
not specify the minimum hole size but still reports
holes.
12. If path or fildes refers to a directory and the
file system in which the directory resides supports
access filtering, a non-zero value is returned.
Otherwise, 0 is returned.
RETURN VALUES
If name is an invalid value, both pathconf() and fpathconf()
return -1 and errno is set to indicate the error.
If the variable corresponding to name has no limit for the
path or file descriptor, both pathconf() and fpathconf()
return -1 without changing errno. If pathconf() needs to use
path to determine the value of name and pathconf() does not
support the association of name with the file specified by
path, or if the process did not have appropriate privileges
to query the file specified by path, or path does not exist,
pathconf() returns -1 and errno is set to indicate the
error.
If fpathconf() needs to use fildes to determine the value of
name and fpathconf() does not support the association of
name with the file specified by fildes, or if fildes is an
invalid file descriptor, fpathconf() returns -1 and errno is
set to indicate the error.
SunOS 5.11 Last change: 1 Sep 2009 5
System Calls fpathconf(2)
Otherwise pathconf() or fpathconf() returns the current
variable value for the file or directory without changing
errno. The value returned will not be more restrictive than
the corresponding value available to the application when it
was compiled with <limits.h> or <unistd.h>.
ERRORS
The pathconf() function will fail if:
EINVAL The value of name is not valid.
ELOOP A loop exists in symbolic links encountered during
resolution of the path argument.
The fpathconf() function will fail if:
EINVAL The value of name is not valid.
The pathconf() function may fail if:
EACCES Search permission is denied for a component
of the path prefix.
EINVAL An association of the variable name with the
specified file is not supported.
ENAMETOOLONG The length of the path argument exceeds
{PATH_MAX} or a pathname component is longer
than {NAME_MAX}.
ENAMETOOLONG As a result of encountering a symbolic link
in resolution of the path argument, the
length of the substituted pathname string
exceeded {PATH_MAX}.
ENOENT A component of path does not name an exist-
ing file or path is an empty string.
ENOTDIR A component of the path prefix is not a
directory.
SunOS 5.11 Last change: 1 Sep 2009 6
System Calls fpathconf(2)
The fpathconf() function may fail if:
EBADF The fildes argument is not a valid file descrip-
tor.
EINVAL An association of the variable name with the
specified file is not supported.
USAGE
The {SYMLINK_MAX} variable applies only to the fpathconf()
function.
ATTRIBUTES
See attributes(5) for descriptions of the following attri-
butes:
____________________________________________________________
| ATTRIBUTE TYPE | ATTRIBUTE VALUE |
|_____________________________|_____________________________|
| Interface Stability | Committed |
|_____________________________|_____________________________|
| MT-Level | Async-Signal-Safe |
|_____________________________|_____________________________|
| Standard | See standards(5). |
|_____________________________|_____________________________|
SEE ALSO
lseek(2), confstr(3C), limits.h(3HEAD), sysconf(3C), attri-
butes(5), standards(5)
-- snip --
----
Bye,
Roland
--
__ . . __
(o.\ \/ /.o) roland.mainz at nrubsig.org
\__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer
/O /==\ O\ TEL +49 641 3992797
(;O/ \/ \O;)
--
Lionel
Lionel