From 7f3888a4409d4db4abfb3f60a4c22ab5937aca1a Mon Sep 17 00:00:00 2001 From: short <> Date: Tue, 28 Oct 2003 14:06:27 +0000 Subject: [PATCH] Command 'put' support for buffer-size option: -b|--buffer-size Fixed 'command_name --help' to prevent exit of captive-cmdline(1). --- src/client/cmdline/cmd_put.c | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/src/client/cmdline/cmd_put.c b/src/client/cmdline/cmd_put.c index 5bedd9b..479c73d 100644 --- a/src/client/cmdline/cmd_put.c +++ b/src/client/cmdline/cmd_put.c @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include "cmd_put.h" /* self */ #include "cmd_cd.h" /* for cmdline_path_from_cwd() */ @@ -33,7 +35,7 @@ /* Config: */ -#define TRANSFER_BUFFER_SIZE (0x10000) +#define DEFAULT_TRANSFER_BUFFER_SIZE (0x10000) GQuark cmdline_cmd_put_error_quark(void) @@ -47,8 +49,12 @@ GQuark r=0; } +static gchar *optarg_transfer_buffer; + const struct poptOption cmd_put_table[]={ - POPT_AUTOHELP + CMDLINE_POPT("buffer-size",'b',POPT_ARG_STRING,&optarg_transfer_buffer, + N_("Transfer buffer size"),N_("size")), + CMDLINE_POPT_AUTOHELP POPT_TABLEEND }; @@ -59,11 +65,27 @@ CaptiveFileObject *captive_file_object; const gchar *sourcefile,*targetfile; guint perm=0644; int fdsrc; -guint8 transfer_buffer[TRANSFER_BUFFER_SIZE]; +guint8 *transfer_buffer; +long transfer_buffer_size=DEFAULT_TRANSFER_BUFFER_SIZE; int got; g_return_if_fail(!errp || !*errp); + if (optarg_transfer_buffer) { +const gchar *string=captive_strdup_alloca(optarg_transfer_buffer); +char *endptr; + + free(optarg_transfer_buffer); + optarg_transfer_buffer=NULL; + + transfer_buffer_size=strtol(string,&endptr,0); + if (transfer_buffer_size<=0 || transfer_buffer_size>=LONG_MAX || (endptr && *endptr)) { + g_set_error(errp,CMDLINE_CMD_PUT_ERROR,CMDLINE_CMD_PUT_ERROR_PARSING_TRANSFER_BUFFER_SIZE, + _("Error parsing transfer buffer size: %s"),string); + return; + } + } + sourcefile=cmd_argv[0]; if (cmd_argv[1]) targetfile=cmdline_path_from_cwd(cmd_argv[1]); @@ -101,7 +123,10 @@ gchar *sourcefile_basename; goto err_close_fdsrc; } - while (0<(got=read(fdsrc,transfer_buffer,sizeof(transfer_buffer)))) { + transfer_buffer=g_malloc(transfer_buffer_size); + g_assert(transfer_buffer!=NULL); /* Should not happen. */ + + while (0<(got=read(fdsrc,transfer_buffer,transfer_buffer_size))) { GnomeVFSFileSize bytes_written; if (!errvfsresult_to_gerr(errp,captive_file_write( @@ -112,23 +137,25 @@ GnomeVFSFileSize bytes_written; err_cleanup(errp); g_set_error(errp,CMDLINE_CMD_PUT_ERROR,CMDLINE_CMD_PUT_ERROR_WRITING_TARGET_GUESTOS_FILE, _("Error writing target guest-os file: %s"),targetfile); - goto err_unref_captive_file_object; + goto err_free_transfer_buffer; } if (bytes_written!=(GnomeVFSFileSize)got) { g_set_error(errp,CMDLINE_CMD_PUT_ERROR,CMDLINE_CMD_PUT_ERROR_WRITING_TARGET_GUESTOS_FILE, _("Error writing target guest-os file '%s': requested %d, written %Lu"), targetfile,got,(unsigned long long)bytes_written); - goto err_unref_captive_file_object; + goto err_free_transfer_buffer; } } if (got==-1) { g_set_error(errp,CMDLINE_CMD_PUT_ERROR,CMDLINE_CMD_PUT_ERROR_READING_SOURCE_FILE, _("Error reading source host-os file '%s': %s"),sourcefile,g_strerror(errno)); - goto err_unref_captive_file_object; + goto err_free_transfer_buffer; } g_assert(got==0); -err_unref_captive_file_object: +err_free_transfer_buffer: + g_free(transfer_buffer); +/* err_unref_captive_file_object: */ g_object_unref(captive_file_object); err_close_fdsrc: if (close(fdsrc)) { -- 1.8.3.1