Forráskód Böngészése

Trans2: refactor find_first management

Signed-off-by: Jean-Baptiste Kempf <jb@videolan.org>
Sylver Bruneau 9 éve
szülő
commit
178f1ea28b
1 módosított fájl, 79 hozzáadás és 61 törlés
  1. 79 61
      src/smb_trans2.c

+ 79 - 61
src/smb_trans2.c

@@ -39,54 +39,6 @@
 #include "smb_utils.h"
 #include "smb_stat.h"
 
-static smb_file *smb_find_parse(smb_message *msg)
-{
-    smb_trans2_resp           *tr2;
-    smb_tr2_findfirst2_params *params;
-    smb_tr2_find2_entry       *iter;
-    smb_file                  *files, *tmp;
-    uint8_t                   *eod;
-    size_t                    count, i;
-
-    assert(msg != NULL);
-
-    // Let's parse the answer we got from server
-    tr2     = (smb_trans2_resp *)msg->packet->payload;
-    params  = (smb_tr2_findfirst2_params *)tr2->payload;
-    iter    = (smb_tr2_find2_entry *)(tr2->payload + sizeof(smb_tr2_findfirst2_params));
-    eod     = msg->packet->payload + msg->payload_size;
-    count   = params->count;
-    files   = NULL;
-
-    for (i = 0; i < count && (uint8_t *)iter < eod; i++)
-    {
-        // Create a smb_file and fill it
-        tmp = calloc(1, sizeof(smb_file));
-        if (!tmp)
-            return NULL;
-
-        tmp->name_len = smb_from_utf16((const char *)iter->name, iter->name_len,
-                                       &tmp->name);
-        tmp->name[tmp->name_len] = 0;
-
-        tmp->created    = iter->created;
-        tmp->accessed   = iter->accessed;
-        tmp->written    = iter->written;
-        tmp->changed    = iter->changed;
-        tmp->size       = iter->size;
-        tmp->alloc_size = iter->alloc_size;
-        tmp->attr       = iter->attr;
-        tmp->is_dir     = tmp->attr & SMB_ATTR_DIR;
-
-        tmp->next = files;
-        files     = tmp;
-
-        iter = (smb_tr2_find2_entry *)(((char *)iter) + iter->next_entry);
-    }
-
-    return (files);
-}
-
 static smb_message *smb_tr2_recv(smb_session *s)
 {
     smb_message           recv, *res;
@@ -124,21 +76,76 @@ static smb_message *smb_tr2_recv(smb_session *s)
     return (res);
 }
 
