r20931: This changes the notify infrastructure from a polling-based to an event-driven
[samba.git] / source / smbd / close.c
1 /* 
2    Unix SMB/CIFS implementation.
3    file closing
4    Copyright (C) Andrew Tridgell 1992-1998
5    Copyright (C) Jeremy Allison 1992-2004.
6    Copyright (C) Volker Lendecke 2005
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #include "includes.h"
24
25 extern struct current_user current_user;
26
27 /****************************************************************************
28  Run a file if it is a magic script.
29 ****************************************************************************/
30
31 static void check_magic(files_struct *fsp,connection_struct *conn)
32 {
33         if (!*lp_magicscript(SNUM(conn)))
34                 return;
35
36         DEBUG(5,("checking magic for %s\n",fsp->fsp_name));
37
38         {
39                 char *p;
40                 if (!(p = strrchr_m(fsp->fsp_name,'/')))
41                         p = fsp->fsp_name;
42                 else
43                         p++;
44
45                 if (!strequal(lp_magicscript(SNUM(conn)),p))
46                         return;
47         }
48
49         {
50                 int ret;
51                 pstring magic_output;
52                 pstring fname;
53                 SMB_STRUCT_STAT st;
54                 int tmp_fd, outfd;
55
56                 pstrcpy(fname,fsp->fsp_name);
57                 if (*lp_magicoutput(SNUM(conn)))
58                         pstrcpy(magic_output,lp_magicoutput(SNUM(conn)));
59                 else
60                         slprintf(magic_output,sizeof(fname)-1, "%s.out",fname);
61
62                 chmod(fname,0755);
63                 ret = smbrun(fname,&tmp_fd);
64                 DEBUG(3,("Invoking magic command %s gave %d\n",fname,ret));
65                 unlink(fname);
66                 if (ret != 0 || tmp_fd == -1) {
67                         if (tmp_fd != -1)
68                                 close(tmp_fd);
69                         return;
70                 }
71                 outfd = open(magic_output, O_CREAT|O_EXCL|O_RDWR, 0600);
72                 if (outfd == -1) {
73                         close(tmp_fd);
74                         return;
75                 }
76
77                 if (sys_fstat(tmp_fd,&st) == -1) {
78                         close(tmp_fd);
79                         close(outfd);
80                         return;
81                 }
82
83                 transfer_file(tmp_fd,outfd,(SMB_OFF_T)st.st_size);
84                 close(tmp_fd);
85                 close(outfd);
86         }
87 }
88
89 /****************************************************************************
90   Common code to close a file or a directory.
91 ****************************************************************************/
92
93 static int close_filestruct(files_struct *fsp)
94 {   
95         connection_struct *conn = fsp->conn;
96         int ret = 0;
97     
98         if (fsp->fh->fd != -1) {
99                 if(flush_write_cache(fsp, CLOSE_FLUSH) == -1)
100                         ret = -1;
101
102                 delete_write_cache(fsp);
103         }
104
105         conn->num_files_open--;
106         SAFE_FREE(fsp->wbmpx_ptr);
107
108         return ret;
109 }    
110
111 /****************************************************************************
112  If any deferred opens are waiting on this close, notify them.
113 ****************************************************************************/
114
115 static void notify_deferred_opens(struct share_mode_lock *lck)
116 {
117         int i;
118  
119         for (i=0; i<lck->num_share_modes; i++) {
120                 struct share_mode_entry *e = &lck->share_modes[i];
121  
122                 if (!is_deferred_open_entry(e)) {
123                         continue;
124                 }
125  
126                 if (procid_is_me(&e->pid)) {
127                         /*
128                          * We need to notify ourself to retry the open.  Do
129                          * this by finding the queued SMB record, moving it to
130                          * the head of the queue and changing the wait time to
131                          * zero.
132                          */
133                         schedule_deferred_open_smb_message(e->op_mid);
134                 } else {
135                         char msg[MSG_SMB_SHARE_MODE_ENTRY_SIZE];
136
137                         share_mode_entry_to_message(msg, e);
138
139                         message_send_pid(e->pid, MSG_SMB_OPEN_RETRY,
140                                          msg, MSG_SMB_SHARE_MODE_ENTRY_SIZE, True);
141                 }
142         }
143 }
144
145 /****************************************************************************
146  Deal with removing a share mode on last close.
147 ****************************************************************************/
148
149 static NTSTATUS close_remove_share_mode(files_struct *fsp,
150                                         enum file_close_type close_type)
151 {
152         connection_struct *conn = fsp->conn;
153         BOOL delete_file = False;
154         struct share_mode_lock *lck;
155         SMB_STRUCT_STAT sbuf;
156         NTSTATUS status = NT_STATUS_OK;
157
158         /*
159          * Lock the share entries, and determine if we should delete
160          * on close. If so delete whilst the lock is still in effect.
161          * This prevents race conditions with the file being created. JRA.
162          */
163
164         lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
165
166         if (lck == NULL) {
167                 DEBUG(0, ("close_remove_share_mode: Could not get share mode "
168                           "lock for file %s\n", fsp->fsp_name));
169                 return NT_STATUS_INVALID_PARAMETER;
170         }
171
172         if (!del_share_mode(lck, fsp)) {
173                 DEBUG(0, ("close_remove_share_mode: Could not delete share "
174                           "entry for file %s\n", fsp->fsp_name));
175         }
176
177         if (fsp->initial_delete_on_close && (lck->delete_token == NULL)) {
178                 BOOL became_user = False;
179
180                 /* Initial delete on close was set and no one else
181                  * wrote a real delete on close. */
182
183                 if (current_user.vuid != fsp->vuid) {
184                         become_user(conn, fsp->vuid);
185                         became_user = True;
186                 }
187                 set_delete_on_close_lck(lck, True, &current_user.ut);
188                 if (became_user) {
189                         unbecome_user();
190                 }
191         }
192
193         delete_file = lck->delete_on_close;
194
195         if (delete_file) {
196                 int i;
197                 /* See if others still have the file open. If this is the
198                  * case, then don't delete */
199                 for (i=0; i<lck->num_share_modes; i++) {
200                         if (is_valid_share_mode_entry(&lck->share_modes[i])) {
201                                 delete_file = False;
202                                 break;
203                         }
204                 }
205         }
206
207         /* Notify any deferred opens waiting on this close. */
208         notify_deferred_opens(lck);
209         reply_to_oplock_break_requests(fsp);
210
211         /*
212          * NT can set delete_on_close of the last open
213          * reference to a file.
214          */
215
216         if (!(close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE)
217             || !delete_file
218             || (lck->delete_token == NULL)) {
219                 TALLOC_FREE(lck);
220                 return NT_STATUS_OK;
221         }
222
223         /*
224          * Ok, we have to delete the file
225          */
226
227         DEBUG(5,("close_remove_share_mode: file %s. Delete on close was set "
228                  "- deleting file.\n", fsp->fsp_name));
229
230         /* Become the user who requested the delete. */
231
232         if (!push_sec_ctx()) {
233                 smb_panic("close_remove_share_mode: file %s. failed to push "
234                           "sec_ctx.\n");
235         }
236
237         set_sec_ctx(lck->delete_token->uid,
238                     lck->delete_token->gid,
239                     lck->delete_token->ngroups,
240                     lck->delete_token->groups,
241                     NULL);
242
243         /* We can only delete the file if the name we have is still valid and
244            hasn't been renamed. */
245         
246         if(SMB_VFS_STAT(conn,fsp->fsp_name,&sbuf) != 0) {
247                 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
248                          "was set and stat failed with error %s\n",
249                          fsp->fsp_name, strerror(errno) ));
250                 /*
251                  * Don't save the errno here, we ignore this error
252                  */
253                 goto done;
254         }
255
256         if(sbuf.st_dev != fsp->dev || sbuf.st_ino != fsp->inode) {
257                 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
258                          "was set and dev and/or inode does not match\n",
259                          fsp->fsp_name ));
260                 DEBUG(5,("close_remove_share_mode: file %s. stored dev = %x, "
261                          "inode = %.0f stat dev = %x, inode = %.0f\n",
262                          fsp->fsp_name,
263                          (unsigned int)fsp->dev, (double)fsp->inode,
264                          (unsigned int)sbuf.st_dev, (double)sbuf.st_ino ));
265                 /*
266                  * Don't save the errno here, we ignore this error
267                  */
268                 goto done;
269         }
270
271         if (SMB_VFS_UNLINK(conn,fsp->fsp_name) != 0) {
272                 /*
273                  * This call can potentially fail as another smbd may
274                  * have had the file open with delete on close set and
275                  * deleted it when its last reference to this file
276                  * went away. Hence we log this but not at debug level
277                  * zero.
278                  */
279
280                 DEBUG(5,("close_remove_share_mode: file %s. Delete on close "
281                          "was set and unlink failed with error %s\n",
282                          fsp->fsp_name, strerror(errno) ));
283
284                 status = map_nt_error_from_unix(errno);
285                 goto done;
286         }
287
288         status = NT_STATUS_FILE_DELETED;
289
290  done:
291         /* unbecome user. */
292         pop_sec_ctx();
293         
294         TALLOC_FREE(lck);
295         return status;
296 }
297
298 /****************************************************************************
299  Close a file.
300
301  close_type can be NORMAL_CLOSE=0,SHUTDOWN_CLOSE,ERROR_CLOSE.
302  printing and magic scripts are only run on normal close.
303  delete on close is done on normal and shutdown close.
304 ****************************************************************************/
305
306 static int close_normal_file(files_struct *fsp, enum file_close_type close_type)
307 {
308         connection_struct *conn = fsp->conn;
309         int saved_errno = 0;
310         int err = 0;
311         int err1 = 0;
312
313         if (fsp->aio_write_behind) {
314                 /*
315                  * If we're finishing write behind on a close we can get a write
316                  * error here, we must remember this.
317                  */
318                 int ret = wait_for_aio_completion(fsp);
319                 if (ret) {
320                         saved_errno = ret;
321                         err1 = -1;
322                 }
323         } else {
324                 cancel_aio_by_fsp(fsp);
325         }
326  
327         /*
328          * If we're flushing on a close we can get a write
329          * error here, we must remember this.
330          */
331
332         if (close_filestruct(fsp) == -1) {
333                 saved_errno = errno;
334                 err1 = -1;
335         }
336
337         if (fsp->print_file) {
338                 print_fsp_end(fsp, close_type);
339                 file_free(fsp);
340                 return 0;
341         }
342
343         /* If this is an old DOS or FCB open and we have multiple opens on
344            the same handle we only have one share mode. Ensure we only remove
345            the share mode on the last close. */
346
347         if (fsp->fh->ref_count == 1) {
348                 /* Should we return on error here... ? */
349                 close_remove_share_mode(fsp, close_type);
350         }
351
352         if(fsp->oplock_type) {
353                 release_file_oplock(fsp);
354         }
355
356         locking_close_file(fsp);
357
358         err = fd_close(conn, fsp);
359
360         /* Only save errno if fd_close failed and we don't already
361            have an errno saved from a flush call. */
362         if ((err1 != -1) && (err == -1)) {
363                 saved_errno = errno;
364         }
365
366         /* check for magic scripts */
367         if (close_type == NORMAL_CLOSE) {
368                 check_magic(fsp,conn);
369         }
370
371         /*
372          * Ensure pending modtime is set after close.
373          */
374
375         if(fsp->pending_modtime && fsp->pending_modtime_owner) {
376                 set_filetime(conn, fsp->fsp_name, fsp->pending_modtime);
377         } else if (fsp->last_write_time) {
378                 set_filetime(conn, fsp->fsp_name, fsp->last_write_time);
379         }
380
381         DEBUG(2,("%s closed file %s (numopen=%d) %s\n",
382                 conn->user,fsp->fsp_name,
383                 conn->num_files_open,
384                 (err == -1 || err1 == -1) ? strerror(saved_errno) : ""));
385
386         file_free(fsp);
387
388         if (err == -1 || err1 == -1) {
389                 errno = saved_errno;
390                 return saved_errno;
391         } else {
392                 return 0;
393         }
394 }
395
396 /****************************************************************************
397  Close a directory opened by an NT SMB call. 
398 ****************************************************************************/
399   
400 static int close_directory(files_struct *fsp, enum file_close_type close_type)
401 {
402         struct share_mode_lock *lck = 0;
403         BOOL delete_dir = False;
404
405         /*
406          * NT can set delete_on_close of the last open
407          * reference to a directory also.
408          */
409
410         lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
411
412         if (lck == NULL) {
413                 DEBUG(0, ("close_directory: Could not get share mode lock for %s\n", fsp->fsp_name));
414                 return EINVAL;
415         }
416
417         if (!del_share_mode(lck, fsp)) {
418                 DEBUG(0, ("close_directory: Could not delete share entry for %s\n", fsp->fsp_name));
419         }
420
421         if (fsp->initial_delete_on_close) {
422                 BOOL became_user = False;
423
424                 /* Initial delete on close was set - for
425                  * directories we don't care if anyone else
426                  * wrote a real delete on close. */
427
428                 if (current_user.vuid != fsp->vuid) {
429                         become_user(fsp->conn, fsp->vuid);
430                         became_user = True;
431                 }
432                 send_stat_cache_delete_message(fsp->fsp_name);
433                 set_delete_on_close_lck(lck, True, &current_user.ut);
434                 if (became_user) {
435                         unbecome_user();
436                 }
437         }
438
439         delete_dir = lck->delete_on_close;
440
441         if (delete_dir) {
442                 int i;
443                 /* See if others still have the dir open. If this is the
444                  * case, then don't delete */
445                 for (i=0; i<lck->num_share_modes; i++) {
446                         if (is_valid_share_mode_entry(&lck->share_modes[i])) {
447                                 delete_dir = False;
448                                 break;
449                         }
450                 }
451         }
452
453         if ((close_type == NORMAL_CLOSE || close_type == SHUTDOWN_CLOSE) &&
454                                 delete_dir &&
455                                 lck->delete_token) {
456                 BOOL ok;
457         
458                 /* Become the user who requested the delete. */
459
460                 if (!push_sec_ctx()) {
461                         smb_panic("close_directory: failed to push sec_ctx.\n");
462                 }
463
464                 set_sec_ctx(lck->delete_token->uid,
465                                 lck->delete_token->gid,
466                                 lck->delete_token->ngroups,
467                                 lck->delete_token->groups,
468                                 NULL);
469
470                 TALLOC_FREE(lck);
471
472                 ok = rmdir_internals(fsp->conn, fsp->fsp_name);
473
474                 DEBUG(5,("close_directory: %s. Delete on close was set - deleting directory %s.\n",
475                         fsp->fsp_name, ok ? "succeeded" : "failed" ));
476
477                 /* unbecome user. */
478                 pop_sec_ctx();
479
480                 /*
481                  * Ensure we remove any change notify requests that would
482                  * now fail as the directory has been deleted.
483                  */
484
485                 if(ok) {
486                         remove_pending_change_notify_requests_by_fid(fsp, NT_STATUS_DELETE_PENDING);
487                 }
488         } else {
489                 TALLOC_FREE(lck);
490                 remove_pending_change_notify_requests_by_fid(
491                         fsp, NT_STATUS_OK);
492         }
493
494         /*
495          * Do the code common to files and directories.
496          */
497         close_filestruct(fsp);
498         file_free(fsp);
499         return 0;
500 }
501
502 /****************************************************************************
503  Close a 'stat file' opened internally.
504 ****************************************************************************/
505   
506 static int close_stat(files_struct *fsp)
507 {
508         /*
509          * Do the code common to files and directories.
510          */
511         close_filestruct(fsp);
512         file_free(fsp);
513         return 0;
514 }
515
516 /****************************************************************************
517  Close a files_struct.
518 ****************************************************************************/
519   
520 int close_file(files_struct *fsp, enum file_close_type close_type)
521 {
522         if(fsp->is_directory)
523                 return close_directory(fsp, close_type);
524         else if (fsp->is_stat)
525                 return close_stat(fsp);
526         else if (fsp->fake_file_handle != NULL)
527                 return close_fake_file(fsp);
528         else
529                 return close_normal_file(fsp, close_type);
530 }