s3: Use cli_setpathinfo in cli_posix_chown_chmod_internal
authorVolker Lendecke <vl@samba.org>
Sun, 24 Oct 2010 16:05:03 +0000 (18:05 +0200)
committerVolker Lendecke <vlendec@samba.org>
Sun, 24 Oct 2010 20:46:28 +0000 (20:46 +0000)
source3/libsmb/clifile.c

index a266e2ab224be446798fab3edb1c1aac5ebab6a4..a0fa7e2870ca21245a558cd3350f678f1c5a4daf 100644 (file)
@@ -884,18 +884,11 @@ NTSTATUS cli_posix_stat(struct cli_state *cli,
  Chmod or chown a file internal (UNIX extensions).
 ****************************************************************************/
 
-struct ch_state {
-       uint16_t setup;
-       uint8_t *param;
-       uint8_t *data;
+struct cli_posix_chown_chmod_internal_state {
+       uint8_t data[100];
 };
 
-static void cli_posix_chown_chmod_internal_done(struct tevent_req *subreq)
-{
-       NTSTATUS status = cli_trans_recv(subreq, NULL, NULL, NULL, 0, NULL,
-                                        NULL, 0, NULL, NULL, 0, NULL);
-       tevent_req_simple_finish_ntstatus(subreq, status);
-}
+static void cli_posix_chown_chmod_internal_done(struct tevent_req *subreq);
 
 static struct tevent_req *cli_posix_chown_chmod_internal_send(TALLOC_CTX *mem_ctx,
                                        struct event_context *ev,
@@ -906,67 +899,36 @@ static struct tevent_req *cli_posix_chown_chmod_internal_send(TALLOC_CTX *mem_ct
                                        uint32_t gid)
 {
        struct tevent_req *req = NULL, *subreq = NULL;
-       struct ch_state *state = NULL;
+       struct cli_posix_chown_chmod_internal_state *state = NULL;
 
-       req = tevent_req_create(mem_ctx, &state, struct ch_state);
+       req = tevent_req_create(mem_ctx, &state,
+                               struct cli_posix_chown_chmod_internal_state);
        if (req == NULL) {
                return NULL;
        }
 
-       /* Setup setup word. */
-       SSVAL(&state->setup, 0, TRANSACT2_SETPATHINFO);
-
-       /* 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_SET_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);
-       }
-
-       /* Setup data array. */
-       state->data = talloc_array(state, uint8_t, 100);
-       if (tevent_req_nomem(state->data, req)) {
-               return tevent_req_post(req, ev);
-       }
        memset(state->data, 0xff, 40); /* Set all sizes/times to no change. */
        memset(&state->data[40], '\0', 60);
        SIVAL(state->data,40,uid);
        SIVAL(state->data,48,gid);
        SIVAL(state->data,84,mode);
 
-       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. */
-                               state->data,            /* data. */
-                               talloc_get_size(state->data),   /* num data. */
-                               0);                     /* max returned data. */
-
+       subreq = cli_setpathinfo_send(state, ev, cli, SMB_SET_FILE_UNIX_BASIC,
+                                     fname, state->data, sizeof(state->data));
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
        }
-       tevent_req_set_callback(subreq, cli_posix_chown_chmod_internal_done, req);
+       tevent_req_set_callback(subreq, cli_posix_chown_chmod_internal_done,
+                               req);
        return req;
 }
 
+static void cli_posix_chown_chmod_internal_done(struct tevent_req *subreq)
+{
+       NTSTATUS status = cli_setpathinfo_recv(subreq);
+       tevent_req_simple_finish_ntstatus(subreq, status);
+}
+
 /****************************************************************************
  chmod a file (UNIX extensions).
 ****************************************************************************/