s3: Plumb smb_filename through open_fake_file
authorTim Prouty <tprouty@samba.org>
Fri, 10 Jul 2009 22:43:21 +0000 (15:43 -0700)
committerTim Prouty <tprouty@samba.org>
Tue, 21 Jul 2009 00:26:57 +0000 (17:26 -0700)
source3/include/proto.h
source3/smbd/fake_file.c
source3/smbd/open.c

index c26f2a7c3aef769e0caea7181e0bfec7bfcd40be..c48cebce1156da374cef0d3151dbf826a33f4ea9 100644 (file)
@@ -6266,11 +6266,11 @@ void reply_openerror(struct smb_request *req, NTSTATUS status);
 
 /* The following definitions come from smbd/fake_file.c  */
 
-enum FAKE_FILE_TYPE is_fake_file(const char *fname);
+enum FAKE_FILE_TYPE is_fake_file(const struct smb_filename *smb_fname);
 NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
                                uint16_t current_vuid,
                                enum FAKE_FILE_TYPE fake_file_type,
-                               const char *fname,
+                               const struct smb_filename *smb_fname,
                                uint32 access_mask,
                                files_struct **result);
 NTSTATUS close_fake_file(struct smb_request *req, files_struct *fsp);
index ef54398bc451338768b83a9436ed6106305a8b21..743d88f360c6d27d098c3611b01a4badf5cde7b4 100644 (file)
@@ -71,23 +71,32 @@ static struct fake_file_handle *init_fake_file_handle(enum FAKE_FILE_TYPE type)
  Does this name match a fake filename ?
 ****************************************************************************/
 
-enum FAKE_FILE_TYPE is_fake_file(const char *fname)
+enum FAKE_FILE_TYPE is_fake_file(const struct smb_filename *smb_fname)
 {
 #ifdef HAVE_SYS_QUOTAS
        int i;
+       char *fname = NULL;
+       NTSTATUS status;
 #endif
 
-       if (!fname) {
+       if (!smb_fname) {
                return FAKE_FILE_TYPE_NONE;
        }
 
 #ifdef HAVE_SYS_QUOTAS
+       status = get_full_smb_filename(talloc_tos(), smb_fname, &fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               return FAKE_FILE_TYPE_NONE;
+       }
+
        for (i=0;fake_files[i].name!=NULL;i++) {
                if (strncmp(fname,fake_files[i].name,strlen(fake_files[i].name))==0) {
                        DEBUG(5,("is_fake_file: [%s] is a fake file\n",fname));
+                       TALLOC_FREE(fname);
                        return fake_files[i].type;
                }
        }
+       TALLOC_FREE(fname);
 #endif
 
        return FAKE_FILE_TYPE_NONE;
@@ -101,7 +110,7 @@ enum FAKE_FILE_TYPE is_fake_file(const char *fname)
 NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
                                uint16_t current_vuid,
                                enum FAKE_FILE_TYPE fake_file_type,
-                               const char *fname,
+                               const struct smb_filename *smb_fname,
                                uint32 access_mask,
                                files_struct **result)
 {
@@ -112,7 +121,8 @@ NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
        if (conn->server_info->utok.uid != 0) {
                DEBUG(3, ("open_fake_file_shared: access_denied to "
                          "service[%s] file[%s] user[%s]\n",
-                         lp_servicename(SNUM(conn)), fname,
+                         lp_servicename(SNUM(conn)),
+                         smb_fname_str_dbg(smb_fname),
                          conn->server_info->unix_name));
                return NT_STATUS_ACCESS_DENIED;
 
@@ -124,7 +134,8 @@ NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
        }
 
        DEBUG(5,("open_fake_file_shared: fname = %s, FID = %d, access_mask = 0x%x\n",
-               fname, fsp->fnum, (unsigned int)access_mask));
+                smb_fname_str_dbg(smb_fname), fsp->fnum,
+                (unsigned int)access_mask));
 
        fsp->conn = conn;
        fsp->fh->fd = -1;
@@ -132,8 +143,12 @@ NTSTATUS open_fake_file(struct smb_request *req, connection_struct *conn,
        fsp->fh->pos = -1;
        fsp->can_lock = False; /* Should this be true ? - No, JRA */
        fsp->access_mask = access_mask;
-       string_set(&fsp->fsp_name,fname);
-       
+       status = fsp_set_smb_fname(fsp, smb_fname);
+       if (!NT_STATUS_IS_OK(status)) {
+               file_free(req, fsp);
+               return NT_STATUS_NO_MEMORY;
+       }
+
        fsp->fake_file_handle = init_fake_file_handle(fake_file_type);
        
        if (fsp->fake_file_handle==NULL) {
index 33763d202de8322e3ba2200a454a9ea058dec260..7692c7c8471874288dd52dbc644f54da181a0b88 100644 (file)
@@ -3462,16 +3462,9 @@ NTSTATUS create_file_default(connection_struct *conn,
         */
 
        if (is_ntfs_stream_smb_fname(smb_fname)) {
-               char *fname = NULL;
                enum FAKE_FILE_TYPE fake_file_type;
 
-               status = get_full_smb_filename(talloc_tos(), smb_fname,
-                                              &fname);
-               if (!NT_STATUS_IS_OK(status)) {
-                       goto fail;
-               }
-
-               fake_file_type = is_fake_file(fname);
+               fake_file_type = is_fake_file(smb_fname);
 
                if (fake_file_type != FAKE_FILE_TYPE_NONE) {
 
@@ -3487,9 +3480,8 @@ NTSTATUS create_file_default(connection_struct *conn,
                         * close it
                         */
                        status = open_fake_file(req, conn, req->vuid,
-                                               fake_file_type, fname,
+                                               fake_file_type, smb_fname,
                                                access_mask, &fsp);
-                       TALLOC_FREE(fname);
                        if (!NT_STATUS_IS_OK(status)) {
                                goto fail;
                        }
@@ -3497,7 +3489,6 @@ NTSTATUS create_file_default(connection_struct *conn,
                        ZERO_STRUCT(smb_fname->st);
                        goto done;
                }
-               TALLOC_FREE(fname);
 
                if (!(conn->fs_capabilities & FILE_NAMED_STREAMS)) {
                        status = NT_STATUS_OBJECT_NAME_NOT_FOUND;