]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libsmb: Convert cli_qfileinfo to use FSCC levels
authorVolker Lendecke <vl@samba.org>
Thu, 9 May 2024 08:12:14 +0000 (10:12 +0200)
committerJeremy Allison <jra@samba.org>
Tue, 14 May 2024 22:29:36 +0000 (22:29 +0000)
This will enable this routine to be used for SMB2 as well. The
translation table is from [MS-CIFS] 2.2.8.

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/libsmb/clifile.c
source3/libsmb/clirap.c
source3/libsmb/clirap.h
source3/torture/torture.c

index 1ff3973bb39b1ce1fed0d2d0166fb79d0616827f..431b8a769bdbc3a7470c3eb5961b9b9a1d92d07f 100644 (file)
@@ -6965,20 +6965,55 @@ static void cli_qfileinfo_done(struct tevent_req *subreq);
 
 struct tevent_req *cli_qfileinfo_send(TALLOC_CTX *mem_ctx,
                                      struct tevent_context *ev,
-                                     struct cli_state *cli, uint16_t fnum,
-                                     uint16_t level, uint32_t min_rdata,
+                                     struct cli_state *cli,
+                                     uint16_t fnum,
+                                     uint16_t fscc_level,
+                                     uint32_t min_rdata,
                                      uint32_t max_rdata)
 {
        struct tevent_req *req, *subreq;
        struct cli_qfileinfo_state *state;
+       uint16_t smb_level;
 
        req = tevent_req_create(mem_ctx, &state, struct cli_qfileinfo_state);
        if (req == NULL) {
                return NULL;
        }
+
+       switch (fscc_level) {
+       case FSCC_FILE_BASIC_INFORMATION:
+               smb_level = SMB_QUERY_FILE_BASIC_INFO;
+               break;
+       case FSCC_FILE_STANDARD_INFORMATION:
+               smb_level = SMB_QUERY_FILE_STANDARD_INFO;
+               break;
+       case FSCC_FILE_EA_INFORMATION:
+               smb_level = SMB_QUERY_FILE_EA_INFO;
+               break;
+       case FSCC_FILE_NAME_INFORMATION:
+               smb_level = SMB_QUERY_FILE_NAME_INFO;
+               break;
+       case FSCC_FILE_ALL_INFORMATION:
+               smb_level = SMB_QUERY_FILE_ALL_INFO;
+               break;
+       case FSCC_FILE_ALTERNATE_NAME_INFORMATION:
+               smb_level = SMB_QUERY_FILE_ALT_NAME_INFO;
+               break;
+       case FSCC_FILE_STREAM_INFORMATION:
+               smb_level = SMB_QUERY_FILE_STREAM_INFO;
+               break;
+       case FSCC_FILE_COMPRESSION_INFORMATION:
+               smb_level = SMB_QUERY_COMPRESSION_INFO;
+               break;
+       default:
+               /* Probably wrong, but the server will tell us */
+               smb_level = fscc_level;
+               break;
+       }
+
        state->min_rdata = min_rdata;
        SSVAL(state->param, 0, fnum);
-       SSVAL(state->param, 2, level);
+       SSVAL(state->param, 2, smb_level);
        SSVAL(state->setup, 0, TRANSACT2_QFILEINFO);
 
        subreq = cli_trans_send(
@@ -7054,10 +7089,15 @@ NTSTATUS cli_qfileinfo_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
        return NT_STATUS_OK;
 }
 
-NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
-                      uint16_t fnum, uint16_t level, uint32_t min_rdata,
-                      uint32_t max_rdata, uint16_t *recv_flags2,
-                      uint8_t **rdata, uint32_t *num_rdata)
+NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx,
+                      struct cli_state *cli,
+                      uint16_t fnum,
+                      uint16_t fscc_level,
+                      uint32_t min_rdata,
+                      uint32_t max_rdata,
+                      uint16_t *recv_flags2,
+                      uint8_t **rdata,
+                      uint32_t *num_rdata)
 {
        TALLOC_CTX *frame = talloc_stackframe();
        struct tevent_context *ev;
@@ -7075,8 +7115,8 @@ NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
        if (ev == NULL) {
                goto fail;
        }
-       req = cli_qfileinfo_send(frame, ev, cli, fnum, level, min_rdata,
-                                max_rdata);
+       req = cli_qfileinfo_send(
+               frame, ev, cli, fnum, fscc_level, min_rdata, max_rdata);
        if (req == NULL) {
                goto fail;
        }
index 24fd733d548a279225b6037154aa86feda04bc4a..082a20d40fd4e15066b0dd2c5b3d537b88a65df9 100644 (file)
@@ -1369,14 +1369,13 @@ struct tevent_req *cli_qfileinfo_basic_send(
                return req;
        }
 
-       subreq = cli_qfileinfo_send(
-               state,
-               ev,
-               cli,
-               fnum,
-               SMB_QUERY_FILE_ALL_INFO, /* level */
-               68,                      /* min_rdata */
-               CLI_BUFFER_SIZE);        /* max_rdata */
+       subreq = cli_qfileinfo_send(state,
+                                   ev,
+                                   cli,
+                                   fnum,
+                                   FSCC_FILE_ALL_INFORMATION, /* level */
+                                   68,                        /* min_rdata */
+                                   CLI_BUFFER_SIZE);          /* max_rdata */
        if (tevent_req_nomem(subreq, req)) {
                return tevent_req_post(req, ev);
        }
index 4dc0441cc5bb786aaf8f6ed0729edf3182a22218..5181ef222906f5c8821c50e1ea485a42095974db 100644 (file)
@@ -162,16 +162,23 @@ NTSTATUS cli_qpathinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
 
 struct tevent_req *cli_qfileinfo_send(TALLOC_CTX *mem_ctx,
                                      struct tevent_context *ev,
-                                     struct cli_state *cli, uint16_t fnum,
-                                     uint16_t level, uint32_t min_rdata,
+                                     struct cli_state *cli,
+                                     uint16_t fnum,
+                                     uint16_t fscc_level,
+                                     uint32_t min_rdata,
                                      uint32_t max_rdata);
 NTSTATUS cli_qfileinfo_recv(struct tevent_req *req, TALLOC_CTX *mem_ctx,
                            uint16_t *recv_flags2,
                            uint8_t **rdata, uint32_t *num_rdata);
-NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx, struct cli_state *cli,
-                      uint16_t fnum, uint16_t level, uint32_t min_rdata,
-                      uint32_t max_rdata, uint16_t *recv_flags2,
-                      uint8_t **rdata, uint32_t *num_rdata);
+NTSTATUS cli_qfileinfo(TALLOC_CTX *mem_ctx,
+                      struct cli_state *cli,
+                      uint16_t fnum,
+                      uint16_t fscc_level,
+                      uint32_t min_rdata,
+                      uint32_t max_rdata,
+                      uint16_t *recv_flags2,
+                      uint8_t **rdata,
+                      uint32_t *num_rdata);
 
 struct tevent_req *cli_flush_send(TALLOC_CTX *mem_ctx,
                                  struct tevent_context *ev,
index 6476ae5c6e7631f225da0fb557806ac1b7526d83..e0cc39f732dd009713fb205e9643a2a77d70e4eb 100644 (file)
@@ -4411,10 +4411,15 @@ static NTSTATUS cli_qfilename(
        char *name = NULL;
        uint32_t namelen;
 
-       status = cli_qfileinfo(talloc_tos(), cli, fnum,
-                              SMB_QUERY_FILE_NAME_INFO,
-                              4, CLI_BUFFER_SIZE, &recv_flags2,
-                              &rdata, &num_rdata);
+       status = cli_qfileinfo(talloc_tos(),
+                              cli,
+                              fnum,
+                              FSCC_FILE_NAME_INFORMATION,
+                              4,
+                              CLI_BUFFER_SIZE,
+                              &recv_flags2,
+                              &rdata,
+                              &num_rdata);
        if (!NT_STATUS_IS_OK(status)) {
                return status;
        }