-smb_file  *smb_find(smb_session *s, smb_tid tid, const char *pattern)
+static void smb_tr2_find2_parse_entries(smb_file **files_p, smb_tr2_find2_entry *iter, size_t count, uint8_t *eod)
+{
+    smb_file *tmp = NULL;
+    size_t   i;
+
+    for (i = 0; i < count && (uint8_t *)iter < eod; i++)
+    {
+        // Create a smb_file and fill it
+        tmp = calloc(1, sizeof(smb_file));
+        if (!tmp)
+            return;
+
+        tmp->name_len = smb_from_utf16((const char *)iter->name, iter->name_len,
+                                       &tmp->name);
+        tmp->name[tmp->name_len] = 0;
+
+        tmp->created    = iter->created;
+        tmp->accessed   = iter->accessed;
+        tmp->written    = iter->written;
+        tmp->changed    = iter->changed;
+        tmp->size       = iter->size;
+        tmp->alloc_size = iter->alloc_size;
+        tmp->attr       = iter->attr;
+        tmp->is_dir     = tmp->attr & SMB_ATTR_DIR;
+
+        tmp->next = *files_p;
+        *files_p  = tmp;
+
+        iter = (smb_tr2_find2_entry *)(((char *)iter) + iter->next_entry);
+    }
+
+    return;
+}
+
+static void smb_find_first_parse(smb_message *msg, smb_file **files_p)
+{
+    smb_trans2_resp       *tr2;
+    smb_tr2_findfirst2_params  *params;
+    smb_tr2_find2_entry   *iter;
+    uint8_t               *eod;
+    size_t                count;
+
+    assert(msg != NULL);
+
+    // Let's parse the answer we got from server
+    tr2     = (smb_trans2_resp *)msg->packet->payload;
+    params  = (smb_tr2_findfirst2_params *)tr2->payload;
+    iter    = (smb_tr2_find2_entry *)(tr2->payload + sizeof(smb_tr2_findfirst2_params));
+    eod     = msg->packet->payload + msg->payload_size;
+    count   = params->count;
+
+    smb_tr2_find2_parse_entries(files_p, iter, count, eod);
+    return;
+}
+
+static smb_message  *smb_trans2_find_first (smb_session *s, smb_tid tid, const char *pattern)
 {
-    smb_file              *files;
     smb_message           *msg;
     smb_trans2_req        tr2;
     smb_tr2_findfirst2    find;
     size_t                utf_pattern_len, tr2_bct, tr2_param_count;
     char                  *utf_pattern;
-    int                   res, padding = 0;
+    int                   res;
+    unsigned int          padding = 0;
 
     assert(s != NULL && pattern != NULL && tid);
 
     utf_pattern_len = smb_to_utf16(pattern, strlen(pattern) + 1, &utf_pattern);
     if (utf_pattern_len == 0)
-        return (0);
+        return (NULL);
 
     tr2_bct = sizeof(smb_tr2_findfirst2) + utf_pattern_len;
     tr2_param_count = tr2_bct;
@@ -153,7 +160,7 @@ smb_file  *smb_find(smb_session *s, smb_tid tid, const char *pattern)
     msg = smb_message_new(SMB_CMD_TRANS2);
     if (!msg) {
         free(utf_pattern);
-        return (0);
+        return (NULL);
     }
     msg->packet->header.tid = tid;
 
@@ -171,36 +178,47 @@ smb_file  *smb_find(smb_session *s, smb_tid tid, const char *pattern)
     tr2.bct = tr2_bct; //3 == padding
     SMB_MSG_PUT_PKT(msg, tr2);
 
-
     SMB_MSG_INIT_PKT(find);
     find.attrs     = SMB_FIND2_ATTR_DEFAULT;
     find.count     = 1366;     // ??
-    // XXX: Here we close search until we implement FIND_NEXT2
     find.flags     = SMB_FIND2_FLAG_DEFAULT | SMB_FIND2_FLAG_CLOSE;
     find.interest  = 0x0104;   // 'Find file both directory info'
     SMB_MSG_PUT_PKT(msg, find);
     smb_message_append(msg, utf_pattern, utf_pattern_len);
-    free(utf_pattern);
     while (padding--)
         smb_message_put8(msg, 0);
 
     res = smb_session_send_msg(s, msg);
     smb_message_destroy(msg);
+    free(utf_pattern);
+
     if (!res)
     {
         BDSM_dbg("Unable to query pattern: %s\n", pattern);
         return (NULL);
     }
 
-    if ((msg = smb_tr2_recv(s)) == NULL)
-        return (NULL);
+    msg = smb_tr2_recv(s);
+    return msg;
+}
+
+smb_file  *smb_find(smb_session *s, smb_tid tid, const char *pattern)
+{
+    smb_file              *files = NULL;
+    smb_message           *msg;
+
+    assert(s != NULL && pattern != NULL && tid);
+
+    msg = smb_trans2_find_first(s,tid,pattern);
+    if (msg != NULL)
+    {
+        smb_find_first_parse(msg,&files);
+        smb_message_destroy(msg);
+    }
 
-    files = smb_find_parse(msg);
-    smb_message_destroy(msg);
     return (files);
 }
 
-
 smb_file  *smb_fstat(smb_session *s, smb_tid tid, const char *path)
 {
     smb_message           *msg, reply;