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