Line data Source code
1 : /* 2 : Unix SMB/CIFS implementation. 3 : Authenticate against a remote domain 4 : Copyright (C) Andrew Tridgell 1992-2002 5 : Copyright (C) Andrew Bartlett 2002 6 : 7 : This program is free software; you can redistribute it and/or modify 8 : it under the terms of the GNU General Public License as published by 9 : the Free Software Foundation; either version 3 of the License, or 10 : (at your option) any later version. 11 : 12 : This program is distributed in the hope that it will be useful, 13 : but WITHOUT ANY WARRANTY; without even the implied warranty of 14 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15 : GNU General Public License for more details. 16 : 17 : You should have received a copy of the GNU General Public License 18 : along with this program. If not, see <http://www.gnu.org/licenses/>. 19 : */ 20 : 21 : #include "includes.h" 22 : #include "system/filesys.h" 23 : #include "lib/tdb_wrap/tdb_wrap.h" 24 : #include "util_tdb.h" 25 : #include "lib/param/param.h" 26 : 27 : /* For reasons known only to MS, many of their NT/Win2k versions 28 : need serialised access only. Two connections at the same time 29 : may (in certain situations) cause connections to be reset, 30 : or access to be denied. 31 : 32 : This locking allows smbd's multithread architecture to look 33 : like the single-connection that NT makes. */ 34 : 35 : struct named_mutex { 36 : struct tdb_wrap *tdb; 37 : char *name; 38 : }; 39 : 40 20778 : static int unlock_named_mutex(struct named_mutex *mutex) 41 : { 42 20778 : tdb_unlock_bystring(mutex->tdb->tdb, mutex->name); 43 20778 : return 0; 44 : } 45 : 46 20778 : struct named_mutex *grab_named_mutex(TALLOC_CTX *mem_ctx, const char *name, 47 : int timeout) 48 : { 49 2 : struct named_mutex *result; 50 2 : struct loadparm_context *lp_ctx; 51 2 : char *fname; 52 : 53 20778 : result = talloc(mem_ctx, struct named_mutex); 54 20778 : if (result == NULL) { 55 0 : DEBUG(0, ("talloc failed\n")); 56 0 : return NULL; 57 : } 58 : 59 20778 : lp_ctx = loadparm_init_s3(result, loadparm_s3_helpers()); 60 20778 : if (lp_ctx == NULL) { 61 0 : DEBUG(0, ("loadparm_init_s3 failed\n")); 62 0 : talloc_free(result); 63 0 : return NULL; 64 : } 65 : 66 20778 : result->name = talloc_strdup(result, name); 67 20778 : if (result->name == NULL) { 68 0 : DEBUG(0, ("talloc failed\n")); 69 0 : TALLOC_FREE(result); 70 0 : return NULL; 71 : } 72 : 73 20778 : fname = lock_path(talloc_tos(), "mutex.tdb"); 74 20778 : if (fname == NULL) { 75 0 : TALLOC_FREE(result); 76 0 : return NULL; 77 : } 78 : 79 20778 : result->tdb = tdb_wrap_open(result, fname, 80 : lpcfg_tdb_hash_size(lp_ctx, fname), 81 : lpcfg_tdb_flags(lp_ctx, 82 : TDB_DEFAULT | 83 : TDB_CLEAR_IF_FIRST | 84 : TDB_INCOMPATIBLE_HASH), 85 : O_RDWR|O_CREAT, 0600); 86 20778 : TALLOC_FREE(fname); 87 20778 : talloc_unlink(result, lp_ctx); 88 20778 : if (result->tdb == NULL) { 89 0 : DEBUG(1, ("Could not open mutex.tdb: %s\n", 90 : strerror(errno))); 91 0 : TALLOC_FREE(result); 92 0 : return NULL; 93 : } 94 : 95 20778 : if (tdb_lock_bystring_with_timeout(result->tdb->tdb, name, 96 : timeout) != 0) { 97 0 : DEBUG(1, ("Could not get the lock for %s\n", name)); 98 0 : TALLOC_FREE(result); 99 0 : return NULL; 100 : } 101 : 102 20778 : talloc_set_destructor(result, unlock_named_mutex); 103 20778 : return result; 104 : }