Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -2349,7 +2349,7 @@ CURL_CHECK_FUNC_LOCALTIME_R
CURL_CHECK_FUNC_MEMRCHR
CURL_CHECK_FUNC_POLL
CURL_CHECK_FUNC_SETSOCKOPT
CURL_CHECK_FUNC_SETXATTR
CURL_CHECK_FUNC_FSETXATTR
CURL_CHECK_FUNC_SIGACTION
CURL_CHECK_FUNC_SIGINTERRUPT
CURL_CHECK_FUNC_SIGNAL
Expand Down
74 changes: 37 additions & 37 deletions m4/curl-functions.m4
Original file line number Diff line number Diff line change
Expand Up @@ -5924,86 +5924,86 @@ AC_DEFUN([CURL_CHECK_FUNC_WRITEV], [
fi
])

dnl CURL_CHECK_FUNC_SETXATTR
dnl CURL_CHECK_FUNC_FSETXATTR
dnl -------------------------------------------------
dnl Verify if setxattr is available, prototyped, and
dnl Verify if fsetxattr is available, prototyped, and
dnl can be compiled. If all of these are true, and
dnl usage has not been previously disallowed with
dnl shell variable curl_disallow_setxattr, then
dnl HAVE_SETXATTR will be defined.
dnl shell variable curl_disallow_fsetxattr, then
dnl HAVE_FSETXATTR will be defined.

