浏览代码

Add smb_stat_list_destroy function. Plus a few small fixes

Julien 'Lta' BALLET 11 年之前
父节点
当前提交
3df64e7906
共有 7 个文件被更改,包括 52 次插入10 次删除
  1. 7 0
      include/bdsm/smb_stat.h
  2. 6 6
      include/bdsm/smb_types.h
  3. 6 0
      src/netbios_ns_entry.c
  4. 8 4
      src/smb_file.c
  5. 5 0
      src/smb_session.c
  6. 6 0
      src/smb_spnego.c
  7. 14 0
      src/smb_stat.c

+ 7 - 0
include/bdsm/smb_stat.h

@@ -98,6 +98,13 @@ size_t            smb_stat_list_count(smb_stat_list list);
 smb_stat        smb_stat_list_at(smb_stat_list list, size_t index);
 
 /**
+ * @brief Destroy and release a list of file stat returned by smb_find
+ *
+ * @param list The stat_list to free
+ */
+void            smb_stat_list_destroy(smb_stat_list list);
+
+/**
  * @brief Get the name of the file from its status
  *
  * @param info A file status

+ 6 - 6
include/bdsm/smb_types.h

@@ -89,12 +89,12 @@ typedef struct smb_transport_s
 {
     void              *session;
     void              *(*new)(size_t buf_size);
-    int (*connect)(struct in_addr *addr, void *s, const char *name);
-    void (*destroy)(void *s);
-    void (*pkt_init)(void *s);
-    int (*pkt_append)(void *s, void *data, size_t size);
-    int (*send)(void *s);
-    ssize_t (*recv)(void *s, void **data);
+    int               (*connect)(struct in_addr *addr, void *s, const char *name);
+    void              (*destroy)(void *s);
+    void              (*pkt_init)(void *s);
+    int               (*pkt_append)(void *s, void *data, size_t size);
+    int               (*send)(void *s);
+    ssize_t           (*recv)(void *s, void **data);
 }                   smb_transport;
 
 // An structure to store user credentials;

+ 6 - 0
src/netbios_ns_entry.c

@@ -74,6 +74,12 @@ netbios_ns_entry *netbios_ns_entry_add(netbios_ns *ns, const char *name,
     {
         memcpy(entry->name, name, NETBIOS_NAME_LENGTH);
         entry->name[NETBIOS_NAME_LENGTH] = 0;
+
+        for (int i = 1; i < NETBIOS_NAME_LENGTH; i++ )
+          if (entry->name[NETBIOS_NAME_LENGTH - i] == ' ')
+            entry->name[NETBIOS_NAME_LENGTH - i] = 0;
+          else
+            break;
     }
 
     entry->type           = type;

+ 8 - 4
src/smb_file.c

@@ -35,8 +35,8 @@ smb_fd      smb_fopen(smb_session *s, smb_tid tid, const char *path,
     smb_message     *req_msg, resp_msg;
     smb_create_req  *req;
     smb_create_resp *resp;
-    size_t            path_len;
-    int               res;
+    size_t           path_len;
+    int              res;
 
     assert(s != NULL && path != NULL);
     if ((share = smb_session_share_get(s, tid)) == NULL)
@@ -106,7 +106,9 @@ void        smb_fclose(smb_session *s, smb_fd fd)
     smb_message     *msg;
     smb_close_req   *req;
 
-    assert(s != NULL && fd);
+    assert(s != NULL);
+    if (!fd)
+      return;
 
     // XXX Memory leak, destroy the file after removing it
     if ((file = smb_session_file_remove(s, fd)) == NULL)
@@ -138,7 +140,9 @@ ssize_t   smb_fread(smb_session *s, smb_fd fd, void *buf, size_t buf_size)
     size_t            max_read;
     int               res;
 
-    assert(s != NULL && buf != NULL && fd);
+    assert(s != NULL && buf != NULL);
+    if (!fd)
+      return (-1);
     if ((file = smb_session_file_get(s, fd)) == NULL)
         return (-1);
 

+ 5 - 0
src/smb_session.c

@@ -289,6 +289,11 @@ int             smb_session_login(smb_session *s)
 {
     assert(s != NULL);
 
+    if (s->creds.domain == NULL
+        || s->creds.login == NULL
+        || s->creds.password == NULL)
+      return (0);
+
     if (smb_session_supports(s, SMB_SESSION_XSEC))
         return (smb_session_login_spnego(s, s->creds.domain, s->creds.login,
                                          s->creds.password));

+ 6 - 0
src/smb_spnego.c

@@ -289,7 +289,13 @@ static int      auth(smb_session *s, const char *domain, const char *user,
     if (resp.packet->header.status != NT_STATUS_SUCCESS)
         return (0);
     else
+    {
+        smb_session_xsec_resp *r = (smb_session_xsec_resp *)resp.packet->payload;
+        if (r->action & 0x0001)
+            s->guest = true;
+
         return (1);
+    }
 
 error:
     asn1_display_error("smb_session_login auth()", res);

+ 14 - 0
src/smb_stat.c

@@ -41,6 +41,18 @@ size_t            smb_stat_list_count(smb_stat_list list)
     return (count);
 }
 
+void            smb_stat_list_destroy(smb_stat_list list)
+{
+    smb_stat_list tmp;
+
+    while(list != NULL)
+    {
+        tmp = list->next;
+        free(list);
+        list = tmp;
+    }
+}
+
 smb_stat        smb_stat_list_at(smb_stat_list list, size_t index)
 {
     size_t          pos = 0;
@@ -81,6 +93,8 @@ uint64_t          smb_stat_get(smb_stat info, int what)
             return (info->written);
         case SMB_STAT_MTIME:
             return (info->changed);
+        case SMB_STAT_ISDIR:
+            return (info->is_dir);
         default:
             return (0);
     }