.lf 1 ./man/man3/explain_linkat.3
.\"
.\" libexplain - Explain errno values returned by libc functions
.\" Copyright (C) 2013 Peter Miller
.\"
.\" This program is free software; you can redistribute it and/or modify it
.\" under the terms of the GNU General Public License as published by the
.\" Free Software Foundation; either version 3 of the License, or (at your
.\" option) any later version.
.\"
.\" This program is distributed in the hope that it will be useful, but
.\" WITHOUT ANY WARRANTY; without even the implied warranty of
.\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
.\" General Public License for more details.
.\"
.\" You should have received a copy of the GNU General Public License along
.\" with this program. If not, see <http://www.gnu.org/licenses/>.
.\"
.ds n) explain_linkat
.cp 0  \" Compatibility mode off.
.TH explain_linkat 3
.SH NAME
explain_linkat \- explain \f[I]linkat\fP(2) errors
.if require_index \{
.\}
.SH SYNOPSIS
#include <libexplain/linkat.h>
.sp 0.3
.ad l
const char *explain_linkat(int old_fildes, const char *old_path, int
new_fildes, const char *new_path, int flags);
.br
const char *explain_errno_linkat(int errnum, int old_fildes, const char
*old_path, int new_fildes, const char *new_path, int flags);
.br
void explain_message_linkat(char *message, int message_size, int old_fildes,
const char *old_path, int new_fildes, const char *new_path, int flags);
.br
void explain_message_errno_linkat(char *message, int message_size, int
errnum, int old_fildes, const char *old_path, int new_fildes, const char
*new_path, int flags);
.ad b
.SH DESCRIPTION
These functions may be used to obtain explanations for errors returned by
the \f[I]linkat\fP(2) system call.
.\" ----------------------------------------------------
.SS explain_linkat
.ad l
const char *explain_linkat(int old_fildes, const char *old_path, int
new_fildes, const char *new_path, int flags);
.ad b
.PP
The \f[B]explain_linkat\fP function is used to obtain an explanation of an
error returned by the \f[I]linkat\fP(2) system call. The least the message
will contain is the value of \f[CW]strerror(errno)\fP, but usually it will
do much better, and indicate the underlying cause in more detail.
.PP
The \f[I]errno\fP global variable will be used to obtain the error value to
be decoded.
.TP 8n
\f[I]old_fildes\fP
The original old_fildes, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]old_path\fP
The original old_path, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]new_fildes\fP
The original new_fildes, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]new_path\fP
The original new_path, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]flags\fP
The original flags, exactly as passed to the \f[I]linkat\fP(2) system call.
.TP 8n
Returns:
The message explaining the error. This message buffer is shared by all
libexplain functions which do not supply a buffer in their argument list.
This will be overwritten by the next call to any libexplain function which
shares this buffer, including other threads.
.PP
\f[B]Note:\fP This function is \f[B]not\fP thread safe, because it shares a
return buffer across all threads, and many other functions in this library.
.PP
\f[B]Example:\fP This function is intended to be used in a fashion similar
to the following example:
.RS
.ft CW
.fi
.ad l
if (linkat(old_fildes, old_path, new_fildes, new_path, flags) < 0)
.ad b
.nf
{
.fi
.ad l
.in +4n
fprintf(stderr, "%s\en", explain_linkat(old_fildes, old_path, new_fildes,
new_path, flags));
.in -4n
.nf
    exit(EXIT_FAILURE);
}
.fi
.ft R
.ad b
.RE
.PP
The above code example is available pre\-packaged as the
\f[I]explain_linkat_or_die\fP(3) function.
.\" ----------------------------------------------------
.SS explain_errno_linkat
.ad l
const char *explain_errno_linkat(int errnum, int old_fildes, const char
*old_path, int new_fildes, const char *new_path, int flags);
.ad b
.PP
The \f[B]explain_errno_linkat\fP function is used to obtain an explanation
of an error returned by the \f[I]linkat\fP(2) system call. The least the
message will contain is the value of \f[CW]strerror(errno)\fP, but usually
it will do much better, and indicate the underlying cause in more detail.
.TP 8n
\f[I]errnum\fP
The error value to be decoded, usually obtained from the \f[I]errno\fP
global variable just before this function is called. This is necessary if
you need to call \f[B]any\fP code between the system call to be explained
and this function, because many libc functions will alter the value of
\f[I]errno\fP.
.TP 8n
\f[I]old_fildes\fP
The original old_fildes, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]old_path\fP
The original old_path, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]new_fildes\fP
The original new_fildes, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]new_path\fP
The original new_path, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]flags\fP
The original flags, exactly as passed to the \f[I]linkat\fP(2) system call.
.TP 8n
Returns:
The message explaining the error. This message buffer is shared by all
libexplain functions which do not supply a buffer in their argument list.
This will be overwritten by the next call to any libexplain function which
shares this buffer, including other threads.
.PP
\f[B]Note:\fP This function is \f[B]not\fP thread safe, because it shares a
return buffer across all threads, and many other functions in this library.
.PP
\f[B]Example:\fP This function is intended to be used in a fashion similar
to the following example:
.RS
.ft CW
.fi
.ad l
if (linkat(old_fildes, old_path, new_fildes, new_path, flags) < 0)
.ad b
.nf
{
    int err = errno;
.fi
.ad l
.in +4n
fprintf(stderr, "%s\en", explain_errno_linkat(err, old_fildes, old_path,
new_fildes, new_path, flags));
.in -4n
.nf
    exit(EXIT_FAILURE);
}
.fi
.ft R
.ad b
.RE
.PP
The above code example is available pre\-packaged as the
\f[I]explain_linkat_or_die\fP(3) function.
.\" ----------------------------------------------------
.SS explain_message_linkat
.ad l
void explain_message_linkat(char *message, int message_size, int old_fildes,
const char *old_path, int new_fildes, const char *new_path, int flags);
.ad b
.PP
The \f[B]explain_message_linkat\fP function is used to obtain an
explanation of an error returned by the \f[I]linkat\fP(2) system call. The
least the message will contain is the value of \f[CW]strerror(errno)\fP,
but usually it will do much better, and indicate the underlying cause in
more detail.
.PP
The \f[I]errno\fP global variable will be used to obtain the error value to
be decoded.
.TP 8n
\f[I]message\fP
The location in which to store the returned message. If a suitable message
return buffer is supplied, this function is thread safe.
.TP 8n
\f[I]message_size\fP
The size in bytes of the location in which to store the returned message.
.TP 8n
\f[I]old_fildes\fP
The original old_fildes, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]old_path\fP
The original old_path, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]new_fildes\fP
The original new_fildes, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]new_path\fP
The original new_path, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]flags\fP
The original flags, exactly as passed to the \f[I]linkat\fP(2) system call.
.PP
\f[B]Example:\fP This function is intended to be used in a fashion similar
to the following example:
.RS
.ft CW
.fi
.ad l
if (linkat(old_fildes, old_path, new_fildes, new_path, flags) < 0)
.ad b
.nf
{
    char message[3000];
.in +4n
.fi
.ad l
explain_message_linkat(message, sizeof(message), old_fildes, old_path,
new_fildes, new_path, flags);
.nf
.in -4n
    fprintf(stderr, "%s\en", message);
    exit(EXIT_FAILURE);
}
.fi
.ft R
.ad b
.RE
.PP
The above code example is available pre\-packaged as the
\f[I]explain_linkat_or_die\fP(3) function.
.\" ----------------------------------------------------
.SS explain_message_errno_linkat
.ad l
void explain_message_errno_linkat(char *message, int message_size, int
errnum, int old_fildes, const char *old_path, int new_fildes, const char
*new_path, int flags);
.ad b
.PP
The \f[B]explain_message_errno_linkat\fP function is used to obtain an
explanation of an error returned by the \f[I]linkat\fP(2) system call. The
least the message will contain is the value of \f[CW]strerror(errno)\fP,
but usually it will do much better, and indicate the underlying cause in
more detail.
.TP 8n
\f[I]message\fP
The location in which to store the returned message. If a suitable message
return buffer is supplied, this function is thread safe.
.TP 8n
\f[I]message_size\fP
The size in bytes of the location in which to store the returned message.
.TP 8n
\f[I]errnum\fP
The error value to be decoded, usually obtained from the \f[I]errno\fP
global variable just before this function is called. This is necessary if
you need to call \f[B]any\fP code between the system call to be explained
and this function, because many libc functions will alter the value of
\f[I]errno\fP.
.TP 8n
\f[I]old_fildes\fP
The original old_fildes, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]old_path\fP
The original old_path, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]new_fildes\fP
The original new_fildes, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]new_path\fP
The original new_path, exactly as passed to the \f[I]linkat\fP(2) system
call.
.TP 8n
\f[I]flags\fP
The original flags, exactly as passed to the \f[I]linkat\fP(2) system call.
.PP
\f[B]Example:\fP This function is intended to be used in a fashion similar
to the following example:
.RS
.ft CW
.fi
.ad l
if (linkat(old_fildes, old_path, new_fildes, new_path, flags) < 0)
.ad b
.nf
{
    int err = errno;
    char message[3000];
.in +4n
.fi
.ad l
explain_message_errno_linkat(message, sizeof(message), err, old_fildes,
old_path, new_fildes, new_path, flags);
.nf
.in -4n
    fprintf(stderr, "%s\en", message);
    exit(EXIT_FAILURE);
}
.fi
.ft R
.ad b
.RE
.PP
The above code example is available pre\-packaged as the
\f[I]explain_linkat_or_die\fP(3) function.
.\" ----------------------------------------------------
.SH SEE ALSO
.TP 8n
\f[I]linkat\fP(2)
create a file link relative to directory file descriptors
.TP 8n
\f[I]explain_linkat_or_die\fP(3)
create a file link relative to directory file descriptors and report errors
.\" ----------------------------------------------------
.SH COPYRIGHT
.lf 1 ./etc/version.so
.ds v) 1.4
.ds V) 1.4.D001
.ds Y) 2008, 2009, 2010, 2011, 2012, 2013, 2014
.lf 346 ./man/man3/explain_linkat.3
.if n .ds C) (C)
.if t .ds C) \(co
libexplain version \*(v)
.br
Copyright \*(C) 2013 Peter Miller
.\" vim: set ts=8 sw=4 et :