s3-libsmb: introduce new cli_query_secdesc() which returns NTSTATUS
authorBjörn Baumbach <bb@sernet.de>
Fri, 22 Jul 2011 13:11:31 +0000 (15:11 +0200)
committerStefan Metzmacher <metze@samba.org>
Sat, 23 Jul 2011 07:18:57 +0000 (09:18 +0200)
Replacement for cli_query_secdesc_old()

Signed-off-by: Stefan Metzmacher <metze@samba.org>
source3/libsmb/clisecdesc.c
source3/libsmb/proto.h

index 71358e8612f51a4ebb043639bddf947429c3e3d1..1e95043c369d0723a56350f49b323b98d8973a18 100644 (file)
@@ -69,6 +69,56 @@ struct security_descriptor *cli_query_secdesc_old(struct cli_state *cli, uint16_
        return psd;
 }
 
+NTSTATUS cli_query_secdesc(struct cli_state *cli, uint16_t fnum,
+                          TALLOC_CTX *mem_ctx, struct security_descriptor **sd)
+{
+       uint8_t param[8];
+       uint8_t *rdata=NULL;
+       uint32_t rdata_count=0;
+       NTSTATUS status;
+       struct security_descriptor *lsd;
+
+       SIVAL(param, 0, fnum);
+       SIVAL(param, 4, 0x7);
+
+       status = cli_trans(talloc_tos(), cli, SMBnttrans,
+                          NULL, -1, /* name, fid */
+                          NT_TRANSACT_QUERY_SECURITY_DESC, 0, /* function, flags */
+                          NULL, 0, 0, /* setup, length, max */
+                          param, 8, 4, /* param, length, max */
+                          NULL, 0, 0x10000, /* data, length, max */
+                          NULL,             /* recv_flags2 */
+                          NULL, 0, NULL, /* rsetup, length */
+                          NULL, 0, NULL,
+                          &rdata, 0, &rdata_count);
+
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(1, ("NT_TRANSACT_QUERY_SECURITY_DESC failed: %s\n",
+                         nt_errstr(status)));
+               goto cleanup;
+       }
+
+       status = unmarshall_sec_desc(mem_ctx, (uint8 *)rdata, rdata_count,
+                                    &lsd);
+       if (!NT_STATUS_IS_OK(status)) {
+               DEBUG(10, ("unmarshall_sec_desc failed: %s\n",
+                          nt_errstr(status)));
+               goto cleanup;
+       }
+
+       if (sd != NULL) {
+               *sd = lsd;
+       } else {
+               TALLOC_FREE(lsd);
+       }
+
+ cleanup:
+
+       TALLOC_FREE(rdata);
+
+       return status;
+}
+
 /****************************************************************************
   set the security descriptor for a open file
  ****************************************************************************/
index 7b2dc8c5831f4d52b0d58dc84b2bf58fe4ef91bb..195bc75d141dbc5db351bce0af5b3c2adccdada1 100644 (file)
@@ -787,6 +787,8 @@ NTSTATUS cli_push(struct cli_state *cli, uint16_t fnum, uint16_t mode,
 
 struct security_descriptor *cli_query_secdesc_old(struct cli_state *cli, uint16_t fnum,
                            TALLOC_CTX *mem_ctx);
+NTSTATUS cli_query_secdesc(struct cli_state *cli, uint16_t fnum,
+                         TALLOC_CTX *mem_ctx, struct security_descriptor **sd);
 NTSTATUS cli_set_secdesc(struct cli_state *cli, uint16_t fnum,
                         struct security_descriptor *sd);