Bladeren bron

Basic read working :)

Julien 'Lta' BALLET 11 jaren geleden
bovenliggende
commit
204b47747e
6 gewijzigde bestanden met toevoegingen van 77 en 8 verwijderingen
  1. 7 0
      dsm.c
  2. 1 1
      include/bdsm/netbios_session.h
  3. 5 5
      include/bdsm/smb_defs.h
  4. 2 1
      include/bdsm/smb_file.h
  5. 1 0
      include/bdsm/smb_session.h
  6. 61 1
      src/smb_file.c

+ 7 - 0
dsm.c

@@ -124,6 +124,13 @@ int main(int ac, char **av)
     exit(42);
   }
 
+  char    data[512];
+
+  memset(data, 0, 512);
+  smb_fread(session, fd, data, 512);
+
+  fprintf(stderr, "Read from file:\n%s\n", data);
+
   smb_fclose(session, fd);
 
   smb_session_destroy(session);

+ 1 - 1
include/bdsm/netbios_session.h

@@ -33,7 +33,7 @@
 #define NETBIOS_SESSION_ERROR       -1
 #define NETBIOS_SESSION_REFUSED     -2
 
-#define NETBIOS_SESSION_BUFFER      2048
+#define NETBIOS_SESSION_BUFFER      8192
 #define NETBIOS_SESSION_PAYLOAD     NETBIOS_SESSION_BUFFER
 
 

+ 5 - 5
include/bdsm/smb_defs.h

@@ -298,11 +298,11 @@ typedef struct
   SMB_ANDX_MEMBERS
   uint16_t        fid;
   uint32_t        offset;
-  uint16_t        max_count_low;
+  uint16_t        max_count;
   uint16_t        min_count;
-  uint32_t        max_count_high;     // Continuation of max_count_low field
+  uint32_t        max_count_high;     // Continuation of max_count field
   uint16_t        remaining;
-  uint32_t        high_offset;
+  uint32_t        offset_high;        // Continuation of offset field'
   uint16_t        bct;                // 0
 } __attribute__((packed))   smb_read_req_t;
 
@@ -310,16 +310,16 @@ typedef struct
 {
   uint8_t         wct;                // 12
   SMB_ANDX_MEMBERS
-  uint16_t        fid;
   uint16_t        remaining;
   uint16_t        compact_mode;
   uint16_t        reserved;
-  uint16_t        data_len_low;
+  uint16_t        data_len;
   uint16_t        data_offset;
   uint32_t        data_len_high;
   uint32_t        reserved2;
   uint16_t        reserved3;
   uint16_t        bct;
+  uint8_t         padding;
   uint8_t         file[];
 } __attribute__((packed))   smb_read_resp_t;
 

+ 2 - 1
include/bdsm/smb_file.h

@@ -24,6 +24,7 @@
 smb_fd    smb_fopen(smb_session_t *s, smb_tid tid, const char *path,
                    uint32_t mod);
 void      smb_fclose(smb_session_t *s, smb_fd);
-ssize_t   smb_fread(smb_session_t *s, smb_fd fd, void *buf, size_t *buf_size);
+ssize_t   smb_fread(smb_session_t *s, smb_fd fd, void *buf, size_t buf_size);
+ssize_t   smb_fseek(smb_session_t *s, smb_fd fd, ssize_t offset, int whence);
 
 #endif

+ 1 - 0
include/bdsm/smb_session.h

@@ -55,6 +55,7 @@ typedef struct smb_file_s
   uint64_t            alloc_size;
   uint64_t            size;
   uint32_t            attr;
+  uint32_t            readp;          // Current read pointer (position);
 } smb_file_t;
 
 typedef struct smb_share_s

+ 61 - 1
src/smb_file.c

@@ -126,9 +126,69 @@ void        smb_fclose(smb_session_t *s, smb_fd fd)
   smb_session_recv_msg(s, 0);
 }
 
-ssize_t   smb_fread(smb_session_t *s, smb_fd fd, void *buf, size_t *buf_size)
+ssize_t   smb_fread(smb_session_t *s, smb_fd fd, void *buf, size_t buf_size)
 {
+  smb_file_t        *file;
   smb_message_t     *req_msg, resp_msg;
   smb_read_req_t    *req;
   smb_read_resp_t   *resp;
+  size_t            max_read;
+  int               res;
+
+  assert(s != NULL && buf != NULL && fd);
+  if ((file = smb_session_file_get(s, fd)) == NULL)
+    return (-1);
+
+  req_msg = smb_message_new(SMB_CMD_READ, 64);
+  req_msg->packet->header.tid = file->tid;
+  smb_message_set_default_flags(req_msg);
+  smb_message_set_andx_members(req_msg);
+  smb_message_advance(req_msg, sizeof(smb_read_req_t));
+
+  max_read = NETBIOS_SESSION_BUFFER - 256; // XXX
+  max_read = max_read < buf_size ? max_read : buf_size;
+
+  req = (smb_read_req_t *)req_msg->packet->payload;
+  req->wct              = 12;
+  req->fid              = file->fid;
+  req->offset           = file->readp;
+  req->max_count        = max_read;
+  req->min_count        = max_read;
+  req->max_count_high   = 0;
+  req->remaining        = 0;
+  req->offset_high      = 0;
+  req->bct              = 0;
+
+  res = smb_session_send_msg(s, req_msg);
+  smb_message_destroy(req_msg);
+  if (!send)
+    return (-1);
+
+  if (!smb_session_recv_msg(s, &resp_msg))
+    return (-1);
+  if (resp_msg.packet->header.status != NT_STATUS_SUCCESS)
+    return (-1);
+
+  resp = (smb_read_resp_t *)resp_msg.packet->payload;
+  memcpy(buf, resp->file, resp->data_len);
+  smb_fseek(s, fd, resp->data_len, SEEK_CUR);
+
+  return (resp->data_len);
+}
+
+ssize_t   smb_fseek(smb_session_t *s, smb_fd fd, ssize_t offset, int whence)
+{
+  smb_file_t  *file;
+
+  assert(s != NULL);
+
+  if (!fd || (file = smb_session_file_get(s, fd)) == NULL)
+    return(0);
+
+  if (whence == SEEK_SET)
+    file->readp = offset;
+  else if (whence == SEEK_CUR)
+    file->readp += offset;
+
+  return (file->readp);
 }