[PATCH] New smbclient commands "pread" and "pwrite"
Jeremy Allison
jra at samba.org
Wed Jan 11 01:01:10 UTC 2017
On Sun, Jan 08, 2017 at 10:13:55AM +0100, Ralph Böhme wrote:
> Hi!
>
> I found these handy when I had the need to trigger delayed write time entries in
> locking.tdb. Not sure if this is generally useful.
Hmmmm. Can't see a generic use for this inside smbclient.
Nice patch though, can you think of a use-case apart
from internal testing ?
Jeremy.
> From 2cfe14266ee2753344416c8e586503a8cb76bac8 Mon Sep 17 00:00:00 2001
> From: Ralph Boehme <slow at samba.org>
> Date: Fri, 23 Dec 2016 09:22:28 +0100
> Subject: [PATCH 1/2] s3/client: add pwrite
>
> Signed-off-by: Ralph Boehme <slow at samba.org>
> ---
> docs-xml/manpages/smbclient.1.xml | 6 +++++
> source3/client/client.c | 47 +++++++++++++++++++++++++++++++++++++++
> 2 files changed, 53 insertions(+)
>
> diff --git a/docs-xml/manpages/smbclient.1.xml b/docs-xml/manpages/smbclient.1.xml
> index cc8c2b0..b9741d4 100644
> --- a/docs-xml/manpages/smbclient.1.xml
> +++ b/docs-xml/manpages/smbclient.1.xml
> @@ -958,6 +958,12 @@
> </varlistentry>
>
> <varlistentry>
> + <term>pwrite <fnum> <offset> <string></term>
> + <listitem><para>Write string at offset into the filehandle specified by fnum.
> + </para></listitem>
> + </varlistentry>
> +
> + <varlistentry>
> <term>queue</term>
> <listitem><para>Displays the print queue, showing the job id,
> name, size and current status. </para></listitem>
> diff --git a/source3/client/client.c b/source3/client/client.c
> index 226eb27..8a7384b 100644
> --- a/source3/client/client.c
> +++ b/source3/client/client.c
> @@ -2039,6 +2039,52 @@ static int cmd_put(void)
> return do_put(rname, lname, false);
> }
>
> +/****************************************************************************
> + Write into file handle at offset.
> +****************************************************************************/
> +
> +static int cmd_pwrite(void)
> +{
> + TALLOC_CTX *mem_ctx = talloc_tos();
> + char *fnum_str = NULL;
> + char *off_str = NULL;
> + char *data_str = NULL;
> + uint16_t fnum;
> + off_t off;
> + size_t nwritten;
> + NTSTATUS status;
> + bool ok;
> +
> + ok = next_token_talloc(mem_ctx, &cmd_ptr, &fnum_str, NULL);
> + if (!ok) {
> + d_printf("pwrite <fnum> <offset> <string>\n");
> + return 1;
> + }
> +
> + ok = next_token_talloc(mem_ctx, &cmd_ptr, &off_str, NULL);
> + if (!ok) {
> + d_printf("pwrite <fnum> <offset> <string>\n");
> + return 1;
> + }
> +
> + ok = next_token_talloc(mem_ctx, &cmd_ptr, &data_str, NULL);
> + if (!ok) {
> + d_printf("pwrite <fnum> <offset> <string>\n");
> + return 1;
> + }
> +
> + fnum = strtoul(fnum_str, NULL, 10);
> + off = strtoll(off_str, NULL, 10);
> +
> + status = cli_writeall(cli, fnum, 0, (uint8_t *)data_str, off, strlen(data_str), &nwritten);
> + if (!NT_STATUS_IS_OK(status)) {
> + d_fprintf(stderr, "cli_writeall returned %s\n", nt_errstr(status));
> + return 1;
> + }
> +
> + return 0;
> +}
> +
> /*************************************
> File list structure.
> *************************************/
> @@ -5025,6 +5071,7 @@ static struct {
> {"prompt",cmd_prompt,"toggle prompting for filenames for mget and mput",{COMPL_NONE,COMPL_NONE}},
> {"put",cmd_put,"<local name> [remote name] put a file",{COMPL_LOCAL,COMPL_REMOTE}},
> {"pwd",cmd_pwd,"show current remote directory (same as 'cd' with no args)",{COMPL_NONE,COMPL_NONE}},
> + {"pwrite",cmd_pwrite,"<fnum> <off> <string> write string at offset into fnum",{COMPL_NONE,COMPL_NONE}},
> {"q",cmd_quit,"logoff the server",{COMPL_NONE,COMPL_NONE}},
> {"queue",cmd_queue,"show the print queue",{COMPL_NONE,COMPL_NONE}},
> {"quit",cmd_quit,"logoff the server",{COMPL_NONE,COMPL_NONE}},
> --
> 2.7.4
>
>
> From d19aa4372df2e7492b4f857d18a07e265409ab53 Mon Sep 17 00:00:00 2001
> From: Ralph Boehme <slow at samba.org>
> Date: Fri, 23 Dec 2016 09:46:20 +0100
> Subject: [PATCH 2/2] s3/client: add pread
>
> Signed-off-by: Ralph Boehme <slow at samba.org>
> ---
> docs-xml/manpages/smbclient.1.xml | 6 ++++
> source3/client/client.c | 64 +++++++++++++++++++++++++++++++++++++++
> 2 files changed, 70 insertions(+)
>
> diff --git a/docs-xml/manpages/smbclient.1.xml b/docs-xml/manpages/smbclient.1.xml
> index b9741d4..e874dac 100644
> --- a/docs-xml/manpages/smbclient.1.xml
> +++ b/docs-xml/manpages/smbclient.1.xml
> @@ -932,6 +932,12 @@
> </varlistentry>
>
> <varlistentry>
> + <term>pread <fnum> <count> <offset></term>
> + <listitem><para>Read <count> bytes at <offset> from
> + filehandle specified by <fnum>.</para></listitem>
> + </varlistentry>
> +
> + <varlistentry>
> <term>print <file name></term>
> <listitem><para>Print the specified file from the local machine
> through a printable service on the server. </para></listitem>
> diff --git a/source3/client/client.c b/source3/client/client.c
> index 8a7384b..8bc5e01 100644
> --- a/source3/client/client.c
> +++ b/source3/client/client.c
> @@ -2040,6 +2040,69 @@ static int cmd_put(void)
> }
>
> /****************************************************************************
> + Read from file handle at offset.
> +****************************************************************************/
> +
> +static int cmd_pread(void)
> +{
> + TALLOC_CTX *mem_ctx = talloc_tos();
> + char *fnum_str = NULL;
> + char *count_str = NULL;
> + char *off_str = NULL;
> + char *buf = NULL;
> + uint16_t fnum;
> + size_t count;
> + off_t off;
> + size_t nread, i;
> + bool need_nl = false;
> + NTSTATUS status;
> + bool ok;
> +
> + ok = next_token_talloc(mem_ctx, &cmd_ptr, &fnum_str, NULL);
> + if (!ok) {
> + d_printf("pread <fnum> <count> <offset>\n");
> + return 1;
> + }
> +
> + ok = next_token_talloc(mem_ctx, &cmd_ptr, &count_str, NULL);
> + if (!ok) {
> + d_printf("pread <fnum> <count> <offset>\n");
> + return 1;
> + }
> +
> + ok = next_token_talloc(mem_ctx, &cmd_ptr, &off_str, NULL);
> + if (!ok) {
> + d_printf("pread <fnum> <count> <offset>\n");
> + return 1;
> + }
> +
> + fnum = strtoul(fnum_str, NULL, 10);
> + count = strtoull(count_str, NULL, 10);
> + off = strtoll(off_str, NULL, 10);
> +
> + buf = talloc_array(mem_ctx, char, count);
> +
> + status = cli_read(cli, fnum, buf, off, count, &nread);
> + if (!NT_STATUS_IS_OK(status)) {
> + d_fprintf(stderr, "cli_read returned %s\n", nt_errstr(status));
> + return 1;
> + }
> +
> + for (i = 0; i < nread; i++) {
> + if (isascii(buf[i])) {
> + need_nl = true;
> + d_printf("%c", buf[i]);
> + }
> + }
> +
> + if (need_nl) {
> + d_printf("\n");
> + }
> +
> + return 0;
> +}
> +
> +/****************************************************************************
> Write into file handle at offset.
> ****************************************************************************/
>
> @@ -5067,6 +5130,7 @@ static struct {
> {"posix_unlink",cmd_posix_unlink,"<name> removes a file using POSIX interface",{COMPL_REMOTE,COMPL_NONE}},
> {"posix_whoami",cmd_posix_whoami,"retun logged on user information "
> "using POSIX interface",{COMPL_REMOTE,COMPL_NONE}},
> + {"pread",cmd_pread,"<fnum> <count> <off> read count bytes at off from fnum",{COMPL_NONE,COMPL_NONE}},
> {"print",cmd_print,"<file name> print a file",{COMPL_NONE,COMPL_NONE}},
> {"prompt",cmd_prompt,"toggle prompting for filenames for mget and mput",{COMPL_NONE,COMPL_NONE}},
> {"put",cmd_put,"<local name> [remote name] put a file",{COMPL_LOCAL,COMPL_REMOTE}},
> --
> 2.7.4
>
More information about the samba-technical
mailing list