r17761: Handle times consistently across all client utils.
authorJeremy Allison <jra@samba.org>
Wed, 23 Aug 2006 22:33:50 +0000 (22:33 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 16:38:47 +0000 (11:38 -0500)
Fixes bugs reported in libsmbclient.
Jeremy.
(This used to be commit 42a417fb75313b093948602c3be8e2f386048b5f)

source3/libsmb/clilist.c
source3/libsmb/clirap.c
source3/libsmb/libsmbclient.c
source3/torture/torture.c

index a006c47ae0e50c052f3a107aec52d8c22c5bcf7e..b022a107d09822c53781e2a5f5f71bca498af5fe 100644 (file)
@@ -94,27 +94,13 @@ static size_t interpret_long_filename(struct cli_state *cli, int level,char *p,f
                        }
                        p += 4; /* fileindex */
                                
-                       /* these dates appear to arrive in a
-                          weird way. It seems to be localtime
-                          plus the serverzone given in the
-                          initial connect. This is GMT when
-                          DST is not in effect and one hour
-                          from GMT otherwise. Can this really
-                          be right??
-                          
-                          I suppose this could be called
-                          kludge-GMT. Is is the GMT you get
-                          by using the current DST setting on
-                          a different localtime. It will be
-                          cheap to calculate, I suppose, as
-                          no DST tables will be needed */
-                       
-                       finfo->ctime = interpret_long_date(p);
+                       /* Offset zero is "create time", not "change time". */
                        p += 8;
                        finfo->atime = interpret_long_date(p);
                        p += 8;
                        finfo->mtime = interpret_long_date(p);
                        p += 8;
+                       finfo->ctime = interpret_long_date(p);
                        p += 8;
                        finfo->size = IVAL2_TO_SMB_BIG_UINT(p,0);
                        p += 8;
index a33baed5363c141880ccc52be39d4e972e8762d9..1227b26b2ffa9f52c7bcd64dd05f8357cc312758 100644 (file)
@@ -553,9 +553,10 @@ BOOL cli_setpathinfo(struct cli_state *cli, const char *fname,
 /****************************************************************************
 send a qpathinfo call with the SMB_QUERY_FILE_ALL_INFO info level
 ****************************************************************************/
+
 BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname, 
-                   time_t *c_time, time_t *a_time, time_t *m_time, 
-                   time_t *w_time, SMB_OFF_T *size, uint16 *mode,
+                   time_t *create_time, time_t *access_time, time_t *write_time, 
+                   time_t *change_time, SMB_OFF_T *size, uint16 *mode,
                    SMB_INO_T *ino)
 {
        unsigned int data_len = 0;
@@ -593,17 +594,17 @@ BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname,
                return False;
        }
         
-       if (c_time) {
-                *c_time = interpret_long_date(rdata+0);
+       if (create_time) {
+                *create_time = interpret_long_date(rdata+0);
        }
-       if (a_time) {
-               *a_time = interpret_long_date(rdata+8);
+       if (access_time) {
+               *access_time = interpret_long_date(rdata+8);
        }
-       if (w_time) {
-               *w_time = interpret_long_date(rdata+16);
+       if (write_time) {
+               *write_time = interpret_long_date(rdata+16);
        }
-       if (m_time) {
-               *m_time = interpret_long_date(rdata+24);
+       if (change_time) {
+               *change_time = interpret_long_date(rdata+24);
        }
        if (mode) {
                *mode = SVAL(rdata, 32);
@@ -669,8 +670,8 @@ send a qfileinfo call
 ****************************************************************************/
 BOOL cli_qfileinfo(struct cli_state *cli, int fnum, 
                   uint16 *mode, SMB_OFF_T *size,
-                  time_t *c_time, time_t *a_time, time_t *m_time, 
-                  time_t *w_time, SMB_INO_T *ino)
+                  time_t *create_time, time_t *access_time, time_t *write_time, 
+                  time_t *change_time, SMB_INO_T *ino)
 {
        unsigned int data_len = 0;
        unsigned int param_len = 0;
@@ -708,17 +709,17 @@ BOOL cli_qfileinfo(struct cli_state *cli, int fnum,
                return False;
        }
 
-       if (c_time) {
-               *c_time = interpret_long_date(rdata+0) - cli->serverzone;
+       if (create_time) {
+               *create_time = interpret_long_date(rdata+0);
        }
-       if (a_time) {
-               *a_time = interpret_long_date(rdata+8) - cli->serverzone;
+       if (access_time) {
+               *access_time = interpret_long_date(rdata+8);
        }
-       if (m_time) {
-               *m_time = interpret_long_date(rdata+16) - cli->serverzone;
+       if (write_time) {
+               *write_time = interpret_long_date(rdata+16);
        }
-       if (w_time) {
-               *w_time = interpret_long_date(rdata+24) - cli->serverzone;
+       if (change_time) {
+               *change_time = interpret_long_date(rdata+24);
        }
        if (mode) {
                *mode = SVAL(rdata, 32);
@@ -793,9 +794,9 @@ BOOL cli_qpathinfo_basic( struct cli_state *cli, const char *name,
                return False;
        }
 
-       sbuf->st_atime = interpret_long_date( rdata+8 );
-       sbuf->st_mtime = interpret_long_date( rdata+16 );
-       sbuf->st_ctime = interpret_long_date( rdata+24 );
+       sbuf->st_atime = interpret_long_date( rdata+8 ); /* Access time. */
+       sbuf->st_mtime = interpret_long_date( rdata+16 ); /* Write time. */
+       sbuf->st_ctime = interpret_long_date( rdata+24 ); /* Change time. */
        
        *attributes = IVAL( rdata, 32 );
        
index d9267e72bd8daeaff860fa24dd3b9ee775ec4540..abeb66b3733169fbea28e0a3dd3bedf5399eaf95 100644 (file)
@@ -1514,7 +1514,7 @@ smbc_getatr(SMBCCTX * context,
   
        if (!srv->no_pathinfo2 &&
             cli_qpathinfo2(targetcli, targetpath,
-                           c_time, a_time, m_time, NULL, size, mode, ino)) {
+                           NULL, a_time, m_time, c_time, size, mode, ino)) {
             return True;
         }
 
@@ -2182,7 +2182,7 @@ smbc_fstat_ctx(SMBCCTX *context,
        /*d_printf(">>>fstat: resolved path as %s\n", targetpath);*/
 
        if (!cli_qfileinfo(targetcli, file->cli_fd, &mode, &size,
-                           &c_time, &a_time, &m_time, NULL, &ino)) {
+                           NULL, &a_time, &m_time, &c_time, &ino)) {
            if (!cli_getattrE(targetcli, file->cli_fd, &mode, &size,
                               &c_time, &a_time, &m_time)) {
 
index f951b44494545e7c36a6cba929a1266fc22a7aca..ba13897773db80078af9677787ea37307e4bd0f1 100644 (file)
@@ -2539,8 +2539,8 @@ static BOOL run_trans2test(int dummy)
        fnum = cli_open(cli, fname, 
                        O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
        cli_close(cli, fnum);
-       if (!cli_qpathinfo2(cli, fname, &c_time, &a_time, &m_time, 
-                           &w_time, &size, NULL, NULL)) {
+       if (!cli_qpathinfo2(cli, fname, &c_time, &a_time, &w_time, 
+                           &m_time, &size, NULL, NULL)) {
                printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
                correct = False;
        } else {
@@ -2561,8 +2561,8 @@ static BOOL run_trans2test(int dummy)
                correct = False;
        }
        sleep(3);
-       if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &m_time, 
-                           &w_time, &size, NULL, NULL)) {
+       if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &w_time, 
+                           &m_time, &size, NULL, NULL)) {
                printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
                correct = False;
        }
@@ -2571,8 +2571,8 @@ static BOOL run_trans2test(int dummy)
                        O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
        cli_write(cli, fnum,  0, (char *)&fnum, 0, sizeof(fnum));
        cli_close(cli, fnum);
-       if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &m_time2
-                           &w_time, &size, NULL, NULL)) {
+       if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &w_time
+                           &m_time2, &size, NULL, NULL)) {
                printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
                correct = False;
        } else {