Index: PR-4741524/samba/source/smbd/server.c =================================================================== --- PR-4741524.orig/samba/source/smbd/server.c +++ PR-4741524/samba/source/smbd/server.c @@ -46,6 +46,10 @@ extern int dcelogin_atmost_once; */ static int server_fd = -1; +#ifdef WITH_BRLM +BOOL brlm_init = False; +#endif + int smbd_server_fd(void) { return server_fd; @@ -132,6 +136,13 @@ static BOOL open_sockets_inetd(void) set_socket_options(smbd_server_fd(),"SO_KEEPALIVE"); set_socket_options(smbd_server_fd(), user_socket_options); +#ifdef WITH_BRLM + if (lp_BRLM() && !brlm_init) { + BRLMInit(); + brlm_init = True; + } +#endif + return True; } @@ -387,9 +398,15 @@ static BOOL open_sockets_smbd(BOOL is_da /* Ensure child is set to blocking mode */ set_blocking(smbd_server_fd(),True); - if (smbd_server_fd() != -1 && interactive) + if (smbd_server_fd() != -1 && interactive) { +#ifdef WITH_BRLM + if (lp_BRLM() && !brlm_init) { + BRLMInit(); + brlm_init = True; + } +#endif return True; - + } if (allowable_number_of_smbd_processes() && smbd_server_fd() != -1 && sys_fork()==0) { /* Child code ... */ @@ -421,6 +438,13 @@ static BOOL open_sockets_smbd(BOOL is_da smb_panic("tdb_reopen_all failed."); } +#ifdef WITH_BRLM + if (lp_BRLM() && !brlm_init) { + BRLMInit(); + brlm_init = True; + } +#endif + return True; } /* The parent doesn't need this socket */ @@ -611,6 +635,11 @@ void exit_server(const char *reason) locking_end(); printing_end(); +#ifdef WITH_BRLM + if(lp_BRLM() && brlm_init) + BRLMClose(); +#endif + DEBUG(3,("Server exit (%s)\n", (reason ? reason : ""))); exit(0); } Index: PR-4741524/samba/source/include/smb.h =================================================================== --- PR-4741524.orig/samba/source/include/smb.h +++ PR-4741524/samba/source/include/smb.h @@ -377,6 +377,10 @@ typedef struct #include "fake_file.h" +#ifdef WITH_BRLM +#include <ByteRangeLocking/BRLM.h> +#endif + typedef struct files_struct { struct files_struct *next, *prev; int fnum; @@ -412,6 +416,11 @@ typedef struct files_struct { BOOL directory_delete_on_close; char *fsp_name; FAKE_FILE_HANDLE *fake_file_handle; +#ifdef WITH_BRLM + BRLMRef brlm_ref; + int brlm_deny_mode; + int brlm_open_mode; +#endif } files_struct; #include "ntquotas.h" Index: PR-4741524/samba/source/smbd/vfs-wrap.c =================================================================== --- PR-4741524.orig/samba/source/smbd/vfs-wrap.c +++ PR-4741524/samba/source/smbd/vfs-wrap.c @@ -172,10 +172,31 @@ int vfswrap_open(vfs_handle_struct *hand int vfswrap_close(vfs_handle_struct *handle, files_struct *fsp, int fd) { int result; +#ifdef WITH_BRLM + BRLMStatus brlm_status = BRLMMiscErr; +#endif START_PROFILE(syscall_close); +#ifdef WITH_BRLM +if (lp_BRLM()) +{ + if (fsp->brlm_ref) { + brlm_status = BRLMCloseRef(fsp->brlm_ref); + fsp->brlm_ref = 0; + if (BRLMNoErr == brlm_status) + result = 0; + else + result = -1; +} + DEBUG(6,("vfswrap_close: [%d]BRLMCloseRef file(%s) ref(%X)\n", brlm_status, fsp->fsp_name, fsp->brlm_ref)); +} else { +#endif result = close(fd); +#ifdef WITH_BRLM + } /* lp_BRLM */ +#endif + END_PROFILE(syscall_close); return result; } Index: PR-4741524/samba/source/param/loadparm.c =================================================================== --- PR-4741524.orig/samba/source/param/loadparm.c +++ PR-4741524/samba/source/param/loadparm.c @@ -293,6 +293,9 @@ typedef struct #ifdef WITH_OPENDIRECTORY BOOL bOpenDirectory; #endif +#ifdef WITH_BRLM + BOOL bBRLM; +#endif int restrict_anonymous; int name_cache_timeout; int client_signing; @@ -1191,6 +1194,9 @@ static struct parm_struct parm_table[] = #ifdef WITH_OPENDIRECTORY {"opendirectory", P_BOOL, P_GLOBAL, &Globals.bOpenDirectory, NULL, NULL, FLAG_ADVANCED}, #endif +#ifdef WITH_BRLM + {"brlm", P_BOOL, P_GLOBAL, &Globals.bBRLM, NULL, NULL, FLAG_ADVANCED}, +#endif {NULL, P_BOOL, P_NONE, NULL, NULL, NULL, 0} }; @@ -1544,6 +1550,9 @@ static void init_globals(void) #ifdef WITH_OPENDIRECTORY Globals.bOpenDirectory = True; #endif +#ifdef WITH_BRLM + Globals.bBRLM = False; +#endif } static TALLOC_CTX *lp_talloc; @@ -1932,6 +1941,9 @@ FN_GLOBAL_INTEGER(lp_server_signing, &Gl #ifdef WITH_OPENDIRECTORY FN_GLOBAL_BOOL(lp_opendirectory, &Globals.bOpenDirectory) #endif +#ifdef WITH_BRLM +FN_GLOBAL_BOOL(lp_BRLM, &Globals.bBRLM) +#endif /* local prototypes */ Index: PR-4741524/samba/source/locking/posix.c =================================================================== --- PR-4741524.orig/samba/source/locking/posix.c +++ PR-4741524/samba/source/locking/posix.c @@ -30,6 +30,13 @@ static TDB_CONTEXT *posix_lock_tdb; +#ifdef WITH_BRLM +struct pending_close { + int fd; + BRLMRef brlm_ref; +}; +#endif + /* * The pending close database handle. */ @@ -97,12 +104,29 @@ static BOOL add_fd_to_close_entry(files_ TDB_DATA kbuf = locking_key_fsp(fsp); TDB_DATA dbuf; char *tp; + void *data = NULL; +#ifdef WITH_BRLM + struct pending_close pc; + unsigned long datalen = sizeof(struct pending_close); +#else + unsigned long datalen = sizeof(int); +#endif dbuf.dptr = NULL; dbuf = tdb_fetch(posix_pending_close_tdb, kbuf); +#ifdef WITH_BRLM + /* + * Add new record. + */ - tp = SMB_REALLOC(dbuf.dptr, dbuf.dsize + sizeof(int)); + pc.fd = fsp->fd; + pc.brlm_ref = fsp->brlm_ref; + data = &pc; +#else + data = &fsp->fd; +#endif + tp = SMB_REALLOC(dbuf.dptr, dbuf.dsize + datalen); if (!tp) { DEBUG(0,("add_fd_to_close_entry: Realloc fail !\n")); SAFE_FREE(dbuf.dptr); @@ -110,8 +134,8 @@ static BOOL add_fd_to_close_entry(files_ } else dbuf.dptr = tp; - memcpy(dbuf.dptr + dbuf.dsize, &fsp->fd, sizeof(int)); - dbuf.dsize += sizeof(int); + memcpy(dbuf.dptr + dbuf.dsize, data, datalen); + dbuf.dsize += datalen; if (tdb_store(posix_pending_close_tdb, kbuf, dbuf, TDB_REPLACE) == -1) { DEBUG(0,("add_fd_to_close_entry: tdb_store fail !\n")); @@ -138,7 +162,11 @@ static void delete_close_entries(files_s free. Returns number of entries. ****************************************************************************/ +#ifdef WITH_BRLM +static size_t get_posix_pending_close_entries(files_struct *fsp, struct pending_close **entries) +#else static size_t get_posix_pending_close_entries(files_struct *fsp, int **entries) +#endif { TDB_DATA kbuf = locking_key_fsp(fsp); TDB_DATA dbuf; @@ -153,9 +181,13 @@ static size_t get_posix_pending_close_en return 0; } +#ifdef WITH_BRLM + *entries = (struct pending_close *)dbuf.dptr; + count = (size_t)(dbuf.dsize / sizeof(struct pending_close)); +#else *entries = (int *)dbuf.dptr; count = (size_t)(dbuf.dsize / sizeof(int)); - +#endif return count; } @@ -198,7 +230,12 @@ int fd_close_posix(struct connection_str int ret; size_t count, i; struct posix_lock *entries = NULL; +#ifdef WITH_BRLM + BRLMStatus brlm_status = BRLMMiscErr; + struct pending_close *fd_array = NULL; +#else int *fd_array = NULL; +#endif BOOL locks_on_other_fds = False; if (!lp_posix_locking(SNUM(conn))) { @@ -259,9 +296,25 @@ int fd_close_posix(struct connection_str DEBUG(10,("fd_close_posix: doing close on %u fd's.\n", (unsigned int)count )); for(i = 0; i < count; i++) { +#ifdef WITH_BRLM + if (lp_BRLM()) + { + if (fd_array[i].brlm_ref) { + brlm_status = BRLMCloseRef(fd_array[i].brlm_ref); + if (BRLMNoErr != brlm_status) + saved_errno = brlm_status; + } + DEBUG(4,("fd_close_posix: [%d]BRLMCloseRef fd(%d) ref(%X)\n", brlm_status, fd_array[i].fd, fd_array[i].brlm_ref)); + } else { + if (SMB_VFS_CLOSE(fsp,fd_array[i].fd) == -1) { + saved_errno = errno; + } + } +#else if (SMB_VFS_CLOSE(fsp,fd_array[i]) == -1) { saved_errno = errno; } +#endif } /* @@ -646,9 +699,58 @@ static BOOL posix_lock_in_range(SMB_OFF_ static BOOL posix_fcntl_lock(files_struct *fsp, int op, SMB_OFF_T offset, SMB_OFF_T count, int type) { int ret; +#ifdef WITH_BRLM + BRLMStatus brlm_status = BRLMParamErr; + BRLMLockType brlm_lock_type = 0; +#endif DEBUG(8,("posix_fcntl_lock %d %d %.0f %.0f %d\n",fsp->fd,op,(double)offset,(double)count,type)); +#ifdef WITH_BRLM +if (lp_BRLM()) +{ + if (op == SMB_F_GETLK) + { + if (type == F_RDLCK) + { + brlm_status = BRLMCanRead(fsp->brlm_ref, offset, count); + DEBUG(8,("posix_fcntl_lock: [%d]BRLMCanRead offset[%d] count[%d]\n",brlm_status, offset, count)); + } else if (type == F_WRLCK) { + brlm_status = BRLMCanWrite(fsp->brlm_ref, offset, count); + DEBUG(8,("posix_fcntl_lock: [%d]BRLMCanWrite offset[%d] count[%d]\n",brlm_status, offset, count)); + } else { + DEBUG(8,("posix_fcntl_lock: !!!!! SMB_F_GETLK !!!!! type[0x%X]\n", type)); + ret = 0; + } + if (BRLMNoErr == brlm_status) + ret = 0; /* can read | write */ + else + ret = 1; + } else if (op == SMB_F_SETLK) { + if (type == F_RDLCK) { + brlm_status = BRLMByteRangeLock(fsp->brlm_ref, kBRLMRLock, offset, count); + DEBUG(8,("posix_fcntl_lock: [%d]BRLMByteRangeLock kBRLMRLock\n",brlm_status)); + } else if (type == F_WRLCK) { + brlm_status = BRLMByteRangeLock(fsp->brlm_ref, kBRLMWLock, offset, count); + DEBUG(8,("posix_fcntl_lock: [%d]BRLMByteRangeLock kBRLMWLock\n",brlm_status)); + } else if (type == F_UNLCK) { + brlm_status = BRLMByteRangeUnlock(fsp->brlm_ref, kBRLMFree, offset, count); + DEBUG(8,("posix_fcntl_lock: [%d]BRLMByteRangeUnlock kBRLMFree\n",brlm_status)); + } else { + DEBUG(8,("posix_fcntl_lock: !!!!! SMB_F_SETLK !!!!! type[0x%X]\n", type)); + ret = 0; + } + + if (BRLMNoErr == brlm_status) + ret = 1; + else + ret = 0; + } else { + DEBUG(8,("posix_fcntl_lock: !!!!! OP !!!!! op[0x%X] lock_type[0x%X]\n", op, type)); + ret = 0; + } +} else { +#endif ret = SMB_VFS_LOCK(fsp,fsp->fd,op,offset,count,type); if (!ret && ((errno == EFBIG) || (errno == ENOLCK) || (errno == EINVAL))) { @@ -676,7 +778,9 @@ static BOOL posix_fcntl_lock(files_struc ret = SMB_VFS_LOCK(fsp,fsp->fd,op,offset,count,type); } } - +#ifdef WITH_BRLM +} /* lp_BRLM */ +#endif DEBUG(8,("posix_fcntl_lock: Lock call %s\n", ret ? "successful" : "failed")); return ret; Index: PR-4741524/samba/source/smbd/open.c =================================================================== --- PR-4741524.orig/samba/source/smbd/open.c +++ PR-4741524/samba/source/smbd/open.c @@ -83,6 +83,59 @@ static void check_for_pipe(const char *f } /**************************************************************************** +Open a file. +****************************************************************************/ +#ifdef WITH_BRLM +int map_deny_mode_to_brlm_permissions(files_struct *fsp, int flags) +{ + int deny_mode = 0; + + switch (flags) { + case DENY_ALL: + deny_mode = kBRLMDenyRead | kBRLMDenyWrite; + break; + case DENY_WRITE: + deny_mode = kBRLMDenyWrite; + break; + case DENY_READ: + deny_mode = kBRLMDenyRead; + break; + case DENY_DOS: + case DENY_FCB: + default: + deny_mode = 0; + break; + } + DEBUG(4,("map_deny_mode_to_brlm_permissions[0x%X] flags[0x%X]\n",deny_mode, flags)); + fsp->brlm_deny_mode = deny_mode; + return deny_mode; +} + +int map_open_mode_to_brlm_permissions(files_struct *fsp, int flags) +{ + int open_mode = 0; + + if (flags & DOS_OPEN_RDONLY) { + open_mode = kBRLMRead; + DEBUG(4,("map_open_mode_to_brlm_permissions: DOS_OPEN_RDONLY\n")); + } else if ( flags & DOS_OPEN_WRONLY) { + open_mode = kBRLMWrite; + } else if ( flags & DOS_OPEN_RDWR) { + open_mode = kBRLMRead | kBRLMWrite; + } else if ( flags & DOS_OPEN_FCB) { + open_mode = kBRLMRead; + } else { + open_mode = kBRLMRead; + DEBUG(4,("map_open_mode_to_brlm_permissions: !!! default open permissions - kBRLMRead flags[0x%X]\n", flags)); + } + + fsp->brlm_open_mode = open_mode; + DEBUG(4,("map_open_mode_to_brlm_permissions[0x%X] flags[0x%X]\n",open_mode, flags)); + + return open_mode; +} +#endif +/**************************************************************************** Open a file. ****************************************************************************/ @@ -92,6 +145,10 @@ static BOOL open_file(files_struct *fsp, extern struct current_user current_user; int accmode = (flags & O_ACCMODE); int local_flags = flags; +#ifdef WITH_BRLM + BRLMStatus brlm_status = BRLMNoErr; + BRLMRef brlm_ref = 0; +#endif fsp->fd = -1; fsp->oplock_type = NO_OPLOCK; @@ -172,7 +229,29 @@ static BOOL open_file(files_struct *fsp, } /* Actually do the open */ +#ifdef WITH_BRLM + if (lp_BRLM()) + { + map_open_mode_to_brlm_permissions(fsp, local_flags); + brlm_status = BRLMPosixOpen(fname, kBRLMDataFork, fsp->brlm_deny_mode | fsp->brlm_open_mode, local_flags & ~O_ACCMODE/* creatPermissions */, mode, &brlm_ref, 0 /* sessionID */, 0 /* options */); + fsp->brlm_ref = brlm_ref; + if (BRLMNoErr == brlm_status) { + fsp->fd = BRLMGetDescriptor(brlm_ref); + } else { + if (BRLMOpenDenied == brlm_status || BRLMLockConflict == brlm_status) { + unix_ERR_class = ERRDOS; + unix_ERR_code = ERRbadshare; + unix_ERR_ntstatus = NT_STATUS_SHARING_VIOLATION; + } + fsp->fd = -1; + DEBUG(3,("open_file: [%d]BRLMPosixOpen file (%s) (brlm_perms=0x%X) (local_flags=0x%X) (mode=%d) (fd=%d) (brlm_ref=%X)\n", brlm_status, fname, fsp->brlm_deny_mode | fsp->brlm_open_mode, local_flags & ~O_ACCMODE, mode, fsp->fd, brlm_ref)); + } + } else { +#endif fsp->fd = fd_open(conn, fname, local_flags, mode); +#ifdef WITH_BRLM + } /* lp_BRLM */ +#endif if (fsp->fd == -1) { DEBUG(3,("Error opening file %s (%s) (local_flags=%d) (flags=%d)\n", fname,strerror(errno),local_flags,flags)); @@ -1163,7 +1242,10 @@ files_struct *open_file_shared1(connecti flags2 &= ~O_CREAT; } } - +#ifdef WITH_BRLM + if (lp_BRLM()) + map_deny_mode_to_brlm_permissions(fsp, deny_mode); +#endif if (file_existed) { dev = psbuf->st_dev; Index: PR-4741524/samba/source/include/includes.h =================================================================== --- PR-4741524.orig/samba/source/include/includes.h +++ PR-4741524/samba/source/include/includes.h @@ -36,6 +36,10 @@ #include "local.h" +#ifdef WITH_BRLM +#include <ByteRangeLocking/BRLM.h> +#endif + #ifdef AIX #define DEFAULT_PRINTING PRINT_AIX #define PRINTCAP_NAME "/etc/qconfig"