[SCM] Samba Shared Repository - branch master updated
Volker Lendecke
vlendec at samba.org
Sun Jul 25 14:30:24 MDT 2010
The branch, master has been updated
via 334d5bf... s3: Convert cli_get_ea_list_path to cli_qpathinfo_send
via 5380f67... s3: Factor out parse_ea_blob
via d5e285a... s3: Convert cli_posix_stat to cli_qpathinfo_send
via 786e4cd... s3: Convert cli_posix_getfacl to cli_qpathinfo_send
via cb9baa7... s3: Convert cli_posix_readlink to cli_qpathinfo_send
via 535774d... s3: Add async cli_qpathinfo
via ce3dfd7... s3: cli_qpathinfo->cli_qpathinfo1
from b04eba1... s3: Fix cli_posix_stat
http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master
- Log -----------------------------------------------------------------
commit 334d5bfe30188a42af758db3f6a3551dd074900a
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 25 21:32:13 2010 +0200
s3: Convert cli_get_ea_list_path to cli_qpathinfo_send
commit 5380f67730154d872ad21a3d9908cfc2bb91edbd
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 25 19:42:22 2010 +0200
s3: Factor out parse_ea_blob
commit d5e285abae34339f6eabc54a17049dcc5b56a6b0
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 25 17:49:20 2010 +0200
s3: Convert cli_posix_stat to cli_qpathinfo_send
commit 786e4cd0980f0562b28ac74612a72faa4e2050cc
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 25 17:46:01 2010 +0200
s3: Convert cli_posix_getfacl to cli_qpathinfo_send
commit cb9baa7c2c6edafd835bc6e36a385b0d00f5277e
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 25 17:37:16 2010 +0200
s3: Convert cli_posix_readlink to cli_qpathinfo_send
commit 535774d88068052accedb21b626fd97a79502c0e
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 25 17:26:43 2010 +0200
s3: Add async cli_qpathinfo
commit ce3dfd777f8f2da4cb08f6c91a465e647b84a8f1
Author: Volker Lendecke <vl at samba.org>
Date: Sun Jul 25 13:19:34 2010 +0200
s3: cli_qpathinfo->cli_qpathinfo1
-----------------------------------------------------------------------
Summary of changes:
source3/include/proto.h | 21 ++-
source3/libsmb/clifile.c | 566 +++++++++++++++++++++++++++------------------
source3/libsmb/clirap.c | 2 +-
source3/torture/nbio.c | 2 +-
source3/torture/torture.c | 19 +-
5 files changed, 376 insertions(+), 234 deletions(-)
Changeset truncated at 500 lines:
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 75e4aaf..3759a78 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -2466,7 +2466,13 @@ NTSTATUS cli_ctemp(struct cli_state *cli,
NTSTATUS cli_raw_ioctl(struct cli_state *cli, uint16_t fnum, uint32_t code, DATA_BLOB *blob);
bool cli_set_ea_path(struct cli_state *cli, const char *path, const char *ea_name, const char *ea_val, size_t ea_len);
bool cli_set_ea_fnum(struct cli_state *cli, uint16_t fnum, const char *ea_name, const char *ea_val, size_t ea_len);
-bool cli_get_ea_list_path(struct cli_state *cli, const char *path,
+struct tevent_req *cli_get_ea_list_path_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli,
+ const char *fname);
+NTSTATUS cli_get_ea_list_path_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ size_t *pnum_eas, struct ea_struct **peas);
+NTSTATUS cli_get_ea_list_path(struct cli_state *cli, const char *path,
TALLOC_CTX *ctx,
size_t *pnum_eas,
struct ea_struct **pea_list);
@@ -2636,7 +2642,7 @@ bool cli_NetServerEnum(struct cli_state *cli, char *workgroup, uint32 stype,
void *state);
bool cli_oem_change_password(struct cli_state *cli, const char *user, const char *new_password,
const char *old_password);
-bool cli_qpathinfo(struct cli_state *cli,
+bool cli_qpathinfo1(struct cli_state *cli,
const char *fname,
time_t *change_time,
time_t *access_time,
@@ -2672,6 +2678,17 @@ NTSTATUS cli_qpathinfo_basic(struct cli_state *cli, const char *name,
SMB_STRUCT_STAT *sbuf, uint32 *attributes);
bool cli_qfileinfo_test(struct cli_state *cli, uint16_t fnum, int level, char **poutdata, uint32 *poutlen);
NTSTATUS cli_qpathinfo_alt_name(struct cli_state *cli, const char *fname, fstring alt_name);
+struct tevent_req *cli_qpathinfo_send(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct cli_state *cli, const char *fname,
+ uint16_t level, uint32_t min_rdata,
+ uint32_t max_rdata);
+NTSTATUS cli_qpathinfo_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
+ uint8_t **rdata, uint32_t *num_rdata);
+NTSTATUS cli_qpathinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
+ const char *fname, uint16_t level, uint32_t min_rdata,
+ uint32_t max_rdata,
+ uint8_t **rdata, uint32_t *num_rdata);
/* The following definitions come from libsmb/clirap2.c */
struct rap_group_info_1;
diff --git a/source3/libsmb/clifile.c b/source3/libsmb/clifile.c
index de2d185..3198123 100644
--- a/source3/libsmb/clifile.c
+++ b/source3/libsmb/clifile.c
@@ -273,30 +273,7 @@ struct readlink_state {
uint32_t num_data;
};
-static void cli_posix_readlink_done(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct readlink_state *state = tevent_req_data(req, struct readlink_state);
- NTSTATUS status;
-
- status = cli_trans_recv(subreq, state, NULL, 0, NULL, NULL, 0, NULL,
- &state->data, 0, &state->num_data);
- TALLOC_FREE(subreq);
- if (!NT_STATUS_IS_OK(status)) {
- tevent_req_nterror(req, status);
- return;
- }
- if (state->num_data == 0) {
- tevent_req_nterror(req, NT_STATUS_DATA_ERROR);
- return;
- }
- if (state->data[state->num_data-1] != '\0') {
- tevent_req_nterror(req, NT_STATUS_DATA_ERROR);
- return;
- }
- tevent_req_done(req);
-}
+static void cli_posix_readlink_done(struct tevent_req *subreq);
struct tevent_req *cli_posix_readlink_send(TALLOC_CTX *mem_ctx,
struct event_context *ev,
@@ -308,51 +285,21 @@ struct tevent_req *cli_posix_readlink_send(TALLOC_CTX *mem_ctx,
struct readlink_state *state = NULL;
uint32_t maxbytelen = (uint32_t)(cli_ucs2(cli) ? len*3 : len);
- if (maxbytelen < len) {
- return NULL;
- }
-
req = tevent_req_create(mem_ctx, &state, struct readlink_state);
if (req == NULL) {
return NULL;
}
- /* Setup setup word. */
- SSVAL(&state->setup, 0, TRANSACT2_QPATHINFO);
-
- /* Setup param array. */
- state->param = talloc_array(state, uint8_t, 6);
- if (tevent_req_nomem(state->param, req)) {
- return tevent_req_post(req, ev);
- }
- memset(state->param, '\0', 6);
- SSVAL(state->param,0,SMB_QUERY_FILE_UNIX_LINK);
-
- state->param = trans2_bytes_push_str(state->param, cli_ucs2(cli), fname,
- strlen(fname)+1, NULL);
-
- if (tevent_req_nomem(state->param, req)) {
+ /*
+ * Len is in bytes, we need it in UCS2 units.
+ */
+ if ((2*len < len) || (maxbytelen < len)) {
+ tevent_req_nterror(req, NT_STATUS_INVALID_PARAMETER);
return tevent_req_post(req, ev);
}
- subreq = cli_trans_send(state, /* mem ctx. */
- ev, /* event ctx. */
- cli, /* cli_state. */
- SMBtrans2, /* cmd. */
- NULL, /* pipe name. */
- -1, /* fid. */
- 0, /* function. */
- 0, /* flags. */
- &state->setup, /* setup. */
- 1, /* num setup uint16_t words. */
- 0, /* max returned setup. */
- state->param, /* param. */
- talloc_get_size(state->param), /* num param. */
- 2, /* max returned param. */
- NULL, /* data. */
- 0, /* num data. */
- maxbytelen); /* max returned data. */
-
+ subreq = cli_qpathinfo_send(state, ev, cli, fname,
+ SMB_QUERY_FILE_UNIX_LINK, 1, maxbytelen);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
@@ -360,6 +307,31 @@ struct tevent_req *cli_posix_readlink_send(TALLOC_CTX *mem_ctx,
return req;
}
+static void cli_posix_readlink_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct readlink_state *state = tevent_req_data(
+ req, struct readlink_state);
+ NTSTATUS status;
+
+ status = cli_qpathinfo_recv(subreq, state, &state->data,
+ &state->num_data);
+ TALLOC_FREE(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return;
+ }
+ /*
+ * num_data is > 1, we've given 1 as minimum to cli_qpathinfo_send
+ */
+ if (state->data[state->num_data-1] != '\0') {
+ tevent_req_nterror(req, NT_STATUS_DATA_ERROR);
+ return;
+ }
+ tevent_req_done(req);
+}
+
NTSTATUS cli_posix_readlink_recv(struct tevent_req *req, struct cli_state *cli,
char *retpath, size_t len)
{
@@ -413,12 +385,6 @@ NTSTATUS cli_posix_readlink(struct cli_state *cli, const char *fname,
goto fail;
}
- /* Len is in bytes, we need it in UCS2 units. */
- if (2*len < len) {
- status = NT_STATUS_INVALID_PARAMETER;
- goto fail;
- }
-
req = cli_posix_readlink_send(frame,
ev,
cli,
@@ -621,22 +587,7 @@ struct getfacl_state {
uint8_t *data;
};
-static void cli_posix_getfacl_done(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct getfacl_state *state = tevent_req_data(req, struct getfacl_state);
- NTSTATUS status;
-
- status = cli_trans_recv(subreq, state, NULL, 0, NULL, NULL, 0, NULL,
- &state->data, 0, &state->num_data);
- TALLOC_FREE(subreq);
- if (!NT_STATUS_IS_OK(status)) {
- tevent_req_nterror(req, status);
- return;
- }
- tevent_req_done(req);
-}
+static void cli_posix_getfacl_done(struct tevent_req *subreq);
struct tevent_req *cli_posix_getfacl_send(TALLOC_CTX *mem_ctx,
struct event_context *ev,
@@ -650,43 +601,8 @@ struct tevent_req *cli_posix_getfacl_send(TALLOC_CTX *mem_ctx,
if (req == NULL) {
return NULL;
}
-
- /* Setup setup word. */
- SSVAL(&state->setup, 0, TRANSACT2_QPATHINFO);
-
- /* Setup param array. */
- state->param = talloc_array(state, uint8_t, 6);
- if (tevent_req_nomem(state->param, req)) {
- return tevent_req_post(req, ev);
- }
- memset(state->param, '\0', 6);
- SSVAL(state->param, 0, SMB_QUERY_POSIX_ACL);
-
- state->param = trans2_bytes_push_str(state->param, cli_ucs2(cli), fname,
- strlen(fname)+1, NULL);
-
- if (tevent_req_nomem(state->param, req)) {
- return tevent_req_post(req, ev);
- }
-
- subreq = cli_trans_send(state, /* mem ctx. */
- ev, /* event ctx. */
- cli, /* cli_state. */
- SMBtrans2, /* cmd. */
- NULL, /* pipe name. */
- -1, /* fid. */
- 0, /* function. */
- 0, /* flags. */
- &state->setup, /* setup. */
- 1, /* num setup uint16_t words. */
- 0, /* max returned setup. */
- state->param, /* param. */
- talloc_get_size(state->param), /* num param. */
- 2, /* max returned param. */
- NULL, /* data. */
- 0, /* num data. */
- cli->max_xmit); /* max returned data. */
-
+ subreq = cli_qpathinfo_send(state, ev, cli, fname, SMB_QUERY_POSIX_ACL,
+ 0, cli->max_xmit);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
@@ -694,6 +610,24 @@ struct tevent_req *cli_posix_getfacl_send(TALLOC_CTX *mem_ctx,
return req;
}
+static void cli_posix_getfacl_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct getfacl_state *state = tevent_req_data(
+ req, struct getfacl_state);
+ NTSTATUS status;
+
+ status = cli_qpathinfo_recv(subreq, state, &state->data,
+ &state->num_data);
+ TALLOC_FREE(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return;
+ }
+ tevent_req_done(req);
+}
+
NTSTATUS cli_posix_getfacl_recv(struct tevent_req *req,
TALLOC_CTX *mem_ctx,
size_t *prb_size,
@@ -770,22 +704,7 @@ struct stat_state {
uint8_t *data;
};
-static void cli_posix_stat_done(struct tevent_req *subreq)
-{
- struct tevent_req *req = tevent_req_callback_data(
- subreq, struct tevent_req);
- struct stat_state *state = tevent_req_data(req, struct stat_state);
- NTSTATUS status;
-
- status = cli_trans_recv(subreq, state, NULL, 0, NULL, NULL, 0, NULL,
- &state->data, 100, &state->num_data);
- TALLOC_FREE(subreq);
- if (!NT_STATUS_IS_OK(status)) {
- tevent_req_nterror(req, status);
- return;
- }
- tevent_req_done(req);
-}
+static void cli_posix_stat_done(struct tevent_req *subreq);
struct tevent_req *cli_posix_stat_send(TALLOC_CTX *mem_ctx,
struct event_context *ev,
@@ -799,43 +718,8 @@ struct tevent_req *cli_posix_stat_send(TALLOC_CTX *mem_ctx,
if (req == NULL) {
return NULL;
}
-
- /* Setup setup word. */
- SSVAL(&state->setup, 0, TRANSACT2_QPATHINFO);
-
- /* Setup param array. */
- state->param = talloc_array(state, uint8_t, 6);
- if (tevent_req_nomem(state->param, req)) {
- return tevent_req_post(req, ev);
- }
- memset(state->param, '\0', 6);
- SSVAL(state->param, 0, SMB_QUERY_FILE_UNIX_BASIC);
-
- state->param = trans2_bytes_push_str(state->param, cli_ucs2(cli), fname,
- strlen(fname)+1, NULL);
-
- if (tevent_req_nomem(state->param, req)) {
- return tevent_req_post(req, ev);
- }
-
- subreq = cli_trans_send(state, /* mem ctx. */
- ev, /* event ctx. */
- cli, /* cli_state. */
- SMBtrans2, /* cmd. */
- NULL, /* pipe name. */
- -1, /* fid. */
- 0, /* function. */
- 0, /* flags. */
- &state->setup, /* setup. */
- 1, /* num setup uint16_t words. */
- 0, /* max returned setup. */
- state->param, /* param. */
- talloc_get_size(state->param), /* num param. */
- 2, /* max returned param. */
- NULL, /* data. */
- 0, /* num data. */
- 100); /* max returned data. */
-
+ subreq = cli_qpathinfo_send(state, ev, cli, fname,
+ SMB_QUERY_FILE_UNIX_BASIC, 100, 100);
if (tevent_req_nomem(subreq, req)) {
return tevent_req_post(req, ev);
}
@@ -843,6 +727,23 @@ struct tevent_req *cli_posix_stat_send(TALLOC_CTX *mem_ctx,
return req;
}
+static void cli_posix_stat_done(struct tevent_req *subreq)
+{
+ struct tevent_req *req = tevent_req_callback_data(
+ subreq, struct tevent_req);
+ struct stat_state *state = tevent_req_data(req, struct stat_state);
+ NTSTATUS status;
+
+ status = cli_qpathinfo_recv(subreq, state, &state->data,
+ &state->num_data);
+ TALLOC_FREE(subreq);
+ if (!NT_STATUS_IS_OK(status)) {
+ tevent_req_nterror(req, status);
+ return;
+ }
+ tevent_req_done(req);
+}
+
NTSTATUS cli_posix_stat_recv(struct tevent_req *req,
SMB_STRUCT_STAT *sbuf)
{
@@ -853,10 +754,6 @@ NTSTATUS cli_posix_stat_recv(struct tevent_req *req,
return status;
}
- if (state->num_data != 100) {
- return NT_STATUS_DATA_ERROR;
- }
-
sbuf->st_ex_size = IVAL2_TO_SMB_BIG_UINT(state->data,0); /* total size, in bytes */
sbuf->st_ex_blocks = IVAL2_TO_SMB_BIG_UINT(state->data,8); /* number of blocks allocated */
#if defined (HAVE_STAT_ST_BLOCKS) && defined(STAT_ST_BLOCKSIZE)
@@ -4291,6 +4188,10 @@ bool cli_set_ea_fnum(struct cli_state *cli, uint16_t fnum, const char *ea_name,
Get an extended attribute list utility fn.
*********************************************************/
+static bool parse_ea_blob(TALLOC_CTX *mem_ctx, const uint8_t *rdata,
+ size_t rdata_len,
+ size_t *pnum_eas, struct ea_struct **pea_list);
+
static bool cli_get_ea_list(struct cli_state *cli,
uint16_t setup, char *param, unsigned int param_len,
TALLOC_CTX *ctx,
@@ -4300,11 +4201,7 @@ static bool cli_get_ea_list(struct cli_state *cli,
unsigned int data_len = 0;
unsigned int rparam_len, rdata_len;
char *rparam=NULL, *rdata=NULL;
- char *p;
- size_t ea_size;
- size_t num_eas;
bool ret = False;
- struct ea_struct *ea_list;
*pnum_eas = 0;
if (pea_list) {
@@ -4327,19 +4224,35 @@ static bool cli_get_ea_list(struct cli_state *cli,
return False;
}
- if (!rdata || rdata_len < 4) {
- goto out;
+ ret = parse_ea_blob(ctx, (uint8_t *)rdata, rdata_len, pnum_eas,
+ pea_list);
+ SAFE_FREE(rparam);
+ SAFE_FREE(rdata);
+ return ret;
+}
+
+static bool parse_ea_blob(TALLOC_CTX *ctx, const uint8_t *rdata,
+ size_t rdata_len,
+ size_t *pnum_eas, struct ea_struct **pea_list)
+{
+ struct ea_struct *ea_list = NULL;
+ size_t num_eas;
+ size_t ea_size;
+ const uint8_t *p;
+
+ if (rdata_len < 4) {
+ return false;
}
ea_size = (size_t)IVAL(rdata,0);
if (ea_size > rdata_len) {
- goto out;
+ return false;
}
if (ea_size == 0) {
/* No EA's present. */
- ret = True;
- goto out;
+ *pnum_eas = 0;
+ return true;
}
p = rdata + 4;
@@ -4350,30 +4263,29 @@ static bool cli_get_ea_list(struct cli_state *cli,
unsigned int ea_namelen = CVAL(p,1);
unsigned int ea_valuelen = SVAL(p,2);
if (ea_namelen == 0) {
- goto out;
+ return false;
}
if (4 + ea_namelen + 1 + ea_valuelen > ea_size) {
- goto out;
+ return false;
}
ea_size -= 4 + ea_namelen + 1 + ea_valuelen;
p += 4 + ea_namelen + 1 + ea_valuelen;
}
if (num_eas == 0) {
- ret = True;
- goto out;
+ *pnum_eas = 0;
+ return true;
}
*pnum_eas = num_eas;
if (!pea_list) {
/* Caller only wants number of EA's. */
- ret = True;
- goto out;
+ return true;
}
ea_list = TALLOC_ARRAY(ctx, struct ea_struct, num_eas);
if (!ea_list) {
- goto out;
+ return false;
}
ea_size = (size_t)IVAL(rdata,0);
@@ -4388,11 +4300,14 @@ static bool cli_get_ea_list(struct cli_state *cli,
ea->flags = CVAL(p,0);
unix_ea_name[0] = '\0';
pull_ascii_fstring(unix_ea_name, p + 4);
- ea->name = talloc_strdup(ctx, unix_ea_name);
+ ea->name = talloc_strdup(ea_list, unix_ea_name);
+ if (!ea->name) {
+ goto fail;
+ }
/* Ensure the value is null terminated (in case it's a string). */
- ea->value = data_blob_talloc(ctx, NULL, ea_valuelen + 1);
+ ea->value = data_blob_talloc(ea_list, NULL, ea_valuelen + 1);
if (!ea->value.data) {
--
Samba Shared Repository
More information about the samba-cvs
mailing list