Regarding added SMB-test in
https://github.com/curl/curl/pull/1630,

it's nice to see SMB is getting some focus (although I'm not able to run
these tests on my StrawberryPerl).

2 problems in smb.c AFAICS:

1) '_getpid()' is not a valid function in djgpp/MSDOS. Simple fix:

--- a/smb.c 2017-07-04 11:24:33
+++ b/smb.c 2017-07-04 12:42:10
@@ -31,12 +31,12 @@
   #define BUILDING_CURL_SMB_C

   #ifdef HAVE_PROCESS_H
-#include <process.h>
-#ifdef CURL_WINDOWS_APP
-#define getpid GetCurrentProcessId
-#else
-#define getpid _getpid
-#endif
+  #include <process.h>
+  #ifdef CURL_WINDOWS_APP
+    #define getpid GetCurrentProcessId
+  #elif !defined(MSDOS)
+    #define getpid _getpid
+  #endif
   #endif

   #include "smb.h"


2) A "curl --remote-time .." does nothing for smb://.
Seems to be a matter of using the 'smb_nt_create_response::last_change_time'
struct-member. The attached diff seems to work here.

A test like:
   curl --remote-time -o test-file --libcurl - smb://host/Users/Public/test-file
shows
  ...
  curl_easy_setopt(hnd, CURLOPT_FILETIME, 1L);

And the timestamp after the D/L seems okay.

--
--gv


--- a/smb.c 2017-07-04 11:24:33
+++ b/smb.c 2017-07-04 12:42:10
@@ -31,12 +31,12 @@
 #define BUILDING_CURL_SMB_C

 #ifdef HAVE_PROCESS_H
-#include <process.h>
-#ifdef CURL_WINDOWS_APP
-#define getpid GetCurrentProcessId
-#else
-#define getpid _getpid
-#endif
+  #include <process.h>
+  #ifdef CURL_WINDOWS_APP
+    #define getpid GetCurrentProcessId
+  #elif !defined(MSDOS)
+    #define getpid _getpid
+  #endif
 #endif

 #include "smb.h"
@@ -715,6 +715,23 @@
   return CURLE_OK;
 }

+/*
+ * Convert a timestamp from the Windows world (100 nsec units from
+ * 1 Jan 1601) to Posix time.
+ */
+static void get_posix_time (long *_out, const void *_in)
+{
+#ifdef HAVE_LONGLONG
+  long long time = *(long long *) _in;
+#else
+  unsigned __int64 time = *(unsigned __int64 *) _in;
+#endif
+
+  time -= 116444736000000000ULL;
+  time /= 10000000;
+  *_out = (long) time;
+}
+
 static CURLcode smb_request_state(struct connectdata *conn, bool *done)
 {
   struct smb_request *req = conn->data->req.protop;
@@ -725,6 +742,7 @@
   unsigned short off;
   CURLcode result;
   void *msg = NULL;
+  const struct smb_nt_create_response *smb_m;

   /* Start the request */
   if(req->state == SMB_REQUESTING) {
@@ -767,7 +785,8 @@
       next_state = SMB_TREE_DISCONNECT;
       break;
     }
-    req->fid = smb_swap16(((struct smb_nt_create_response *)msg)->fid);
+    smb_m = (const struct smb_nt_create_response*) msg;
+    req->fid = smb_swap16(smb_m->fid);
     conn->data->req.offset = 0;
     if(conn->data->set.upload) {
       conn->data->req.size = conn->data->state.infilesize;
@@ -775,9 +794,11 @@
       next_state = SMB_UPLOAD;
     }
     else {
-      conn->data->req.size =
-        smb_swap64(((struct smb_nt_create_response *)msg)->end_of_file);
+      smb_m = (const struct smb_nt_create_response*) msg;
+      conn->data->req.size = smb_swap64(smb_m->end_of_file);
       Curl_pgrsSetDownloadSize(conn->data, conn->data->req.size);
+      if(conn->data->set.get_filetime)
+        get_posix_time (&conn->data->info.filetime, &smb_m->last_change_time);
       next_state = SMB_DOWNLOAD;
     }
     break;
-------------------------------------------------------------------
Unsubscribe: https://cool.haxx.se/list/listinfo/curl-library
Etiquette:   https://curl.haxx.se/mail/etiquette.html

Reply via email to