Command 'get' support for buffer-size option: -b|--buffer-size
authorshort <>
Tue, 28 Oct 2003 14:34:36 +0000 (14:34 +0000)
committershort <>
Tue, 28 Oct 2003 14:34:36 +0000 (14:34 +0000)
src/client/cmdline/cmd_get.c
src/client/cmdline/cmd_get.h

index 3d815a9..9a5a7de 100644 (file)
@@ -27,6 +27,7 @@
 #include <errno.h>
 #include <unistd.h>
 #include <captive/macros.h>
+#include <stdlib.h>
 
 #include "cmd_get.h"   /* self */
 #include "cmd_cd.h"    /* for cmdline_path_from_cwd() */
@@ -34,7 +35,7 @@
 
 
 /* Config: */
-#define TRANSFER_BUFFER_SIZE (0x10000)
+#define DEFAULT_TRANSFER_BUFFER_SIZE (0x10000)
 
 
 GQuark cmdline_cmd_get_error_quark(void)
@@ -48,7 +49,11 @@ GQuark r=0;
 }
 
 
+static gchar *optarg_transfer_buffer;
+
 const struct poptOption cmd_get_table[]={
+               CMDLINE_POPT("buffer-size",'b',POPT_ARG_STRING,&optarg_transfer_buffer,
+                               N_("Transfer buffer size"),N_("size")),
                CMDLINE_POPT_AUTOHELP
                POPT_TABLEEND
                };
@@ -60,10 +65,26 @@ CaptiveFileObject *captive_file_object;
 const gchar *sourcefile,*targetfile;
 guint perm=0644;
 int fdtgt;
-guint8 transfer_buffer[TRANSFER_BUFFER_SIZE];
+guint8 *transfer_buffer;
+long transfer_buffer_size=DEFAULT_TRANSFER_BUFFER_SIZE;
 
        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_GET_ERROR,CMDLINE_CMD_GET_ERROR_PARSING_TRANSFER_BUFFER_SIZE,
+                                       _("Error parsing transfer buffer size: %s"),string);
+                       return;
+                       }
+               }
+
        sourcefile=cmdline_path_from_cwd(cmd_argv[0]);
        if (cmd_argv[1])
                targetfile=captive_strdup_alloca(cmdline_path_from_cwd(cmd_argv[1]));
@@ -101,6 +122,9 @@ char *s;
                goto err_close_fdtgt;
                }
 
+       transfer_buffer=g_malloc(transfer_buffer_size);
+       g_assert(transfer_buffer!=NULL);        /* Should not happen. */
+
        for (;;) {
 GnomeVFSFileSize bytes_read;
 GnomeVFSResult errvfsresult;
@@ -109,7 +133,7 @@ ssize_t gotssize;
                errvfsresult=captive_file_read(
                                captive_file_object,    /* captive_file_object */
                                transfer_buffer,        /* buffer */
-                               sizeof(transfer_buffer),        /* num_bytes */
+                               transfer_buffer_size,   /* num_bytes */
                                &bytes_read);   /* bytes_read_return */
                g_assert(errvfsresult==GNOME_VFS_OK || errvfsresult==GNOME_VFS_ERROR_EOF);
                g_assert((errvfsresult==GNOME_VFS_ERROR_EOF)==(bytes_read==0));
@@ -123,17 +147,19 @@ gboolean errbool;
                        err_cleanup(errp);
                        g_set_error(errp,CMDLINE_CMD_GET_ERROR,CMDLINE_CMD_GET_ERROR_READING_SOURCE_FILE,
                                        _("Error reading source guest-os file '%s': %s"),sourcefile,g_strerror(errno));
-                       goto err_unref_captive_file_object;
+                       goto err_free_transfer_buffer;
                        }
 
                if (bytes_read!=(GnomeVFSFileSize)(gotssize=write(fdtgt,transfer_buffer,bytes_read))) {
                        g_set_error(errp,CMDLINE_CMD_GET_ERROR,CMDLINE_CMD_GET_ERROR_WRITING_TARGET_HOSTOS_FILE,
                                        _("Error writing target host-os file: %s"),targetfile);
-                       goto err_unref_captive_file_object;
+                       goto err_free_transfer_buffer;
                        }
                }
 
-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_fdtgt:
        if (close(fdtgt)) {
index baa3d55..402320e 100644 (file)
@@ -33,7 +33,8 @@ typedef enum {
        CMDLINE_CMD_GET_ERROR_CANNOT_CREATE_TARGET_HOSTOS_FILE,
        CMDLINE_CMD_GET_ERROR_WRITING_TARGET_HOSTOS_FILE,
        CMDLINE_CMD_GET_ERROR_READING_SOURCE_FILE,
-       CMDLINE_CMD_GET_ERROR_CLOSING_TARGET_HOSTOS_FILE
+       CMDLINE_CMD_GET_ERROR_CLOSING_TARGET_HOSTOS_FILE,
+       CMDLINE_CMD_GET_ERROR_PARSING_TRANSFER_BUFFER_SIZE
        } CmdlineCmdGetError;