2 Unix SMB/Netbios implementation.
5 Copyright (C) Andrew Tridgell 1992-1998
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 extern int DEBUGLEVEL;
26 /****************************************************************************
27 run a file if it is a magic script
28 ****************************************************************************/
29 static void check_magic(files_struct *fsp,connection_struct *conn)
31 if (!*lp_magicscript(SNUM(conn)))
34 DEBUG(5,("checking magic for %s\n",fsp->fsp_name));
38 if (!(p = strrchr(fsp->fsp_name,'/')))
43 if (!strequal(lp_magicscript(SNUM(conn)),p))
51 pstrcpy(fname,fsp->fsp_name);
53 if (*lp_magicoutput(SNUM(conn)))
54 pstrcpy(magic_output,lp_magicoutput(SNUM(conn)));
56 slprintf(magic_output,sizeof(fname)-1, "%s.out",fname);
59 ret = smbrun(fname,magic_output,False);
60 DEBUG(3,("Invoking magic command %s gave %d\n",fname,ret));
65 /****************************************************************************
66 Common code to close a file or a directory.
67 ****************************************************************************/
69 static int close_filestruct(files_struct *fsp)
71 connection_struct *conn = fsp->conn;
74 if(flush_write_cache(fsp, CLOSE_FLUSH) == -1)
77 delete_write_cache(fsp);
79 fsp->is_directory = False;
80 fsp->stat_open = False;
82 conn->num_files_open--;
84 free((char *)fsp->wbmpx_ptr);
85 fsp->wbmpx_ptr = NULL;
91 /****************************************************************************
92 Close a file - possibly invalidating the read prediction.
94 If normal_close is 1 then this came from a normal SMBclose (or equivalent)
95 operation otherwise it came as the result of some other operation such as
96 the closing of the connection. In the latter case printing and
97 magic scripts are not run.
98 ****************************************************************************/
100 static int close_normal_file(files_struct *fsp, BOOL normal_close)
102 BOOL delete_on_close = fsp->delete_on_close;
103 connection_struct *conn = fsp->conn;
107 remove_pending_lock_requests_by_fid(fsp);
110 * If we're flushing on a close we can get a write
111 * error here, we must remember this.
114 if (close_filestruct(fsp) == -1)
117 if (fsp->print_file) {
118 print_fsp_end(fsp, normal_close);
123 lock_share_entry_fsp(fsp);
125 unlock_share_entry_fsp(fsp);
127 if(EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type))
128 release_file_oplock(fsp);
130 locking_close_file(fsp);
132 err = fd_close(conn, fsp);
134 /* check for magic scripts */
136 check_magic(fsp,conn);
140 * NT can set delete_on_close of the last open
141 * reference to a file.
144 if (normal_close && delete_on_close) {
145 DEBUG(5,("close_file: file %s. Delete on close was set - deleting file.\n",
147 if(fsp->conn->vfs_ops.unlink(conn,dos_to_unix(fsp->fsp_name, False)) != 0) {
149 * This call can potentially fail as another smbd may have
150 * had the file open with delete on close set and deleted
151 * it when its last reference to this file went away. Hence
152 * we log this but not at debug level zero.
155 DEBUG(5,("close_file: file %s. Delete on close was set and unlink failed \
156 with error %s\n", fsp->fsp_name, strerror(errno) ));
160 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
161 conn->user,fsp->fsp_name,
162 conn->num_files_open, err ? strerror(err) : ""));
165 string_free(&fsp->fsp_name);
170 if (err == -1 || err1 == -1)
176 /****************************************************************************
177 Close a directory opened by an NT SMB call.
178 ****************************************************************************/
180 static int close_directory(files_struct *fsp, BOOL normal_close)
182 remove_pending_change_notify_requests_by_fid(fsp);
185 * NT can set delete_on_close of the last open
186 * reference to a directory also.
189 if (normal_close && fsp->directory_delete_on_close) {
190 BOOL ok = rmdir_internals(fsp->conn, fsp->fsp_name);
191 DEBUG(5,("close_directory: %s. Delete on close was set - deleting directory %s.\n",
192 fsp->fsp_name, ok ? "succeeded" : "failed" ));
195 * Ensure we remove any change notify requests that would
196 * now fail as the directory has been deleted.
200 remove_pending_change_notify_requests_by_filename(fsp);
204 * Do the code common to files and directories.
206 close_filestruct(fsp);
209 string_free(&fsp->fsp_name);
216 /****************************************************************************
217 Close a file opened with null permissions in order to read permissions.
218 ****************************************************************************/
220 static int close_statfile(files_struct *fsp, BOOL normal_close)
222 close_filestruct(fsp);
225 string_free(&fsp->fsp_name);
232 /****************************************************************************
233 Close a directory opened by an NT SMB call.
234 ****************************************************************************/
236 int close_file(files_struct *fsp, BOOL normal_close)
238 if(fsp->is_directory)
239 return close_directory(fsp, normal_close);
240 else if(fsp->stat_open)
241 return close_statfile(fsp, normal_close);
242 return close_normal_file(fsp, normal_close);