ports/ftp/curl/files/patch-src::main.c
2008-04-23 11:33:34 +00:00

116 lines
3.9 KiB
C

diff -urN -urN -x .svn ../../vendor/curl/src/main.c ./src/main.c
--- ../../vendor/curl/src/main.c 2008-03-24 00:40:11.000000000 +0200
+++ ./src/main.c 2008-04-02 15:51:11.000000000 +0300
@@ -4190,31 +4190,32 @@
(-1 == create_dir_hierarchy(outfile)))
return CURLE_WRITE_ERROR;
- if(config->resume_from_current) {
- /* We're told to continue from where we are now. Get the
- size of the file as it is now and open it for append instead */
-
- struct_stat fileinfo;
-
- /* VMS -- Danger, the filesize is only valid for stream files */
- if(0 == stat(outfile, &fileinfo))
- /* set offset to current file size: */
- config->resume_from = fileinfo.st_size;
- else
- /* let offset be 0 */
- config->resume_from = 0;
- }
-
outs.filename = outfile;
- if(config->resume_from) {
- outs.init = config->resume_from;
+ if(config->resume_from || config->resume_from_current) {
/* open file for output: */
- outs.stream=(FILE *) fopen(outfile, config->resume_from?"ab":"wb");
+ /* (always open for appending, it has no effect on new files) */
+ outs.stream=(FILE *) fopen(outfile, "ab");
if (!outs.stream) {
helpf("Can't open '%s'!\n", outfile);
return CURLE_WRITE_ERROR;
}
+
+ if(config->resume_from_current) {
+ /* We're told to continue from where we are now. Get the
+ size of the file as it is now */
+
+ struct_stat fileinfo;
+
+ if(0 == fstat(fileno(outs.stream), &fileinfo))
+ /* set offset to current file size: */
+ config->resume_from = fileinfo.st_size;
+ else
+ /* let offset be 0 */
+ config->resume_from = 0;
+ }
+
+ outs.init = config->resume_from;
}
else {
outs.stream = NULL; /* open when needed */
@@ -4289,7 +4290,7 @@
*/
infd= open(uploadfile, O_RDONLY | O_BINARY);
- if ((infd == -1) || stat(uploadfile, &fileinfo)) {
+ if ((infd == -1) || fstat(infd, &fileinfo)) {
helpf("Can't open '%s'!\n", uploadfile);
if(infd != -1)
close(infd);
@@ -5155,12 +5156,13 @@
const char *
msdosify (const char *file_name)
{
- static char dos_name[PATH_MAX];
+ static char dos_name[PATH_MAX + 16];
static const char illegal_chars_dos[] = ".+, ;=[]|<>\\\":?*";
static const char *illegal_chars_w95 = &illegal_chars_dos[8];
int idx, dot_idx;
const char *s = file_name;
char *d = dos_name;
+ char *dlimit = dos_name + PATH_MAX;
const char *illegal_aliens = illegal_chars_dos;
size_t len = sizeof (illegal_chars_dos) - 1;
int lfn = 0;
@@ -5181,7 +5183,7 @@
*d++ = *s++;
}
- for (idx = 0, dot_idx = -1; *s; s++, d++) {
+ for (idx = 0, dot_idx = -1; *s && d < dlimit; s++, d++) {
if (memchr (illegal_aliens, *s, len)) {
/* Dots are special: DOS doesn't allow them as the leading character,
and a file name cannot have more than a single dot. We leave the
@@ -5238,6 +5240,10 @@
idx++;
}
+ if(d >= dlimit) {
+ /* should some kind of error be raised? */
+ d = dlimit - 1;
+ }
*d = '\0';
return dos_name;
}
@@ -5252,11 +5258,15 @@
struct stat st_buf;
char fname[PATH_MAX];
- strcpy (fname, file_name);
+ snprintf (fname, PATH_MAX, "%s", file_name);
base = basename (fname);
if (((stat(base, &st_buf)) == 0) && (S_ISCHR(st_buf.st_mode))) {
- size_t blen = strlen (base);
+ size_t blen = strlen (base), flen = strlen (fname);
+ if(flen == PATH_MAX - 1) {
+ blen--;
+ base[blen] = '\0';
+ }
/* Prepend a '_'. */
memmove (base + 1, base, blen + 1);
base[0] = '_';