Commit 56509055 authored by Patrick Monnerat's avatar Patrick Monnerat
Browse files

cli tool: use file2memory() to buffer stdin in -F option.

parent 665b3e48
Loading
Loading
Loading
Loading
+15 −38
Original line number Diff line number Diff line
@@ -32,12 +32,12 @@
#include "tool_convert.h"
#include "tool_msgs.h"
#include "tool_binmode.h"
#include "tool_getparam.h"
#include "tool_paramhlp.h"
#include "tool_formparse.h"

#include "memdebug.h" /* keep this as LAST include */

#define STDIN_BUFSIZE 0x4000   /* Always have 16K to read more stdin data. */

/* Stdin parameters. */
typedef struct {
  char *data;  /* Memory data. */
@@ -474,46 +474,23 @@ static CURLcode file_or_stdin(curl_mimepart *part, const char *file)
    if(sip->size < 0)
      sip->size = 0;
  }
  else {
    /* Not suitable for direct use, buffer stdin data. */
    sip->origin = 0;
    sip->size = 0;
    sip->curpos = STDIN_BUFSIZE;
    sip->data = malloc(STDIN_BUFSIZE);
    if(!sip->data) {
      stdin_free(sip);
      return CURLE_OUT_OF_MEMORY;
    }
    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;
  else {  /* Not suitable for direct use, buffer stdin data. */
    size_t stdinsize = 0;

      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;
    sip->origin = 0;
    if(file2memory(&sip->data, &stdinsize, stdin) != PARAM_OK)
      result = CURLE_OUT_OF_MEMORY;
    else {
      if(!stdinsize)
        sip->data = NULL;  /* Has been freed if no data. */
      sip->size = stdinsize;
      if(ferror(stdin))
        result = CURLE_READ_ERROR;
    }
    /* 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. */
  if(!result)
    result = curl_mime_filename(part, file);

  /* Set part's data from callback. */