summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>1997-11-23 03:09:59 +0000
committerAndrew Tridgell <tridge@samba.org>1997-11-23 03:09:59 +0000
commita1c5442abb3bc221157ca3620d35e1a013b26232 (patch)
treeb3d6058c7a997d933926b3c7b2e55ab649016dcd
parent74f06e4062634fa4f8cb46915280dedf73d58c6f (diff)
downloadsamba-a1c5442abb3bc221157ca3620d35e1a013b26232.tar.gz
samba-a1c5442abb3bc221157ca3620d35e1a013b26232.tar.bz2
samba-a1c5442abb3bc221157ca3620d35e1a013b26232.zip
test SMBsetatr as well
(This used to be commit 2f29c24ba721e417828efca57011ed45892191a5)
-rw-r--r--source3/include/proto.h4
-rw-r--r--source3/libsmb/clientgen.c57
-rw-r--r--source3/utils/torture.c25
3 files changed, 75 insertions, 11 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 81868f5e12..1e8c33be15 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -72,7 +72,9 @@ BOOL cli_lock(struct cli_state *cli, int fnum, uint32 offset, uint32 len, int ti
BOOL cli_unlock(struct cli_state *cli, int fnum, uint32 offset, uint32 len, int timeout);
int cli_read(struct cli_state *cli, int fnum, char *buf, uint32 offset, uint16 size);
int cli_write(struct cli_state *cli, int fnum, char *buf, uint32 offset, uint16 size);
-BOOL cli_stat(struct cli_state *cli, char *fname, struct stat *st);
+BOOL cli_getatr(struct cli_state *cli, char *fname,
+ int *attr, uint32 *size, time_t *t);
+BOOL cli_setatr(struct cli_state *cli, char *fname, int attr, time_t t);
BOOL cli_negprot(struct cli_state *cli);
BOOL cli_session_request(struct cli_state *cli, char *host, int name_type,
char *myname);
diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c
index 031c0c10de..39d1226f9d 100644
--- a/source3/libsmb/clientgen.c
+++ b/source3/libsmb/clientgen.c
@@ -861,10 +861,10 @@ int cli_write(struct cli_state *cli, int fnum, char *buf, uint32 offset, uint16
/****************************************************************************
-stat a file (actually a SMBgetattr call)
-This only fills in a few of the stat fields
+do a SMBgetatr call
****************************************************************************/
-BOOL cli_stat(struct cli_state *cli, char *fname, struct stat *st)
+BOOL cli_getatr(struct cli_state *cli, char *fname,
+ int *attr, uint32 *size, time_t *t)
{
char *p;
@@ -890,10 +890,55 @@ BOOL cli_stat(struct cli_state *cli, char *fname, struct stat *st)
return False;
}
- memset(st, 0, sizeof(*st));
- st->st_size = IVAL(cli->inbuf, smb_vwv3);
+ if (size) {
+ *size = IVAL(cli->inbuf, smb_vwv3);
+ }
+
+ if (t) {
+ *t = make_unix_date3(cli->inbuf+smb_vwv1);
+ }
+
+ if (attr) {
+ *attr = SVAL(cli->inbuf,smb_vwv0);
+ }
+
+
+ return True;
+}
+
+
+/****************************************************************************
+do a SMBsetatr call
+****************************************************************************/
+BOOL cli_setatr(struct cli_state *cli, char *fname, int attr, time_t t)
+{
+ char *p;
+
+ bzero(cli->outbuf,smb_size);
+ bzero(cli->inbuf,smb_size);
+
+ set_message(cli->outbuf,8,strlen(fname)+2,True);
+
+ CVAL(cli->outbuf,smb_com) = SMBsetatr;
+ SSVAL(cli->outbuf,smb_tid,cli->cnum);
+ cli_setup_packet(cli);
+
+ SSVAL(cli->outbuf,smb_vwv0, attr);
+ put_dos_date3(cli->outbuf,smb_vwv1, t);
+
+ p = smb_buf(cli->outbuf);
+ *p = 4;
+ strcpy(p+1, fname);
+
+ send_smb(cli->fd,cli->outbuf);
+ if (!receive_smb(cli->fd,cli->inbuf,cli->timeout)) {
+ return False;
+ }
+
+ if (CVAL(cli->inbuf,smb_rcls) != 0) {
+ return False;
+ }
- st->st_mtime = make_unix_date3(cli->inbuf+smb_vwv1);
return True;
}
diff --git a/source3/utils/torture.c b/source3/utils/torture.c
index 06f9f5f1fb..d5258d2d6a 100644
--- a/source3/utils/torture.c
+++ b/source3/utils/torture.c
@@ -637,7 +637,7 @@ static void run_attrtest(void)
{
static struct cli_state cli;
int fnum;
- struct stat st;
+ time_t t, t2;
char *fname = "\\attrib.tst";
printf("staring attrib test\n");
@@ -650,13 +650,30 @@ static void run_attrtest(void)
fnum = cli_open(&cli, fname,
O_RDWR | O_CREAT | O_TRUNC, DENY_NONE);
cli_close(&cli, fnum);
- if (!cli_stat(&cli, fname, &st)) {
+ if (!cli_getatr(&cli, fname, NULL, NULL, &t)) {
printf("getatr failed (%s)\n", cli_errstr(&cli));
}
- if (abs(st.st_mtime - time(NULL)) > 2) {
+ if (abs(t - time(NULL)) > 2) {
printf("ERROR: SMBgetatr bug. time is %s",
- ctime(&st.st_mtime));
+ ctime(&t));
+ t = time(NULL);
+ }
+
+ t2 = t-60*60*24; /* 1 day ago */
+
+ if (!cli_setatr(&cli, fname, 0, t2)) {
+ printf("setatr failed (%s)\n", cli_errstr(&cli));
+ }
+
+ if (!cli_getatr(&cli, fname, NULL, NULL, &t)) {
+ printf("getatr failed (%s)\n", cli_errstr(&cli));
+ }
+
+ if (t != t2) {
+ printf("ERROR: getatr/setatr bug. times are\n%s",
+ ctime(&t));
+ printf("%s", ctime(&t2));
}
close_connection(&cli);