X-Git-Url: http://sjero.net/git/?p=wget;a=blobdiff_plain;f=src%2Fftp.c;h=c1e2d002c7cd7244e9032aab07385b6f29a4cb4f;hp=e65f8284dccae3a3d835f41410b37817cb95e2dd;hb=50d143f3fefbcb343d4d1968d4f9d0d59178ce3f;hpb=16c53cdf93b484f0ea5de207166ac2e57b48444f diff --git a/src/ftp.c b/src/ftp.c index e65f8284..c1e2d002 100644 --- a/src/ftp.c +++ b/src/ftp.c @@ -953,10 +953,30 @@ Error in server response, closing control connection.\n")); mkalldirs (con->target); if (opt.backups) rotate_backups (con->target); - /* #### Is this correct? */ - chmod (con->target, 0600); - fp = fopen (con->target, restval ? "ab" : "wb"); + if (restval) + fp = fopen (con->target, "ab"); + else if (opt.noclobber || opt.always_rest || opt.timestamping || opt.dirstruct + || opt.output_document) + fp = fopen (con->target, "wb"); + else + { + fp = fopen_excl (con->target, 0); + if (!fp && errno == EEXIST) + { + /* We cannot just invent a new name and use it (which is + what functions like unique_create typically do) + because we told the user we'd use this name. + Instead, return and retry the download. */ + logprintf (LOG_NOTQUIET, _("%s has sprung into existence.\n"), + con->target); + fd_close (csock); + con->csock = -1; + fd_close (dtsock); + fd_close (local_sock); + return FOPEN_EXCL_ERR; + } + } if (!fp) { logprintf (LOG_NOTQUIET, "%s: %s\n", con->target, strerror (errno)); @@ -1219,8 +1239,16 @@ ftp_loop_internal (struct url *u, struct fileinfo *f, ccon *con) case CONSOCKERR: case CONERROR: case FTPSRVERR: case FTPRERR: case WRITEFAILED: case FTPUNKNOWNTYPE: case FTPSYSERR: case FTPPORTERR: case FTPLOGREFUSED: case FTPINVPASV: + case FOPEN_EXCL_ERR: printwhat (count, opt.ntry); /* non-fatal errors */ + if (err == FOPEN_EXCL_ERR) + { + /* Re-determine the file name. */ + xfree_null (con->target); + con->target = url_file_name (u); + locf = con->target; + } continue; break; case FTPRETRINT: