1
0
mirror of https://github.com/samba-team/samba.git synced 2025-08-04 08:22:08 +03:00

r17761: Handle times consistently across all client utils.

Fixes bugs reported in libsmbclient.
Jeremy.
(This used to be commit 42a417fb75)
This commit is contained in:
Jeremy Allison
2006-08-23 22:33:50 +00:00
committed by Gerald (Jerry) Carter
parent fddeed8adb
commit aee6b5942a
4 changed files with 34 additions and 47 deletions

View File

@ -94,27 +94,13 @@ static size_t interpret_long_filename(struct cli_state *cli, int level,char *p,f
} }
p += 4; /* fileindex */ p += 4; /* fileindex */
/* these dates appear to arrive in a /* Offset zero is "create time", not "change time". */
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);
p += 8; p += 8;
finfo->atime = interpret_long_date(p); finfo->atime = interpret_long_date(p);
p += 8; p += 8;
finfo->mtime = interpret_long_date(p); finfo->mtime = interpret_long_date(p);
p += 8; p += 8;
finfo->ctime = interpret_long_date(p);
p += 8; p += 8;
finfo->size = IVAL2_TO_SMB_BIG_UINT(p,0); finfo->size = IVAL2_TO_SMB_BIG_UINT(p,0);
p += 8; p += 8;

View 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 send a qpathinfo call with the SMB_QUERY_FILE_ALL_INFO info level
****************************************************************************/ ****************************************************************************/
BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname, BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname,
time_t *c_time, time_t *a_time, time_t *m_time, time_t *create_time, time_t *access_time, time_t *write_time,
time_t *w_time, SMB_OFF_T *size, uint16 *mode, time_t *change_time, SMB_OFF_T *size, uint16 *mode,
SMB_INO_T *ino) SMB_INO_T *ino)
{ {
unsigned int data_len = 0; unsigned int data_len = 0;
@ -593,17 +594,17 @@ BOOL cli_qpathinfo2(struct cli_state *cli, const char *fname,
return False; return False;
} }
if (c_time) { if (create_time) {
*c_time = interpret_long_date(rdata+0); *create_time = interpret_long_date(rdata+0);
} }
if (a_time) { if (access_time) {
*a_time = interpret_long_date(rdata+8); *access_time = interpret_long_date(rdata+8);
} }
if (w_time) { if (write_time) {
*w_time = interpret_long_date(rdata+16); *write_time = interpret_long_date(rdata+16);
} }
if (m_time) { if (change_time) {
*m_time = interpret_long_date(rdata+24); *change_time = interpret_long_date(rdata+24);
} }
if (mode) { if (mode) {
*mode = SVAL(rdata, 32); *mode = SVAL(rdata, 32);
@ -669,8 +670,8 @@ send a qfileinfo call
****************************************************************************/ ****************************************************************************/
BOOL cli_qfileinfo(struct cli_state *cli, int fnum, BOOL cli_qfileinfo(struct cli_state *cli, int fnum,
uint16 *mode, SMB_OFF_T *size, uint16 *mode, SMB_OFF_T *size,
time_t *c_time, time_t *a_time, time_t *m_time, time_t *create_time, time_t *access_time, time_t *write_time,
time_t *w_time, SMB_INO_T *ino) time_t *change_time, SMB_INO_T *ino)
{ {
unsigned int data_len = 0; unsigned int data_len = 0;
unsigned int param_len = 0; unsigned int param_len = 0;
@ -708,17 +709,17 @@ BOOL cli_qfileinfo(struct cli_state *cli, int fnum,
return False; return False;
} }
if (c_time) { if (create_time) {
*c_time = interpret_long_date(rdata+0) - cli->serverzone; *create_time = interpret_long_date(rdata+0);
} }
if (a_time) { if (access_time) {
*a_time = interpret_long_date(rdata+8) - cli->serverzone; *access_time = interpret_long_date(rdata+8);
} }
if (m_time) { if (write_time) {
*m_time = interpret_long_date(rdata+16) - cli->serverzone; *write_time = interpret_long_date(rdata+16);
} }
if (w_time) { if (change_time) {
*w_time = interpret_long_date(rdata+24) - cli->serverzone; *change_time = interpret_long_date(rdata+24);
} }
if (mode) { if (mode) {
*mode = SVAL(rdata, 32); *mode = SVAL(rdata, 32);
@ -793,9 +794,9 @@ BOOL cli_qpathinfo_basic( struct cli_state *cli, const char *name,
return False; return False;
} }
sbuf->st_atime = interpret_long_date( rdata+8 ); sbuf->st_atime = interpret_long_date( rdata+8 ); /* Access time. */
sbuf->st_mtime = interpret_long_date( rdata+16 ); sbuf->st_mtime = interpret_long_date( rdata+16 ); /* Write time. */
sbuf->st_ctime = interpret_long_date( rdata+24 ); sbuf->st_ctime = interpret_long_date( rdata+24 ); /* Change time. */
*attributes = IVAL( rdata, 32 ); *attributes = IVAL( rdata, 32 );

View File

@ -1514,7 +1514,7 @@ smbc_getatr(SMBCCTX * context,
if (!srv->no_pathinfo2 && if (!srv->no_pathinfo2 &&
cli_qpathinfo2(targetcli, targetpath, 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; return True;
} }
@ -2182,7 +2182,7 @@ smbc_fstat_ctx(SMBCCTX *context,
/*d_printf(">>>fstat: resolved path as %s\n", targetpath);*/ /*d_printf(">>>fstat: resolved path as %s\n", targetpath);*/
if (!cli_qfileinfo(targetcli, file->cli_fd, &mode, &size, 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, if (!cli_getattrE(targetcli, file->cli_fd, &mode, &size,
&c_time, &a_time, &m_time)) { &c_time, &a_time, &m_time)) {

View File

@ -2539,8 +2539,8 @@ static BOOL run_trans2test(int dummy)
fnum = cli_open(cli, fname, fnum = cli_open(cli, fname,
O_RDWR | O_CREAT | O_TRUNC, DENY_NONE); O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
cli_close(cli, fnum); cli_close(cli, fnum);
if (!cli_qpathinfo2(cli, fname, &c_time, &a_time, &m_time, if (!cli_qpathinfo2(cli, fname, &c_time, &a_time, &w_time,
&w_time, &size, NULL, NULL)) { &m_time, &size, NULL, NULL)) {
printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli)); printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
correct = False; correct = False;
} else { } else {
@ -2561,8 +2561,8 @@ static BOOL run_trans2test(int dummy)
correct = False; correct = False;
} }
sleep(3); sleep(3);
if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &m_time, if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &w_time,
&w_time, &size, NULL, NULL)) { &m_time, &size, NULL, NULL)) {
printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli)); printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
correct = False; correct = False;
} }
@ -2571,8 +2571,8 @@ static BOOL run_trans2test(int dummy)
O_RDWR | O_CREAT | O_TRUNC, DENY_NONE); O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
cli_write(cli, fnum, 0, (char *)&fnum, 0, sizeof(fnum)); cli_write(cli, fnum, 0, (char *)&fnum, 0, sizeof(fnum));
cli_close(cli, fnum); cli_close(cli, fnum);
if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &m_time2, if (!cli_qpathinfo2(cli, "\\trans2\\", &c_time, &a_time, &w_time,
&w_time, &size, NULL, NULL)) { &m_time2, &size, NULL, NULL)) {
printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli)); printf("ERROR: qpathinfo2 failed (%s)\n", cli_errstr(cli));
correct = False; correct = False;
} else { } else {