mirror of
https://git.freebsd.org/ports.git
synced 2025-07-14 15:59:18 -04:00
116 lines
3.9 KiB
C
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] = '_';
|