mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
cli tool: use file2memory() to buffer stdin in -F option.
Closes PR https://github.com/curl/curl/pull/1985
This commit is contained in:
parent
665b3e48bc
commit
56509055d2
@ -32,12 +32,12 @@
|
|||||||
#include "tool_convert.h"
|
#include "tool_convert.h"
|
||||||
#include "tool_msgs.h"
|
#include "tool_msgs.h"
|
||||||
#include "tool_binmode.h"
|
#include "tool_binmode.h"
|
||||||
|
#include "tool_getparam.h"
|
||||||
|
#include "tool_paramhlp.h"
|
||||||
#include "tool_formparse.h"
|
#include "tool_formparse.h"
|
||||||
|
|
||||||
#include "memdebug.h" /* keep this as LAST include */
|
#include "memdebug.h" /* keep this as LAST include */
|
||||||
|
|
||||||
#define STDIN_BUFSIZE 0x4000 /* Always have 16K to read more stdin data. */
|
|
||||||
|
|
||||||
/* Stdin parameters. */
|
/* Stdin parameters. */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *data; /* Memory data. */
|
char *data; /* Memory data. */
|
||||||
@ -474,46 +474,23 @@ static CURLcode file_or_stdin(curl_mimepart *part, const char *file)
|
|||||||
if(sip->size < 0)
|
if(sip->size < 0)
|
||||||
sip->size = 0;
|
sip->size = 0;
|
||||||
}
|
}
|
||||||
else {
|
else { /* Not suitable for direct use, buffer stdin data. */
|
||||||
/* Not suitable for direct use, buffer stdin data. */
|
size_t stdinsize = 0;
|
||||||
|
|
||||||
sip->origin = 0;
|
sip->origin = 0;
|
||||||
sip->size = 0;
|
if(file2memory(&sip->data, &stdinsize, stdin) != PARAM_OK)
|
||||||
sip->curpos = STDIN_BUFSIZE;
|
result = CURLE_OUT_OF_MEMORY;
|
||||||
sip->data = malloc(STDIN_BUFSIZE);
|
else {
|
||||||
if(!sip->data) {
|
if(!stdinsize)
|
||||||
stdin_free(sip);
|
sip->data = NULL; /* Has been freed if no data. */
|
||||||
return CURLE_OUT_OF_MEMORY;
|
sip->size = stdinsize;
|
||||||
|
if(ferror(stdin))
|
||||||
|
result = CURLE_READ_ERROR;
|
||||||
}
|
}
|
||||||
for(;;) {
|
|
||||||
size_t wantbytes = (size_t) (sip->curpos - sip->size);
|
|
||||||
size_t havebytes = fread(sip->data + (size_t) sip->size, 1, wantbytes,
|
|
||||||
stdin);
|
|
||||||
char *p;
|
|
||||||
|
|
||||||
sip->size += havebytes;
|
|
||||||
if(ferror(stdin)) {
|
|
||||||
stdin_free(sip);
|
|
||||||
return CURLE_READ_ERROR;
|
|
||||||
}
|
}
|
||||||
if(!havebytes || feof(stdin))
|
|
||||||
break;
|
|
||||||
|
|
||||||
/* Enlarge data buffer. */
|
|
||||||
p = realloc(sip->data, (size_t) sip->size + STDIN_BUFSIZE);
|
|
||||||
if(!p) {
|
|
||||||
stdin_free(sip);
|
|
||||||
return CURLE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
sip->data = p;
|
|
||||||
sip->curpos = sip->size + STDIN_BUFSIZE;
|
|
||||||
}
|
|
||||||
/* Shrink buffer to spare memory resources. */
|
|
||||||
if(sip->size < sip->curpos)
|
|
||||||
sip->data = realloc(sip->data, (size_t) sip->size);
|
|
||||||
}
|
|
||||||
sip->curpos = 0; /* Rewind. */
|
|
||||||
|
|
||||||
/* Set remote file name. */
|
/* Set remote file name. */
|
||||||
|
if(!result)
|
||||||
result = curl_mime_filename(part, file);
|
result = curl_mime_filename(part, file);
|
||||||
|
|
||||||
/* Set part's data from callback. */
|
/* Set part's data from callback. */
|
||||||
|
Loading…
Reference in New Issue
Block a user