s3-torture: Use talloc more in vfstest
[kai/samba.git] / source3 / torture / cmd_vfs.c
index b845048ebe65d4771efe554d09f820ced1ae3839..f92efb9778fdf343453a8fe80f70f121a3bb1981 100644 (file)
@@ -97,7 +97,7 @@ static NTSTATUS cmd_show_data(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int ar
 
 static NTSTATUS cmd_connect(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
 {
-       SMB_VFS_CONNECT(vfs->conn, lp_servicename(SNUM(vfs->conn)), "vfstest");
+       SMB_VFS_CONNECT(vfs->conn, lp_servicename(talloc_tos(), SNUM(vfs->conn)), "vfstest");
        return NT_STATUS_OK;
 }
 
@@ -242,6 +242,7 @@ static NTSTATUS cmd_open(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, c
        files_struct *fsp;
        struct smb_filename *smb_fname = NULL;
        NTSTATUS status;
+       int ret;
 
        mode = 00400;
 
@@ -317,14 +318,13 @@ static NTSTATUS cmd_open(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, c
                }
        }
 
-       fsp = SMB_MALLOC_P(struct files_struct);
+       fsp = talloc_zero(vfs, struct files_struct);
        if (fsp == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
-       fsp->fh = SMB_MALLOC_P(struct fd_handle);
+       fsp->fh = talloc_zero(fsp, struct fd_handle);
        if (fsp->fh == NULL) {
-               SAFE_FREE(fsp->fsp_name);
-               SAFE_FREE(fsp);
+               TALLOC_FREE(fsp);
                return NT_STATUS_NO_MEMORY;
        }
        fsp->conn = vfs->conn;
@@ -332,7 +332,7 @@ static NTSTATUS cmd_open(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, c
        status = create_synthetic_smb_fname_split(NULL, argv[1], NULL,
                                                  &smb_fname);
        if (!NT_STATUS_IS_OK(status)) {
-               SAFE_FREE(fsp);
+               TALLOC_FREE(fsp);
                return status;
        }
 
@@ -341,12 +341,43 @@ static NTSTATUS cmd_open(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, c
        fsp->fh->fd = SMB_VFS_OPEN(vfs->conn, smb_fname, fsp, flags, mode);
        if (fsp->fh->fd == -1) {
                printf("open: error=%d (%s)\n", errno, strerror(errno));
-               SAFE_FREE(fsp->fh);
-               SAFE_FREE(fsp);
+               TALLOC_FREE(fsp);
                TALLOC_FREE(smb_fname);
                return NT_STATUS_UNSUCCESSFUL;
        }
 
+       ret = SMB_VFS_FSTAT(fsp, &smb_fname->st);
+       if (ret == -1) {
+               /* If we have an fd, this stat should succeed. */
+               DEBUG(0,("Error doing fstat on open file %s "
+                        "(%s)\n",
+                        smb_fname_str_dbg(smb_fname),
+                        strerror(errno) ));
+               status = map_nt_error_from_unix(errno);
+       } else if (S_ISDIR(smb_fname->st.st_ex_mode)) {
+               errno = EISDIR;
+               status = NT_STATUS_FILE_IS_A_DIRECTORY;
+       }
+       
+       if (!NT_STATUS_IS_OK(status)) {
+               SMB_VFS_CLOSE(fsp);
+               TALLOC_FREE(fsp);
+               TALLOC_FREE(smb_fname);
+               return status;
+       }
+
+       fsp->file_id = vfs_file_id_from_sbuf(vfs->conn, &smb_fname->st);
+       fsp->vuid = UID_FIELD_INVALID;
+       fsp->file_pid = 0;
+       fsp->can_lock = True;
+       fsp->can_read = True;
+       fsp->can_write =
+               CAN_WRITE(vfs->conn);
+       fsp->print_file = NULL;
+       fsp->modified = False;
+       fsp->sent_oplock_break = NO_BREAK_SENT;
+       fsp->is_directory = False;
+
        vfs->files[fsp->fh->fd] = fsp;
        printf("open: fd=%d\n", fsp->fh->fd);
        return NT_STATUS_OK;
@@ -414,9 +445,7 @@ static NTSTATUS cmd_close(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc,
        else
                printf("close: ok\n");
 
-       TALLOC_FREE(vfs->files[fd]->fsp_name);
-       SAFE_FREE(vfs->files[fd]->fh);
-       SAFE_FREE(vfs->files[fd]);
+       TALLOC_FREE(vfs->files[fd]);
        vfs->files[fd] = NULL;
        return NT_STATUS_OK;
 }
@@ -490,7 +519,7 @@ static NTSTATUS cmd_write(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc,
 static NTSTATUS cmd_lseek(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
 {
        int fd, offset, whence;
-       SMB_OFF_T pos;
+       off_t pos;
 
        if (argc != 4) {
                printf("Usage: lseek <fd> <offset> <whence>\n...where whence is 1 => SEEK_SET, 2 => SEEK_CUR, 3 => SEEK_END\n");
@@ -507,7 +536,7 @@ static NTSTATUS cmd_lseek(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc,
        }
 
        pos = SMB_VFS_LSEEK(vfs->files[fd], offset, whence);
-       if (pos == (SMB_OFF_T)-1) {
+       if (pos == (off_t)-1) {
                printf("lseek: error=%d (%s)\n", errno, strerror(errno));
                return NT_STATUS_UNSUCCESSFUL;
        }
@@ -936,7 +965,7 @@ static NTSTATUS cmd_utime(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc,
 static NTSTATUS cmd_ftruncate(struct vfs_state *vfs, TALLOC_CTX *mem_ctx, int argc, const char **argv)
 {
        int fd;
-       SMB_OFF_T off;
+       off_t off;
        if (argc != 3) {
                printf("Usage: ftruncate <fd> <length>\n");
                return NT_STATUS_OK;