r17924: Get rid of warnings now that talloc is merged.
[samba.git] / source3 / locking / locking.c
1 /* 
2    Unix SMB/CIFS implementation.
3    Locking functions
4    Copyright (C) Andrew Tridgell 1992-2000
5    Copyright (C) Jeremy Allison 1992-2006
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    Revision History:
23
24    12 aug 96: Erik.Devriendt@te6.siemens.be
25    added support for shared memory implementation of share mode locking
26
27    May 1997. Jeremy Allison (jallison@whistle.com). Modified share mode
28    locking to deal with multiple share modes per open file.
29
30    September 1997. Jeremy Allison (jallison@whistle.com). Added oplock
31    support.
32
33    rewrtten completely to use new tdb code. Tridge, Dec '99
34
35    Added POSIX locking support. Jeremy Allison (jeremy@valinux.com), Apr. 2000.
36    Added Unix Extensions POSIX locking support. Jeremy Allison Mar 2006.
37 */
38
39 #include "includes.h"
40
41 #undef DBGC_CLASS
42 #define DBGC_CLASS DBGC_LOCKING
43
44 /* the locking database handle */
45 static TDB_CONTEXT *tdb;
46
47 /****************************************************************************
48  Debugging aids :-).
49 ****************************************************************************/
50
51 const char *lock_type_name(enum brl_type lock_type)
52 {
53         switch (lock_type) {
54                 case READ_LOCK:
55                         return "READ";
56                 case WRITE_LOCK:
57                         return "WRITE";
58                 case PENDING_READ_LOCK:
59                         return "PENDING_READ";
60                 case PENDING_WRITE_LOCK:
61                         return "PENDING_WRITE";
62                 default:
63                         return "other";
64         }
65 }
66
67 const char *lock_flav_name(enum brl_flavour lock_flav)
68 {
69         return (lock_flav == WINDOWS_LOCK) ? "WINDOWS_LOCK" : "POSIX_LOCK";
70 }
71
72 /****************************************************************************
73  Utility function called to see if a file region is locked.
74  Called in the read/write codepath.
75 ****************************************************************************/
76
77 BOOL is_locked(files_struct *fsp,
78                 uint32 smbpid,
79                 SMB_BIG_UINT count,
80                 SMB_BIG_UINT offset, 
81                 enum brl_type lock_type)
82 {
83         int snum = SNUM(fsp->conn);
84         int strict_locking = lp_strict_locking(snum);
85         enum brl_flavour lock_flav = lp_posix_cifsu_locktype();
86         BOOL ret = True;
87         
88         if (count == 0) {
89                 return False;
90         }
91
92         if (!lp_locking(snum) || !strict_locking) {
93                 return False;
94         }
95
96         if (strict_locking == Auto) {
97                 if  (EXCLUSIVE_OPLOCK_TYPE(fsp->oplock_type) && (lock_type == READ_LOCK || lock_type == WRITE_LOCK)) {
98                         DEBUG(10,("is_locked: optimisation - exclusive oplock on file %s\n", fsp->fsp_name ));
99                         ret = False;
100                 } else if ((fsp->oplock_type == LEVEL_II_OPLOCK) &&
101                            (lock_type == READ_LOCK)) {
102                         DEBUG(10,("is_locked: optimisation - level II oplock on file %s\n", fsp->fsp_name ));
103                         ret = False;
104                 } else {
105                         struct byte_range_lock *br_lck = brl_get_locks_readonly(NULL, fsp);
106                         if (!br_lck) {
107                                 return False;
108                         }
109                         ret = !brl_locktest(br_lck,
110                                         smbpid,
111                                         procid_self(),
112                                         offset,
113                                         count,
114                                         lock_type,
115                                         lock_flav);
116                         TALLOC_FREE(br_lck);
117                 }
118         } else {
119                 struct byte_range_lock *br_lck = brl_get_locks_readonly(NULL, fsp);
120                 if (!br_lck) {
121                         return False;
122                 }
123                 ret = !brl_locktest(br_lck,
124                                 smbpid,
125                                 procid_self(),
126                                 offset,
127                                 count,
128                                 lock_type,
129                                 lock_flav);
130                 TALLOC_FREE(br_lck);
131         }
132
133         DEBUG(10,("is_locked: flavour = %s brl start=%.0f len=%.0f %s for fnum %d file %s\n",
134                         lock_flav_name(lock_flav),
135                         (double)offset, (double)count, ret ? "locked" : "unlocked",
136                         fsp->fnum, fsp->fsp_name ));
137
138         return ret;
139 }
140
141 /****************************************************************************
142  Find out if a lock could be granted - return who is blocking us if we can't.
143 ****************************************************************************/
144
145 NTSTATUS query_lock(files_struct *fsp,
146                         uint32 *psmbpid,
147                         SMB_BIG_UINT *pcount,
148                         SMB_BIG_UINT *poffset,
149                         enum brl_type *plock_type,
150                         enum brl_flavour lock_flav)
151 {
152         struct byte_range_lock *br_lck = NULL;
153         NTSTATUS status = NT_STATUS_LOCK_NOT_GRANTED;
154
155         if (!fsp->can_lock) {
156                 return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
157         }
158
159         if (!lp_locking(SNUM(fsp->conn))) {
160                 return NT_STATUS_OK;
161         }
162
163         br_lck = brl_get_locks_readonly(NULL, fsp);
164         if (!br_lck) {
165                 return NT_STATUS_NO_MEMORY;
166         }
167
168         status = brl_lockquery(br_lck,
169                         psmbpid,
170                         procid_self(),
171                         poffset,
172                         pcount,
173                         plock_type,
174                         lock_flav);
175
176         TALLOC_FREE(br_lck);
177         return status;
178 }
179
180 /****************************************************************************
181  Utility function called by locking requests.
182 ****************************************************************************/
183
184 struct byte_range_lock *do_lock(files_struct *fsp,
185                         uint32 lock_pid,
186                         SMB_BIG_UINT count,
187                         SMB_BIG_UINT offset,
188                         enum brl_type lock_type,
189                         enum brl_flavour lock_flav,
190                         BOOL blocking_lock,
191                         NTSTATUS *perr)
192 {
193         struct byte_range_lock *br_lck = NULL;
194
195         if (!fsp->can_lock) {
196                 *perr = fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
197                 return NULL;
198         }
199
200         if (!lp_locking(SNUM(fsp->conn))) {
201                 *perr = NT_STATUS_OK;
202                 return NULL;
203         }
204
205         /* NOTE! 0 byte long ranges ARE allowed and should be stored  */
206
207         DEBUG(10,("do_lock: lock flavour %s lock type %s start=%.0f len=%.0f requested for fnum %d file %s\n",
208                 lock_flav_name(lock_flav), lock_type_name(lock_type),
209                 (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
210
211         br_lck = brl_get_locks(NULL, fsp);
212         if (!br_lck) {
213                 *perr = NT_STATUS_NO_MEMORY;
214                 return NULL;
215         }
216
217         *perr = brl_lock(br_lck,
218                         lock_pid,
219                         procid_self(),
220                         offset,
221                         count, 
222                         lock_type,
223                         lock_flav,
224                         blocking_lock);
225
226         return br_lck;
227 }
228
229 /****************************************************************************
230  Utility function called by unlocking requests.
231 ****************************************************************************/
232
233 NTSTATUS do_unlock(files_struct *fsp,
234                         uint32 lock_pid,
235                         SMB_BIG_UINT count,
236                         SMB_BIG_UINT offset,
237                         enum brl_flavour lock_flav)
238 {
239         BOOL ok = False;
240         struct byte_range_lock *br_lck = NULL;
241         
242         if (!fsp->can_lock) {
243                 return fsp->is_directory ? NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
244         }
245         
246         if (!lp_locking(SNUM(fsp->conn))) {
247                 return NT_STATUS_OK;
248         }
249         
250         DEBUG(10,("do_unlock: unlock start=%.0f len=%.0f requested for fnum %d file %s\n",
251                   (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
252
253         br_lck = brl_get_locks(NULL, fsp);
254         if (!br_lck) {
255                 return NT_STATUS_NO_MEMORY;
256         }
257
258         ok = brl_unlock(br_lck,
259                         lock_pid,
260                         procid_self(),
261                         offset,
262                         count,
263                         lock_flav);
264    
265         TALLOC_FREE(br_lck);
266
267         if (!ok) {
268                 DEBUG(10,("do_unlock: returning ERRlock.\n" ));
269                 return NT_STATUS_RANGE_NOT_LOCKED;
270         }
271
272         return NT_STATUS_OK;
273 }
274
275 /****************************************************************************
276  Cancel any pending blocked locks.
277 ****************************************************************************/
278
279 NTSTATUS do_lock_cancel(files_struct *fsp,
280                         uint32 lock_pid,
281                         SMB_BIG_UINT count,
282                         SMB_BIG_UINT offset,
283                         enum brl_flavour lock_flav)
284 {
285         BOOL ok = False;
286         struct byte_range_lock *br_lck = NULL;
287         
288         if (!fsp->can_lock) {
289                 return fsp->is_directory ?
290                         NT_STATUS_INVALID_DEVICE_REQUEST : NT_STATUS_INVALID_HANDLE;
291         }
292         
293         if (!lp_locking(SNUM(fsp->conn))) {
294                 return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
295         }
296
297         DEBUG(10,("do_lock_cancel: cancel start=%.0f len=%.0f requested for fnum %d file %s\n",
298                   (double)offset, (double)count, fsp->fnum, fsp->fsp_name ));
299
300         br_lck = brl_get_locks(NULL, fsp);
301         if (!br_lck) {
302                 return NT_STATUS_NO_MEMORY;
303         }
304
305         ok = brl_lock_cancel(br_lck,
306                         lock_pid,
307                         procid_self(),
308                         offset,
309                         count,
310                         lock_flav);
311    
312         TALLOC_FREE(br_lck);
313
314         if (!ok) {
315                 DEBUG(10,("do_lock_cancel: returning ERRcancelviolation.\n" ));
316                 return NT_STATUS_DOS(ERRDOS, ERRcancelviolation);
317         }
318
319         return NT_STATUS_OK;
320 }
321
322 /****************************************************************************
323  Remove any locks on this fd. Called from file_close().
324 ****************************************************************************/
325
326 void locking_close_file(files_struct *fsp)
327 {
328         struct byte_range_lock *br_lck;
329
330         if (!lp_locking(SNUM(fsp->conn))) {
331                 return;
332         }
333
334         br_lck = brl_get_locks(NULL,fsp);
335
336         if (br_lck) {
337                 cancel_pending_lock_requests_by_fid(fsp, br_lck);
338                 brl_close_fnum(br_lck);
339                 TALLOC_FREE(br_lck);
340         }
341 }
342
343 /****************************************************************************
344  Initialise the locking functions.
345 ****************************************************************************/
346
347 static int open_read_only;
348
349 BOOL locking_init(int read_only)
350 {
351         brl_init(read_only);
352
353         if (tdb)
354                 return True;
355
356         tdb = tdb_open_log(lock_path("locking.tdb"), 
357                         lp_open_files_db_hash_size(),
358                         TDB_DEFAULT|(read_only?0x0:TDB_CLEAR_IF_FIRST), 
359                         read_only?O_RDONLY:O_RDWR|O_CREAT,
360                         0644);
361
362         if (!tdb) {
363                 DEBUG(0,("ERROR: Failed to initialise locking database\n"));
364                 return False;
365         }
366
367         if (!posix_locking_init(read_only))
368                 return False;
369
370         open_read_only = read_only;
371
372         return True;
373 }
374
375 /*******************************************************************
376  Deinitialize the share_mode management.
377 ******************************************************************/
378
379 BOOL locking_end(void)
380 {
381         BOOL ret = True;
382
383         brl_shutdown(open_read_only);
384         if (tdb) {
385                 if (tdb_close(tdb) != 0)
386                         ret = False;
387         }
388
389         return ret;
390 }
391
392 /*******************************************************************
393  Form a static locking key for a dev/inode pair.
394 ******************************************************************/
395
396 /* key and data records in the tdb locking database */
397 struct locking_key {
398         SMB_DEV_T dev;
399         SMB_INO_T ino;
400 };
401
402 /*******************************************************************
403  Form a static locking key for a dev/inode pair.
404 ******************************************************************/
405
406 static TDB_DATA locking_key(SMB_DEV_T dev, SMB_INO_T inode)
407 {
408         static struct locking_key key;
409         TDB_DATA kbuf;
410
411         memset(&key, '\0', sizeof(key));
412         key.dev = dev;
413         key.ino = inode;
414         kbuf.dptr = (char *)&key;
415         kbuf.dsize = sizeof(key);
416         return kbuf;
417 }
418
419 /*******************************************************************
420  Print out a share mode.
421 ********************************************************************/
422
423 char *share_mode_str(int num, struct share_mode_entry *e)
424 {
425         static pstring share_str;
426
427         slprintf(share_str, sizeof(share_str)-1, "share_mode_entry[%d]: %s "
428                  "pid = %s, share_access = 0x%x, private_options = 0x%x, "
429                  "access_mask = 0x%x, mid = 0x%x, type= 0x%x, file_id = %lu, "
430                  "uid = %u, dev = 0x%x, inode = %.0f",
431                  num,
432                  e->op_type == UNUSED_SHARE_MODE_ENTRY ? "UNUSED" : "",
433                  procid_str_static(&e->pid),
434                  e->share_access, e->private_options,
435                  e->access_mask, e->op_mid, e->op_type, e->share_file_id,
436                  (unsigned int)e->uid, (unsigned int)e->dev, (double)e->inode );
437
438         return share_str;
439 }
440
441 /*******************************************************************
442  Print out a share mode table.
443 ********************************************************************/
444
445 static void print_share_mode_table(struct locking_data *data)
446 {
447         int num_share_modes = data->u.s.num_share_mode_entries;
448         struct share_mode_entry *shares =
449                 (struct share_mode_entry *)(data + 1);
450         int i;
451
452         for (i = 0; i < num_share_modes; i++) {
453                 struct share_mode_entry entry;
454
455                 memcpy(&entry, &shares[i], sizeof(struct share_mode_entry));
456                 DEBUG(10,("print_share_mode_table: %s\n",
457                           share_mode_str(i, &entry)));
458         }
459 }
460
461 /*******************************************************************
462  Get all share mode entries for a dev/inode pair.
463 ********************************************************************/
464
465 static BOOL parse_share_modes(TDB_DATA dbuf, struct share_mode_lock *lck)
466 {
467         struct locking_data *data;
468         int i;
469
470         if (dbuf.dsize < sizeof(struct locking_data)) {
471                 smb_panic("PANIC: parse_share_modes: buffer too short.\n");
472         }
473
474         data = (struct locking_data *)dbuf.dptr;
475
476         lck->delete_on_close = data->u.s.delete_on_close;
477         lck->initial_delete_on_close = data->u.s.initial_delete_on_close;
478         lck->num_share_modes = data->u.s.num_share_mode_entries;
479
480         DEBUG(10, ("parse_share_modes: delete_on_close: %d, "
481                    "initial_delete_on_close: %d, "
482                    "num_share_modes: %d\n",
483                 lck->delete_on_close,
484                 lck->initial_delete_on_close,
485                 lck->num_share_modes));
486
487         if ((lck->num_share_modes < 0) || (lck->num_share_modes > 1000000)) {
488                 DEBUG(0, ("invalid number of share modes: %d\n",
489                           lck->num_share_modes));
490                 smb_panic("PANIC: invalid number of share modes");
491         }
492
493         lck->share_modes = NULL;
494         
495         if (lck->num_share_modes != 0) {
496
497                 if (dbuf.dsize < (sizeof(struct locking_data) +
498                                   (lck->num_share_modes *
499                                    sizeof(struct share_mode_entry)))) {
500                         smb_panic("PANIC: parse_share_modes: buffer too short.\n");
501                 }
502                                   
503                 lck->share_modes = (struct share_mode_entry *)
504                         talloc_memdup(lck, dbuf.dptr+sizeof(*data),
505                                       lck->num_share_modes *
506                                       sizeof(struct share_mode_entry));
507
508                 if (lck->share_modes == NULL) {
509                         smb_panic("talloc failed\n");
510                 }
511         }
512
513         /* Get any delete token. */
514         if (data->u.s.delete_token_size) {
515                 char *p = dbuf.dptr + sizeof(*data) +
516                                 (lck->num_share_modes *
517                                 sizeof(struct share_mode_entry));
518
519                 if ((data->u.s.delete_token_size < sizeof(uid_t) + sizeof(gid_t)) ||
520                                 ((data->u.s.delete_token_size - sizeof(uid_t)) % sizeof(gid_t)) != 0) {
521                         DEBUG(0, ("parse_share_modes: invalid token size %d\n",
522                                 data->u.s.delete_token_size));
523                         smb_panic("parse_share_modes: invalid token size\n");
524                 }
525
526                 lck->delete_token = TALLOC_P(lck, UNIX_USER_TOKEN);
527                 if (!lck->delete_token) {
528                         smb_panic("talloc failed\n");
529                 }
530
531                 /* Copy out the uid and gid. */
532                 memcpy(&lck->delete_token->uid, p, sizeof(uid_t));
533                 p += sizeof(uid_t);
534                 memcpy(&lck->delete_token->gid, p, sizeof(gid_t));
535                 p += sizeof(gid_t);
536
537                 /* Any supplementary groups ? */
538                 lck->delete_token->ngroups = (data->u.s.delete_token_size > (sizeof(uid_t) + sizeof(gid_t))) ?
539                                         ((data->u.s.delete_token_size -
540                                                 (sizeof(uid_t) + sizeof(gid_t)))/sizeof(gid_t)) : 0;
541
542                 if (lck->delete_token->ngroups) {
543                         /* Make this a talloc child of lck->delete_token. */
544                         lck->delete_token->groups = TALLOC_ARRAY(lck->delete_token, gid_t,
545                                                         lck->delete_token->ngroups);
546                         if (!lck->delete_token) {
547                                 smb_panic("talloc failed\n");
548                         }
549
550                         for (i = 0; i < lck->delete_token->ngroups; i++) {
551                                 memcpy(&lck->delete_token->groups[i], p, sizeof(gid_t));
552                                 p += sizeof(gid_t);
553                         }
554                 }
555
556         } else {
557                 lck->delete_token = NULL;
558         }
559
560         /* Save off the associated service path and filename. */
561         lck->servicepath = talloc_strdup(lck, dbuf.dptr + sizeof(*data) +
562                                         (lck->num_share_modes *
563                                         sizeof(struct share_mode_entry)) +
564                                         data->u.s.delete_token_size );
565
566         lck->filename = talloc_strdup(lck, dbuf.dptr + sizeof(*data) +
567                                         (lck->num_share_modes *
568                                         sizeof(struct share_mode_entry)) +
569                                         data->u.s.delete_token_size +
570                                         strlen(lck->servicepath) + 1 );
571
572         /*
573          * Ensure that each entry has a real process attached.
574          */
575
576         for (i = 0; i < lck->num_share_modes; i++) {
577                 struct share_mode_entry *entry_p = &lck->share_modes[i];
578                 DEBUG(10,("parse_share_modes: %s\n",
579                           share_mode_str(i, entry_p) ));
580                 if (!process_exists(entry_p->pid)) {
581                         DEBUG(10,("parse_share_modes: deleted %s\n",
582                                   share_mode_str(i, entry_p) ));
583                         entry_p->op_type = UNUSED_SHARE_MODE_ENTRY;
584                         lck->modified = True;
585                 }
586         }
587
588         return True;
589 }
590
591 static TDB_DATA unparse_share_modes(struct share_mode_lock *lck)
592 {
593         TDB_DATA result;
594         int num_valid = 0;
595         int i;
596         struct locking_data *data;
597         ssize_t offset;
598         ssize_t sp_len;
599         uint32 delete_token_size;
600
601         result.dptr = NULL;
602         result.dsize = 0;
603
604         for (i=0; i<lck->num_share_modes; i++) {
605                 if (!is_unused_share_mode_entry(&lck->share_modes[i])) {
606                         num_valid += 1;
607                 }
608         }
609
610         if (num_valid == 0) {
611                 return result;
612         }
613
614         sp_len = strlen(lck->servicepath);
615         delete_token_size = (lck->delete_token ?
616                         (sizeof(uid_t) + sizeof(gid_t) + (lck->delete_token->ngroups*sizeof(gid_t))) : 0);
617
618         result.dsize = sizeof(*data) +
619                 lck->num_share_modes * sizeof(struct share_mode_entry) +
620                 delete_token_size +
621                 sp_len + 1 +
622                 strlen(lck->filename) + 1;
623         result.dptr = TALLOC_ARRAY(lck, char, result.dsize);
624
625         if (result.dptr == NULL) {
626                 smb_panic("talloc failed\n");
627         }
628
629         data = (struct locking_data *)result.dptr;
630         ZERO_STRUCTP(data);
631         data->u.s.num_share_mode_entries = lck->num_share_modes;
632         data->u.s.delete_on_close = lck->delete_on_close;
633         data->u.s.initial_delete_on_close = lck->initial_delete_on_close;
634         data->u.s.delete_token_size = delete_token_size;
635         DEBUG(10, ("unparse_share_modes: del: %d, initial del %d, tok = %u, num: %d\n",
636                 data->u.s.delete_on_close,
637                 data->u.s.initial_delete_on_close,
638                 (unsigned int)data->u.s.delete_token_size,
639                 data->u.s.num_share_mode_entries));
640         memcpy(result.dptr + sizeof(*data), lck->share_modes,
641                sizeof(struct share_mode_entry)*lck->num_share_modes);
642         offset = sizeof(*data) +
643                 sizeof(struct share_mode_entry)*lck->num_share_modes;
644
645         /* Store any delete on close token. */
646         if (lck->delete_token) {
647                 char *p = result.dptr + offset;
648
649                 memcpy(p, &lck->delete_token->uid, sizeof(uid_t));
650                 p += sizeof(uid_t);
651
652                 memcpy(p, &lck->delete_token->gid, sizeof(gid_t));
653                 p += sizeof(gid_t);
654
655                 for (i = 0; i < lck->delete_token->ngroups; i++) {
656                         memcpy(p, &lck->delete_token->groups[i], sizeof(gid_t));
657                         p += sizeof(gid_t);
658                 }
659                 offset = p - result.dptr;
660         }
661
662         safe_strcpy(result.dptr + offset, lck->servicepath,
663                     result.dsize - offset - 1);
664         offset += sp_len + 1;
665         safe_strcpy(result.dptr + offset, lck->filename,
666                     result.dsize - offset - 1);
667
668         if (DEBUGLEVEL >= 10) {
669                 print_share_mode_table(data);
670         }
671
672         return result;
673 }
674
675 static int share_mode_lock_destructor(struct share_mode_lock *lck)
676 {
677         TDB_DATA key = locking_key(lck->dev, lck->ino);
678         TDB_DATA data;
679
680         if (!lck->modified) {
681                 goto done;
682         }
683
684         data = unparse_share_modes(lck);
685
686         if (data.dptr == NULL) {
687                 if (!lck->fresh) {
688                         /* There has been an entry before, delete it */
689                         if (tdb_delete(tdb, key) == -1) {
690                                 smb_panic("Could not delete share entry\n");
691                         }
692                 }
693                 goto done;
694         }
695
696         if (tdb_store(tdb, key, data, TDB_REPLACE) == -1) {
697                 smb_panic("Could not store share mode entry\n");
698         }
699
700  done:
701         tdb_chainunlock(tdb, key);
702
703         return 0;
704 }
705
706 struct share_mode_lock *get_share_mode_lock(TALLOC_CTX *mem_ctx,
707                                                 SMB_DEV_T dev, SMB_INO_T ino,
708                                                 const char *servicepath,
709                                                 const char *fname)
710 {
711         struct share_mode_lock *lck;
712         TDB_DATA key = locking_key(dev, ino);
713         TDB_DATA data;
714
715         lck = TALLOC_P(mem_ctx, struct share_mode_lock);
716         if (lck == NULL) {
717                 DEBUG(0, ("talloc failed\n"));
718                 return NULL;
719         }
720
721         /* Ensure we set every field here as the destructor must be
722            valid even if parse_share_modes fails. */
723
724         lck->servicepath = NULL;
725         lck->filename = NULL;
726         lck->dev = dev;
727         lck->ino = ino;
728         lck->num_share_modes = 0;
729         lck->share_modes = NULL;
730         lck->delete_token = NULL;
731         lck->delete_on_close = False;
732         lck->initial_delete_on_close = False;
733         lck->fresh = False;
734         lck->modified = False;
735
736         if (tdb_chainlock(tdb, key) != 0) {
737                 DEBUG(3, ("Could not lock share entry\n"));
738                 TALLOC_FREE(lck);
739                 return NULL;
740         }
741
742         /* We must set the destructor immediately after the chainlock
743            ensure the lock is cleaned up on any of the error return
744            paths below. */
745
746         talloc_set_destructor(lck, share_mode_lock_destructor);
747
748         data = tdb_fetch(tdb, key);
749         lck->fresh = (data.dptr == NULL);
750
751         if (lck->fresh) {
752
753                 if (fname == NULL || servicepath == NULL) {
754                         TALLOC_FREE(lck);
755                         return NULL;
756                 }
757                 lck->filename = talloc_strdup(lck, fname);
758                 lck->servicepath = talloc_strdup(lck, servicepath);
759                 if (lck->filename == NULL || lck->servicepath == NULL) {
760                         DEBUG(0, ("talloc failed\n"));
761                         TALLOC_FREE(lck);
762                         return NULL;
763                 }
764         } else {
765                 if (!parse_share_modes(data, lck)) {
766                         DEBUG(0, ("Could not parse share modes\n"));
767                         TALLOC_FREE(lck);
768                         SAFE_FREE(data.dptr);
769                         return NULL;
770                 }
771         }
772
773         SAFE_FREE(data.dptr);
774
775         return lck;
776 }
777
778 /*******************************************************************
779  Sets the service name and filename for rename.
780  At this point we emit "file renamed" messages to all
781  process id's that have this file open.
782  Based on an initial code idea from SATOH Fumiyasu <fumiya@samba.gr.jp>
783 ********************************************************************/
784
785 BOOL rename_share_filename(struct share_mode_lock *lck,
786                         const char *servicepath,
787                         const char *newname)
788 {
789         size_t sp_len;
790         size_t fn_len;
791         size_t msg_len;
792         char *frm = NULL;
793         int i;
794
795         if (!lck) {
796                 return False;
797         }
798
799         DEBUG(10, ("rename_share_filename: servicepath %s newname %s\n",
800                 servicepath, newname));
801
802         /*
803          * rename_internal_fsp() and rename_internals() add './' to
804          * head of newname if newname does not contain a '/'.
805          */
806         while (newname[0] && newname[1] && newname[0] == '.' && newname[1] == '/') {
807                 newname += 2;
808         }
809
810         lck->servicepath = talloc_strdup(lck, servicepath);
811         lck->filename = talloc_strdup(lck, newname);
812         if (lck->filename == NULL || lck->servicepath == NULL) {
813                 DEBUG(0, ("rename_share_filename: talloc failed\n"));
814                 return False;
815         }
816         lck->modified = True;
817
818         sp_len = strlen(lck->servicepath);
819         fn_len = strlen(lck->filename);
820
821         msg_len = MSG_FILE_RENAMED_MIN_SIZE + sp_len + 1 + fn_len + 1;
822
823         /* Set up the name changed message. */
824         frm = TALLOC_ARRAY(lck, char, msg_len);
825         if (!frm) {
826                 return False;
827         }
828
829         SDEV_T_VAL(frm,0,lck->dev);
830         SINO_T_VAL(frm,8,lck->ino);
831
832         DEBUG(10,("rename_share_filename: msg_len = %u\n", (unsigned int)msg_len ));
833
834         safe_strcpy(&frm[16], lck->servicepath, sp_len);
835         safe_strcpy(&frm[16 + sp_len + 1], lck->filename, fn_len);
836
837         /* Send the messages. */
838         for (i=0; i<lck->num_share_modes; i++) {
839                 struct share_mode_entry *se = &lck->share_modes[i];
840                 if (!is_valid_share_mode_entry(se)) {
841                         continue;
842                 }
843                 /* But not to ourselves... */
844                 if (procid_is_me(&se->pid)) {
845                         continue;
846                 }
847
848                 DEBUG(10,("rename_share_filename: sending rename message to pid %s "
849                         "dev %x, inode  %.0f sharepath %s newname %s\n",
850                         procid_str_static(&se->pid),
851                         (unsigned int)lck->dev, (double)lck->ino,
852                         lck->servicepath, lck->filename ));
853
854                 message_send_pid(se->pid, MSG_SMB_FILE_RENAME,
855                                 frm, msg_len, True);
856         }
857
858         return True;
859 }
860
861 BOOL get_delete_on_close_flag(SMB_DEV_T dev, SMB_INO_T inode)
862 {
863         BOOL result;
864         struct share_mode_lock *lck = get_share_mode_lock(NULL, dev, inode, NULL, NULL);
865         if (!lck) {
866                 return False;
867         }
868         result = lck->delete_on_close;
869         TALLOC_FREE(lck);
870         return result;
871 }
872
873 BOOL is_valid_share_mode_entry(const struct share_mode_entry *e)
874 {
875         int num_props = 0;
876
877         num_props += ((e->op_type == NO_OPLOCK) ? 1 : 0);
878         num_props += (EXCLUSIVE_OPLOCK_TYPE(e->op_type) ? 1 : 0);
879         num_props += (LEVEL_II_OPLOCK_TYPE(e->op_type) ? 1 : 0);
880
881         SMB_ASSERT(num_props <= 1);
882         return (num_props != 0);
883 }
884
885 BOOL is_deferred_open_entry(const struct share_mode_entry *e)
886 {
887         return (e->op_type == DEFERRED_OPEN_ENTRY);
888 }
889
890 BOOL is_unused_share_mode_entry(const struct share_mode_entry *e)
891 {
892         return (e->op_type == UNUSED_SHARE_MODE_ENTRY);
893 }
894
895 /*******************************************************************
896  Fill a share mode entry.
897 ********************************************************************/
898
899 static void fill_share_mode_entry(struct share_mode_entry *e,
900                                   files_struct *fsp,
901                                   uid_t uid, uint16 mid, uint16 op_type)
902 {
903         ZERO_STRUCTP(e);
904         e->pid = procid_self();
905         e->share_access = fsp->share_access;
906         e->private_options = fsp->fh->private_options;
907         e->access_mask = fsp->access_mask;
908         e->op_mid = mid;
909         e->op_type = op_type;
910         e->time.tv_sec = fsp->open_time.tv_sec;
911         e->time.tv_usec = fsp->open_time.tv_usec;
912         e->dev = fsp->dev;
913         e->inode = fsp->inode;
914         e->share_file_id = fsp->fh->file_id;
915         e->uid = (uint32)uid;
916 }
917
918 static void fill_deferred_open_entry(struct share_mode_entry *e,
919                                      const struct timeval request_time,
920                                      SMB_DEV_T dev, SMB_INO_T ino, uint16 mid)
921 {
922         ZERO_STRUCTP(e);
923         e->pid = procid_self();
924         e->op_mid = mid;
925         e->op_type = DEFERRED_OPEN_ENTRY;
926         e->time.tv_sec = request_time.tv_sec;
927         e->time.tv_usec = request_time.tv_usec;
928         e->dev = dev;
929         e->inode = ino;
930         e->uid = (uint32)-1;
931 }
932
933 static void add_share_mode_entry(struct share_mode_lock *lck,
934                                  const struct share_mode_entry *entry)
935 {
936         int i;
937
938         for (i=0; i<lck->num_share_modes; i++) {
939                 struct share_mode_entry *e = &lck->share_modes[i];
940                 if (is_unused_share_mode_entry(e)) {
941                         *e = *entry;
942                         break;
943                 }
944         }
945
946         if (i == lck->num_share_modes) {
947                 /* No unused entry found */
948                 ADD_TO_ARRAY(lck, struct share_mode_entry, *entry,
949                              &lck->share_modes, &lck->num_share_modes);
950         }
951         lck->modified = True;
952 }
953
954 void set_share_mode(struct share_mode_lock *lck, files_struct *fsp,
955                         uid_t uid, uint16 mid, uint16 op_type)
956 {
957         struct share_mode_entry entry;
958         fill_share_mode_entry(&entry, fsp, uid, mid, op_type);
959         add_share_mode_entry(lck, &entry);
960 }
961
962 void add_deferred_open(struct share_mode_lock *lck, uint16 mid,
963                        struct timeval request_time,
964                        SMB_DEV_T dev, SMB_INO_T ino)
965 {
966         struct share_mode_entry entry;
967         fill_deferred_open_entry(&entry, request_time, dev, ino, mid);
968         add_share_mode_entry(lck, &entry);
969 }
970
971 /*******************************************************************
972  Check if two share mode entries are identical, ignoring oplock 
973  and mid info and desired_access. (Removed paranoia test - it's
974  not automatically a logic error if they are identical. JRA.)
975 ********************************************************************/
976
977 static BOOL share_modes_identical(struct share_mode_entry *e1,
978                                   struct share_mode_entry *e2)
979 {
980         /* We used to check for e1->share_access == e2->share_access here
981            as well as the other fields but 2 different DOS or FCB opens
982            sharing the same share mode entry may validly differ in
983            fsp->share_access field. */
984
985         return (procid_equal(&e1->pid, &e2->pid) &&
986                 e1->dev == e2->dev &&
987                 e1->inode == e2->inode &&
988                 e1->share_file_id == e2->share_file_id );
989 }
990
991 static BOOL deferred_open_identical(struct share_mode_entry *e1,
992                                     struct share_mode_entry *e2)
993 {
994         return (procid_equal(&e1->pid, &e2->pid) &&
995                 (e1->op_mid == e2->op_mid) &&
996                 (e1->dev == e2->dev) &&
997                 (e1->inode == e2->inode));
998 }
999
1000 static struct share_mode_entry *find_share_mode_entry(struct share_mode_lock *lck,
1001                                                       struct share_mode_entry *entry)
1002 {
1003         int i;
1004
1005         for (i=0; i<lck->num_share_modes; i++) {
1006                 struct share_mode_entry *e = &lck->share_modes[i];
1007                 if (is_valid_share_mode_entry(entry) &&
1008                     is_valid_share_mode_entry(e) &&
1009                     share_modes_identical(e, entry)) {
1010                         return e;
1011                 }
1012                 if (is_deferred_open_entry(entry) &&
1013                     is_deferred_open_entry(e) &&
1014                     deferred_open_identical(e, entry)) {
1015                         return e;
1016                 }
1017         }
1018         return NULL;
1019 }
1020
1021 /*******************************************************************
1022  Del the share mode of a file for this process. Return the number of
1023  entries left.
1024 ********************************************************************/
1025
1026 BOOL del_share_mode(struct share_mode_lock *lck, files_struct *fsp)
1027 {
1028         struct share_mode_entry entry, *e;
1029
1030         /* Don't care about the pid owner being correct here - just a search. */
1031         fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
1032
1033         e = find_share_mode_entry(lck, &entry);
1034         if (e == NULL) {
1035                 return False;
1036         }
1037
1038         e->op_type = UNUSED_SHARE_MODE_ENTRY;
1039         lck->modified = True;
1040         return True;
1041 }
1042
1043 void del_deferred_open_entry(struct share_mode_lock *lck, uint16 mid)
1044 {
1045         struct share_mode_entry entry, *e;
1046
1047         fill_deferred_open_entry(&entry, timeval_zero(),
1048                                  lck->dev, lck->ino, mid);
1049
1050         e = find_share_mode_entry(lck, &entry);
1051         if (e == NULL) {
1052                 return;
1053         }
1054
1055         e->op_type = UNUSED_SHARE_MODE_ENTRY;
1056         lck->modified = True;
1057 }
1058
1059 /*******************************************************************
1060  Remove an oplock mid and mode entry from a share mode.
1061 ********************************************************************/
1062
1063 BOOL remove_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
1064 {
1065         struct share_mode_entry entry, *e;
1066
1067         /* Don't care about the pid owner being correct here - just a search. */
1068         fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
1069
1070         e = find_share_mode_entry(lck, &entry);
1071         if (e == NULL) {
1072                 return False;
1073         }
1074
1075         e->op_mid = 0;
1076         e->op_type = NO_OPLOCK;
1077         lck->modified = True;
1078         return True;
1079 }
1080
1081 /*******************************************************************
1082  Downgrade a oplock type from exclusive to level II.
1083 ********************************************************************/
1084
1085 BOOL downgrade_share_oplock(struct share_mode_lock *lck, files_struct *fsp)
1086 {
1087         struct share_mode_entry entry, *e;
1088
1089         /* Don't care about the pid owner being correct here - just a search. */
1090         fill_share_mode_entry(&entry, fsp, (uid_t)-1, 0, NO_OPLOCK);
1091
1092         e = find_share_mode_entry(lck, &entry);
1093         if (e == NULL) {
1094                 return False;
1095         }
1096
1097         e->op_type = LEVEL_II_OPLOCK;
1098         lck->modified = True;
1099         return True;
1100 }
1101
1102 /****************************************************************************
1103  Deal with the internal needs of setting the delete on close flag. Note that
1104  as the tdb locking is recursive, it is safe to call this from within 
1105  open_file_ntcreate. JRA.
1106 ****************************************************************************/
1107
1108 NTSTATUS can_set_delete_on_close(files_struct *fsp, BOOL delete_on_close,
1109                                  uint32 dosmode)
1110 {
1111         if (!delete_on_close) {
1112                 return NT_STATUS_OK;
1113         }
1114
1115         /*
1116          * Only allow delete on close for writable files.
1117          */
1118
1119         if ((dosmode & aRONLY) &&
1120             !lp_delete_readonly(SNUM(fsp->conn))) {
1121                 DEBUG(10,("can_set_delete_on_close: file %s delete on close "
1122                           "flag set but file attribute is readonly.\n",
1123                           fsp->fsp_name ));
1124                 return NT_STATUS_CANNOT_DELETE;
1125         }
1126
1127         /*
1128          * Only allow delete on close for writable shares.
1129          */
1130
1131         if (!CAN_WRITE(fsp->conn)) {
1132                 DEBUG(10,("can_set_delete_on_close: file %s delete on "
1133                           "close flag set but write access denied on share.\n",
1134                           fsp->fsp_name ));
1135                 return NT_STATUS_ACCESS_DENIED;
1136         }
1137
1138         /*
1139          * Only allow delete on close for files/directories opened with delete
1140          * intent.
1141          */
1142
1143         if (!(fsp->access_mask & DELETE_ACCESS)) {
1144                 DEBUG(10,("can_set_delete_on_close: file %s delete on "
1145                           "close flag set but delete access denied.\n",
1146                           fsp->fsp_name ));
1147                 return NT_STATUS_ACCESS_DENIED;
1148         }
1149
1150         return NT_STATUS_OK;
1151 }
1152
1153 /*************************************************************************
1154  Return a talloced copy of a UNIX_USER_TOKEN. NULL on fail.
1155  (Should this be in locking.c.... ?).
1156 *************************************************************************/
1157
1158 static UNIX_USER_TOKEN *copy_unix_token(TALLOC_CTX *ctx, UNIX_USER_TOKEN *tok)
1159 {
1160         UNIX_USER_TOKEN *cpy;
1161
1162         if (tok == NULL) {
1163                 return NULL;
1164         }
1165
1166         cpy = TALLOC_P(ctx, UNIX_USER_TOKEN);
1167         if (!cpy) {
1168                 return NULL;
1169         }
1170
1171         cpy->uid = tok->uid;
1172         cpy->gid = tok->gid;
1173         cpy->ngroups = tok->ngroups;
1174         if (tok->ngroups) {
1175                 /* Make this a talloc child of cpy. */
1176                 cpy->groups = TALLOC_ARRAY(cpy, gid_t, tok->ngroups);
1177                 if (!cpy->groups) {
1178                         return NULL;
1179                 }
1180                 memcpy(cpy->groups, tok->groups, tok->ngroups * sizeof(gid_t));
1181         }
1182         return cpy;
1183 }
1184
1185 /****************************************************************************
1186  Replace the delete on close token.
1187 ****************************************************************************/
1188
1189 void set_delete_on_close_token(struct share_mode_lock *lck, UNIX_USER_TOKEN *tok)
1190 {
1191         /* Ensure there's no token. */
1192         if (lck->delete_token) {
1193                 TALLOC_FREE(lck->delete_token); /* Also deletes groups... */
1194                 lck->delete_token = NULL;
1195         }
1196
1197         /* Copy the new token (can be NULL). */
1198         lck->delete_token = copy_unix_token(lck, tok);
1199         lck->modified = True;
1200 }
1201
1202 /****************************************************************************
1203  Sets the delete on close flag over all share modes on this file.
1204  Modify the share mode entry for all files open
1205  on this device and inode to tell other smbds we have
1206  changed the delete on close flag. This will be noticed
1207  in the close code, the last closer will delete the file
1208  if flag is set.
1209  Note that setting this to any value clears the initial_delete_on_close flag.
1210  If delete_on_close is True this makes a copy of any UNIX_USER_TOKEN into the
1211  lck entry.
1212 ****************************************************************************/
1213
1214 BOOL set_delete_on_close(files_struct *fsp, BOOL delete_on_close, UNIX_USER_TOKEN *tok)
1215 {
1216         struct share_mode_lock *lck;
1217         
1218         DEBUG(10,("set_delete_on_close: %s delete on close flag for "
1219                   "fnum = %d, file %s\n",
1220                   delete_on_close ? "Adding" : "Removing", fsp->fnum,
1221                   fsp->fsp_name ));
1222
1223         if (fsp->is_stat) {
1224                 return True;
1225         }
1226
1227         lck = get_share_mode_lock(NULL, fsp->dev, fsp->inode, NULL, NULL);
1228         if (lck == NULL) {
1229                 return False;
1230         }
1231
1232         if (lck->delete_on_close != delete_on_close) {
1233                 set_delete_on_close_token(lck, tok);
1234                 lck->delete_on_close = delete_on_close;
1235                 if (delete_on_close) {
1236                         SMB_ASSERT(lck->delete_token != NULL);
1237                 }
1238                 lck->modified = True;
1239         }
1240
1241         if (lck->initial_delete_on_close) {
1242                 lck->initial_delete_on_close = False;
1243                 lck->modified = True;
1244         }
1245
1246         TALLOC_FREE(lck);
1247         return True;
1248 }
1249
1250 struct forall_state {
1251         void (*fn)(const struct share_mode_entry *entry,
1252                    const char *sharepath,
1253                    const char *fname,
1254                    void *private_data);
1255         void *private_data;
1256 };
1257
1258 static int traverse_fn(TDB_CONTEXT *the_tdb, TDB_DATA kbuf, TDB_DATA dbuf, 
1259                        void *_state)
1260 {
1261         struct forall_state *state = (struct forall_state *)_state;
1262         struct locking_data *data;
1263         struct share_mode_entry *shares;
1264         const char *sharepath;
1265         const char *fname;
1266         int i;
1267
1268         /* Ensure this is a locking_key record. */
1269         if (kbuf.dsize != sizeof(struct locking_key))
1270                 return 0;
1271
1272         data = (struct locking_data *)dbuf.dptr;
1273         shares = (struct share_mode_entry *)(dbuf.dptr + sizeof(*data));
1274         sharepath = dbuf.dptr + sizeof(*data) +
1275                 data->u.s.num_share_mode_entries*sizeof(*shares) +
1276                 data->u.s.delete_token_size;
1277         fname = dbuf.dptr + sizeof(*data) +
1278                 data->u.s.num_share_mode_entries*sizeof(*shares) +
1279                 data->u.s.delete_token_size +
1280                 strlen(sharepath) + 1;
1281
1282         for (i=0;i<data->u.s.num_share_mode_entries;i++) {
1283                 state->fn(&shares[i], sharepath, fname,
1284                           state->private_data);
1285         }
1286         return 0;
1287 }
1288
1289 /*******************************************************************
1290  Call the specified function on each entry under management by the
1291  share mode system.
1292 ********************************************************************/
1293
1294 int share_mode_forall(void (*fn)(const struct share_mode_entry *, const char *,
1295                                  const char *, void *),
1296                       void *private_data)
1297 {
1298         struct forall_state state;
1299
1300         if (tdb == NULL)
1301                 return 0;
1302
1303         state.fn = fn;
1304         state.private_data = private_data;
1305
1306         return tdb_traverse(tdb, traverse_fn, (void *)&state);
1307 }