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 /****************************************************************************
25 run a file if it is a magic script
26 ****************************************************************************/
27 static void check_magic(files_struct *fsp,connection_struct *conn)
29 if (!*lp_magicscript(SNUM(conn)))
32 DEBUG(5,("checking magic for %s\n",fsp->fsp_name));
36 if (!(p = strrchr_m(fsp->fsp_name,'/')))
41 if (!strequal(lp_magicscript(SNUM(conn)),p))
52 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,&tmp_fd);
60 DEBUG(3,("Invoking magic command %s gave %d\n",fname,ret));
62 if (ret != 0 || tmp_fd == -1) {
67 outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
73 if (sys_fstat(tmp_fd,&st) == -1) {
79 transfer_file(tmp_fd,outfd,st.st_size);
85 /****************************************************************************
86 Common code to close a file or a directory.
87 ****************************************************************************/
89 static int close_filestruct(files_struct *fsp)
91 connection_struct *conn = fsp->conn;
94 if(flush_write_cache(fsp, CLOSE_FLUSH) == -1)
97 delete_write_cache(fsp);
99 fsp->is_directory = False;
100 fsp->stat_open = False;
102 conn->num_files_open--;
107 /****************************************************************************
110 If normal_close is 1 then this came from a normal SMBclose (or equivalent)
111 operation otherwise it came as the result of some other operation such as
112 the closing of the connection. In the latter case printing and
113 magic scripts are not run.
114 ****************************************************************************/
116 static int close_normal_file(files_struct *fsp, BOOL normal_close)
118 share_mode_entry *share_entry = NULL;
119 size_t share_entry_count = 0;
120 BOOL delete_on_close = False;
121 connection_struct *conn = fsp->conn;
125 remove_pending_lock_requests_by_fid(fsp);
128 * If we're flushing on a close we can get a write
129 * error here, we must remember this.
132 if (close_filestruct(fsp) == -1)
135 if (fsp->print_file) {
136 print_fsp_end(fsp, normal_close);
142 * Lock the share entries, and determine if we should delete
143 * on close. If so delete whilst the lock is still in effect.
144 * This prevents race conditions with the file being created. JRA.
147 lock_share_entry_fsp(fsp);
148 share_entry_count = del_share_mode(fsp, &share_entry);
150 DEBUG(10,("close_normal_file: share_entry_count = %d for file %s\n",
151 share_entry_count, fsp->fsp_name ));
154 * We delete on close if it's the last open, and the
155 * delete on close flag was set in the entry we just deleted.
158 if ((share_entry_count == 0) && share_entry &&
159 GET_DELETE_ON_CLOSE_FLAG(share_entry->share_mode) )
160 delete_on_close = True;
162 SAFE_FREE(share_entry);
165 * NT can set delete_on_close of the last open
166 * reference to a file.
169 if (normal_close && delete_on_close) {
170 DEBUG(5,("close_file: file %s. Delete on close was set - deleting file.\n",
172 if(fsp->conn->vfs_ops.unlink(conn,fsp->fsp_name) != 0) {
174 * This call can potentially fail as another smbd may have
175 * had the file open with delete on close set and deleted
176 * it when its last reference to this file went away. Hence
177 * we log this but not at debug level zero.
180 DEBUG(5,("close_file: file %s. Delete on close was set and unlink failed \
181 with error %s\n", fsp->fsp_name, strerror(errno) ));
185 unlock_share_entry_fsp(fsp);
187 if(EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type))
188 release_file_oplock(fsp);
190 locking_close_file(fsp);
192 err = fd_close(conn, fsp);
194 /* check for magic scripts */
196 check_magic(fsp,conn);
200 DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
201 conn->user,fsp->fsp_name,
202 conn->num_files_open, err ? strerror(err) : ""));
205 string_free(&fsp->fsp_name);
210 if (err == -1 || err1 == -1)
216 /****************************************************************************
217 Close a directory opened by an NT SMB call.
218 ****************************************************************************/
220 static int close_directory(files_struct *fsp, BOOL normal_close)
222 remove_pending_change_notify_requests_by_fid(fsp);
225 * NT can set delete_on_close of the last open
226 * reference to a directory also.
229 if (normal_close && fsp->directory_delete_on_close) {
230 BOOL ok = rmdir_internals(fsp->conn, fsp->fsp_name);
231 DEBUG(5,("close_directory: %s. Delete on close was set - deleting directory %s.\n",
232 fsp->fsp_name, ok ? "succeeded" : "failed" ));
235 * Ensure we remove any change notify requests that would
236 * now fail as the directory has been deleted.
240 remove_pending_change_notify_requests_by_filename(fsp);
244 * Do the code common to files and directories.
246 close_filestruct(fsp);
249 string_free(&fsp->fsp_name);
256 /****************************************************************************
257 Close a file opened with null permissions in order to read permissions.
258 ****************************************************************************/
260 static int close_statfile(files_struct *fsp, BOOL normal_close)
262 close_filestruct(fsp);
265 string_free(&fsp->fsp_name);
272 /****************************************************************************
273 Close a directory opened by an NT SMB call.
274 ****************************************************************************/
276 int close_file(files_struct *fsp, BOOL normal_close)
278 if(fsp->is_directory)
279 return close_directory(fsp, normal_close);
280 else if(fsp->stat_open)
281 return close_statfile(fsp, normal_close);
282 return close_normal_file(fsp, normal_close);