AC_DEFUN([CURL_CHECK_FUNC_SETXATTR], [
AC_DEFUN([CURL_CHECK_FUNC_FSETXATTR], [
AC_REQUIRE([CURL_INCLUDES_SYS_XATTR])dnl
#
tst_links_setxattr="unknown"
tst_proto_setxattr="unknown"
tst_compi_setxattr="unknown"
tst_allow_setxattr="unknown"
tst_links_fsetxattr="unknown"
tst_proto_fsetxattr="unknown"
tst_compi_fsetxattr="unknown"
tst_allow_fsetxattr="unknown"
#
AC_MSG_CHECKING([if setxattr can be linked])
AC_MSG_CHECKING([if fsetxattr can be linked])
AC_LINK_IFELSE([
AC_LANG_FUNC_LINK_TRY([setxattr])
AC_LANG_FUNC_LINK_TRY([fsetxattr])
],[
AC_MSG_RESULT([yes])
tst_links_setxattr="yes"
tst_links_fsetxattr="yes"
],[
AC_MSG_RESULT([no])
tst_links_setxattr="no"
tst_links_fsetxattr="no"
])
#
if test "$tst_links_setxattr" = "yes"; then
AC_MSG_CHECKING([if setxattr is prototyped])
AC_EGREP_CPP([setxattr],[
if test "$tst_links_fsetxattr" = "yes"; then
AC_MSG_CHECKING([if fsetxattr is prototyped])
AC_EGREP_CPP([fsetxattr],[
$curl_includes_sys_xattr
],[
AC_MSG_RESULT([yes])
tst_proto_setxattr="yes"
tst_proto_fsetxattr="yes"
],[
AC_MSG_RESULT([no])
tst_proto_setxattr="no"
tst_proto_fsetxattr="no"
])
fi
#
if test "$tst_proto_setxattr" = "yes"; then
AC_MSG_CHECKING([if setxattr is compilable])
if test "$tst_proto_fsetxattr" = "yes"; then
AC_MSG_CHECKING([if fsetxattr is compilable])
AC_COMPILE_IFELSE([
AC_LANG_PROGRAM([[
$curl_includes_sys_xattr
]],[[
if(0 != setxattr(0, 0, 0, 0, 0))
if(0 != fsetxattr("", "", "", 0, 0))
return 1;
]])
],[
AC_MSG_RESULT([yes])
tst_compi_setxattr="yes"
tst_compi_fsetxattr="yes"
],[
AC_MSG_RESULT([no])
tst_compi_setxattr="no"
tst_compi_fsetxattr="no"
])
fi
#
if test "$tst_compi_setxattr" = "yes"; then
AC_MSG_CHECKING([if setxattr usage allowed])
if test "x$curl_disallow_setxattr" != "xyes"; then
if test "$tst_compi_fsetxattr" = "yes"; then
AC_MSG_CHECKING([if fsetxattr usage allowed])
if test "x$curl_disallow_fsetxattr" != "xyes"; then
AC_MSG_RESULT([yes])
tst_allow_setxattr="yes"
tst_allow_fsetxattr="yes"
else
AC_MSG_RESULT([no])
tst_allow_setxattr="no"
tst_allow_fsetxattr="no"
fi
fi
#
AC_MSG_CHECKING([if setxattr might be used])
if test "$tst_links_setxattr" = "yes" &&
test "$tst_proto_setxattr" = "yes" &&
test "$tst_compi_setxattr" = "yes" &&
test "$tst_allow_setxattr" = "yes"; then
AC_MSG_CHECKING([if fsetxattr might be used])
if test "$tst_links_fsetxattr" = "yes" &&
test "$tst_proto_fsetxattr" = "yes" &&
test "$tst_compi_fsetxattr" = "yes" &&
test "$tst_allow_fsetxattr" = "yes"; then
AC_MSG_RESULT([yes])
AC_DEFINE_UNQUOTED(HAVE_SETXATTR, 1,
[Define to 1 if you have the setxattr function.])
ac_cv_func_setxattr="yes"
AC_DEFINE_UNQUOTED(HAVE_FSETXATTR, 1,
[Define to 1 if you have the fsetxattr function.])
ac_cv_func_fsetxattr="yes"
else
AC_MSG_RESULT([no])
ac_cv_func_setxattr="no"
ac_cv_func_fsetxattr="no"
fi
])
15 changes: 7 additions & 8 deletions src/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -5633,8 +5633,14 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
}
}
}

if(outfile && !curlx_strequal(outfile, "-") && outs.stream) {
if(config->xattr) {
int err = fwrite_xattr(curl, fileno(outs.stream) );
if(err)
warnf( config, "Error setting extended attributes: %s\n",
strerror(errno) );
}

int rc = fclose(outs.stream);
if(!res && rc) {
/* something went wrong in the writing process */
Expand All @@ -5643,13 +5649,6 @@ operate(struct Configurable *config, int argc, argv_item_t argv[])
}
}

if(config->xattr && outs.filename) {
int err = write_xattr(curl, outs.filename );
if(err)
warnf( config, "Error setting extended attributes: %s\n",
strerror(errno) );
}

#ifdef HAVE_UTIME
/* Important that we set the time _after_ the file has been
closed, as is done above here */
Expand Down
10 changes: 5 additions & 5 deletions src/xattr.c
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#include <curl/curl.h>
#include "xattr.h"

#ifdef HAVE_SETXATTR
#ifdef HAVE_FSETXATTR
#include <sys/types.h>
#include <string.h>
#include <sys/xattr.h> /* include header from libc, not from libattr */
Expand All @@ -46,7 +46,7 @@ static const struct xattr_mapping {
/* store metadata from the curl request alongside the downloaded
* file using extended attributes
*/
int write_xattr(CURL *curl, const char *filename)
int fwrite_xattr(CURL *curl, int fd)
{
int i = 0;
int err = 0;
Expand All @@ -55,17 +55,17 @@ int write_xattr(CURL *curl, const char *filename)
char *value = NULL;
CURLcode rc = curl_easy_getinfo(curl, mappings[i].info, &value);
if ( rc == CURLE_OK && value ) {
err = setxattr( filename, mappings[i].attr, value, strlen(value), 0 );
err = fsetxattr( fd, mappings[i].attr, value, strlen(value), 0 );
}
i++;
}
return err;
}
#else
int write_xattr(CURL *curl, const char *filename)
int fwrite_xattr(CURL *curl, int fd)
{
(void)curl;
(void)filename;
(void)fd;
return 0;
}
#endif
2 changes: 1 addition & 1 deletion src/xattr.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,6 @@
* KIND, either express or implied.
*
***************************************************************************/
int write_xattr( CURL *curl, const char *filename );
int fwrite_xattr(CURL *curl, int fd);

#endif