.\"
.\" $Id: cap_get_proc.3,v 1.1.1.1 1999/04/17 22:16:31 morgan Exp $
.\"
.TH CAP_GET_PROC 3 "2008-05-11" "" "Linux Programmer's Manual"
.SH NAME
cap_get_proc, cap_set_proc, capgetp, cap_get_bound, cap_drop_bound \-
capability manipulation on processes
.SH SYNOPSIS
.B #include <sys/capability.h>
.sp
.B "cap_t cap_get_proc(void);"
.sp
.BI "int cap_set_proc(cap_t " cap_p );
.sp
.BI "int cap_get_bound(cap_value_t " cap );
.sp
.BI "CAP_IS_SUPPORTED(cap_value_t " cap );
.sp
.BI "int cap_drop_bound(cap_value_t " cap );
.sp
.B #include <sys/types.h>
.sp
.BI "cap_t cap_get_pid(pid_t " pid );
.sp
Link with \fI-lcap\fP.
.SH DESCRIPTION
.BR cap_get_proc ()
allocates a capability state in working storage, sets its state to
that of the calling process, and returns a pointer to this newly
created capability state.  The caller should free any releasable
memory, when the capability state in working storage is no longer
required, by calling
.BR cap_free ()
with the
.I cap_t
as an argument.
.PP
.BR cap_set_proc ()
sets the values for all capability flags for all capabilities to the
capability state identified by
.IR cap_p .
The new capability state of the process will be completely determined by
the contents of
.I cap_p
upon successful return from this function.  If any flag in
.I cap_p
is set for any capability not currently permitted for the calling process,
the function will fail, and the capability state of the process will remain
unchanged.
.PP
.BR cap_get_pid ()
returns
.IR cap_t ,
see 
.BR cap_init (3),
with the process capabilities of the process indicated by
.IR pid .
This information can also be obtained from the
.I /proc/<pid>/status
file.
.PP
.BR cap_get_bound ()
with a
.I  cap
as an argument returns the current value of this bounding set
capability flag in effect for the current process. This operation is
unpriveged. Note, a macro function
.BI "CAP_IS_SUPPORTED(cap_value_t " cap )
is provided that evaluates to true (1) if the system supports the
specified capability,
.IR cap .
If the system does not support the capability, this function returns
0. This macro works by testing for an error condition with
.BR cap_get_bound ().
.PP
.BR cap_drop_bound ()
can be used to lower the specified bounding set capability,
.BR cap ,
To complete successfully, the prevailing
.I effective
capability set must have a raised
.BR CAP_SETPCAP .
.SH "RETURN VALUE"
The functions
.BR cap_get_proc ()
and
.BR cap_get_pid ()
return a non-NULL value on success, and NULL on failure.
.PP
The function
.BR cap_get_bound ()
returns -1 if the requested capability is unknown, otherwise the
return value reflects the current state of that capability in the
prevailing bounding set. Note, a macro function,
.PP
The functions
.BR cap_set_proc ()
and
.BR cap_drop_bound ()
return zero for success, and \-1 on failure.
.PP
On failure,
.I errno
is set to
.BR EINVAL ,
.BR EPERM,
or
.BR ENOMEM .
.SH "CONFORMING TO"
.BR cap_set_proc ()
and
.BR cap_get_proc ()
are specified in the withdrawn POSIX.1e draft specification.
.BR cap_get_pid ()
is a Linux extension.
.SH "NOTES"
The library also supports the deprecated functions:
.PP
.BI "int capgetp(pid_t " pid ", cap_t " cap_d );
.PP
.BI "int capsetp(pid_t " pid ", cap_t " cap_d );
.PP
.BR capgetp ()
attempts to obtain the capabilities of some other process; storing the
capabilities in a pre-allocated
.IR cap_d . See
.BR cap_init ()
for information on allocating an empty capability set. This function,
.BR capgetp (),
is deprecated, you should use
.BR cap_get_pid ().
.PP
.BR capsetp ()
attempts to set the capabilities of some other process(es),
.IR pid . 
If
.I pid
is positive it refers to a specific process;  if it is zero, it refers
to the current process; -1 refers to all processes other than the
current process and process '1' (typically 
.BR init (8));
other negative values refer to the
.I -pid
process group.  In order to use this function, the kernel must support
it and the current process must have
.B CAP_SETPCAP
raised in its Effective capability set. The capabilities set in the
target process(es) are those contained in
.IR cap_d .
Kernels that support filesystem capabilities redefine the semantics of
.B CAP_SETPCAP
and on such systems this function will always fail for any target not
equal to the current process.
.BR capsetp ()
returns zero for success, and \-1 on failure.

Where supported by the kernel, the function
.BR capsetp ()
should be used with care.  It existed, primarily, to overcome an early
lack of support for capabilities in the filesystems supported by
Linux.  Note that, by default, the only processes that have
.B CAP_SETPCAP
available to them are processes started as a kernel thread.
(Typically this includes
.BR init (8),
kflushd and kswapd). You will need to recompile the kernel to modify
this default.
.SH EXAMPLE
The code segment below raises the
.B CAP_FOWNER
and
.B CAP_SETFCAP
effective capabilities for the caller:
.nf

    cap_t caps;
    cap_value_t cap_list[2];

    if (!CAP_IS_SUPPORTED(CAP_SETFCAP))
        /* handle error */

    caps = cap_get_proc();
    if (caps == NULL)
        /* handle error */;

    cap_list[0] = CAP_FOWNER;
    cap_list[1] = CAP_SETFCAP;
    if (cap_set_flag(caps, CAP_EFFECTIVE, 2, cap_list, CAP_SET) == -1)
        /* handle error */;

    if (cap_set_proc(caps) == -1)
        /* handle error */;

    if (cap_free(caps) == -1)
        /* handle error */;
.fi
.SH "SEE ALSO"
.BR libcap (3),
.BR cap_clear (3),
.BR cap_copy_ext (3),
.BR cap_from_text (3),
.BR cap_get_file (3),
.BR cap_init (3),
.BR capabilities (7)
