mirror of
https://github.com/moparisthebest/curl
synced 2025-02-28 09:21:50 -05:00
rename: a new file for Curl_rename()
And make the cookie save function use it.
This commit is contained in:
parent
b834890a3f
commit
330f133224
@ -63,7 +63,7 @@ LIB_CFILES = file.c timeval.c base64.c hostip.c progress.c formdata.c \
|
||||
curl_multibyte.c hostcheck.c conncache.c dotdot.c \
|
||||
x509asn1.c http2.c smb.c curl_endian.c curl_des.c system_win32.c \
|
||||
mime.c sha256.c setopt.c curl_path.c curl_ctype.c curl_range.c psl.c \
|
||||
doh.c urlapi.c curl_get_line.c altsvc.c socketpair.c
|
||||
doh.c urlapi.c curl_get_line.c altsvc.c socketpair.c rename.c
|
||||
|
||||
LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
|
||||
formdata.h cookie.h http.h sendf.h ftp.h url.h dict.h if2ip.h \
|
||||
@ -84,7 +84,7 @@ LIB_HFILES = arpa_telnet.h netrc.h file.h timeval.h hostip.h progress.h \
|
||||
x509asn1.h http2.h sigpipe.h smb.h curl_endian.h curl_des.h \
|
||||
curl_printf.h system_win32.h rand.h mime.h curl_sha256.h setopt.h \
|
||||
curl_path.h curl_ctype.h curl_range.h psl.h doh.h urlapi-int.h \
|
||||
curl_get_line.h altsvc.h quic.h socketpair.h
|
||||
curl_get_line.h altsvc.h quic.h socketpair.h rename.h
|
||||
|
||||
LIB_RCFILES = libcurl.rc
|
||||
|
||||
|
28
lib/cookie.c
28
lib/cookie.c
@ -98,6 +98,7 @@ Example set of cookies:
|
||||
#include "inet_pton.h"
|
||||
#include "parsedate.h"
|
||||
#include "rand.h"
|
||||
#include "rename.h"
|
||||
|
||||
/* The last 3 #include files should be in this order */
|
||||
#include "curl_printf.h"
|
||||
@ -1494,31 +1495,6 @@ static char *get_netscape_format(const struct Cookie *co)
|
||||
co->value?co->value:"");
|
||||
}
|
||||
|
||||
/* return 0 on success, 1 on error */
|
||||
static int xrename(const char *oldpath, const char *newpath)
|
||||
{
|
||||
#ifdef WIN32
|
||||
/* rename() on Windows doesn't overwrite, so we can't use it here.
|
||||
MoveFileExA() will overwrite and is usually atomic, however it fails
|
||||
when there are open handles to the file. */
|
||||
const int max_wait_ms = 1000;
|
||||
struct curltime start = Curl_now();
|
||||
for(;;) {
|
||||
timediff_t diff;
|
||||
if(MoveFileExA(oldpath, newpath, MOVEFILE_REPLACE_EXISTING))
|
||||
break;
|
||||
diff = Curl_timediff(Curl_now(), start);
|
||||
if(diff < 0 || diff > max_wait_ms)
|
||||
return 1;
|
||||
Sleep(1);
|
||||
}
|
||||
#else
|
||||
if(rename(oldpath, newpath))
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* cookie_output()
|
||||
*
|
||||
@ -1606,7 +1582,7 @@ static int cookie_output(struct Curl_easy *data,
|
||||
if(out && !use_stdout) {
|
||||
fclose(out);
|
||||
out = NULL;
|
||||
if(xrename(tempstore, filename)) {
|
||||
if(Curl_rename(tempstore, filename)) {
|
||||
unlink(tempstore);
|
||||
goto error;
|
||||
}
|
||||
|
62
lib/rename.c
Normal file
62
lib/rename.c
Normal file
@ -0,0 +1,62 @@
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
#include "rename.h"
|
||||
|
||||
#include "curl_setup.h"
|
||||
|
||||
#if (!defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)) || \
|
||||
defined(USE_ALTSVC)
|
||||
|
||||
#include "timeval.h"
|
||||
|
||||
/* The last 3 #include files should be in this order */
|
||||
#include "curl_printf.h"
|
||||
#include "curl_memory.h"
|
||||
#include "memdebug.h"
|
||||
|
||||
/* return 0 on success, 1 on error */
|
||||
int Curl_rename(const char *oldpath, const char *newpath)
|
||||
{
|
||||
#ifdef WIN32
|
||||
/* rename() on Windows doesn't overwrite, so we can't use it here.
|
||||
MoveFileExA() will overwrite and is usually atomic, however it fails
|
||||
when there are open handles to the file. */
|
||||
const int max_wait_ms = 1000;
|
||||
struct curltime start = Curl_now();
|
||||
for(;;) {
|
||||
timediff_t diff;
|
||||
if(MoveFileExA(oldpath, newpath, MOVEFILE_REPLACE_EXISTING))
|
||||
break;
|
||||
diff = Curl_timediff(Curl_now(), start);
|
||||
if(diff < 0 || diff > max_wait_ms)
|
||||
return 1;
|
||||
Sleep(1);
|
||||
}
|
||||
#else
|
||||
if(rename(oldpath, newpath))
|
||||
return 1;
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
27
lib/rename.h
Normal file
27
lib/rename.h
Normal file
@ -0,0 +1,27 @@
|
||||
#ifndef HEADER_CURL_RENAME_H
|
||||
#define HEADER_CURL_RENAME_H
|
||||
/***************************************************************************
|
||||
* _ _ ____ _
|
||||
* Project ___| | | | _ \| |
|
||||
* / __| | | | |_) | |
|
||||
* | (__| |_| | _ <| |___
|
||||
* \___|\___/|_| \_\_____|
|
||||
*
|
||||
* Copyright (C) 2020, Daniel Stenberg, <daniel@haxx.se>, et al.
|
||||
*
|
||||
* This software is licensed as described in the file COPYING, which
|
||||
* you should have received as part of this distribution. The terms
|
||||
* are also available at https://curl.haxx.se/docs/copyright.html.
|
||||
*
|
||||
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
|
||||
* copies of the Software, and permit persons to whom the Software is
|
||||
* furnished to do so, under the terms of the COPYING file.
|
||||
*
|
||||
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
||||
* KIND, either express or implied.
|
||||
*
|
||||
***************************************************************************/
|
||||
|
||||
int Curl_rename(const char *oldpath, const char *newpath);
|
||||
|
||||
#endif /* HEADER_CURL_RENAME_H */
|
Loading…
x
Reference in New Issue
Block a user