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:
committed by
Gerald (Jerry) Carter
parent
fddeed8adb
commit
aee6b5942a
@ -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;
|
||||||
|
@ -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 );
|
||||||
|
|
||||||
|
@ -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)) {
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Reference in New Issue
Block a user