test SMBsetatr as well
authorAndrew Tridgell <tridge@samba.org>
Sun, 23 Nov 1997 03:09:59 +0000 (03:09 +0000)
committerAndrew Tridgell <tridge@samba.org>
Sun, 23 Nov 1997 03:09:59 +0000 (03:09 +0000)
source/include/proto.h
source/libsmb/clientgen.c
source/utils/torture.c

index 81868f5e12743dbc9e4cad99583a2db5fd68953b..1e8c33be15770e9716d8f4fa5b16ded349607f5b 100644 (file)
@@ -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);
index 031c0c10de150900510155f132e521127f3f82ef..39d1226f9d90ef4b7e493bd34fff95108b2a195a 100644 (file)
@@ -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;
 }
 
index 06f9f5f1fbc7bd5249e15a47cd19b297f4d15e68..d5258d2d6ab35eee8ba1a6b1d4d548976c99e382 100644 (file)
@@ -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);