s3: include smbd/smbd.h where needed.
[amitay/samba.git] / source3 / smbd / blocking.c
index b7228467e2020e46dadc32762e33ebfe5475c213..548a3f0845124ca85a77b76ea90f3e8770a2296a 100644 (file)
@@ -18,6 +18,7 @@
 */
 
 #include "includes.h"
+#include "smbd/smbd.h"
 #include "smbd/globals.h"
 #include "librpc/gen_ndr/messaging.h"
 
@@ -53,7 +54,7 @@ void brl_timeout_fn(struct event_context *event_ctx,
        change_to_root_user();  /* TODO: Possibly run all timed events as
                                 * root */
 
-       process_blocking_lock_queue();
+       process_blocking_lock_queue(sconn);
 }
 
 /****************************************************************************
@@ -77,9 +78,8 @@ struct timeval timeval_brl_min(const struct timeval *tv1,
  next processing.
 ****************************************************************************/
 
-static bool recalc_brl_timeout(void)
+static bool recalc_brl_timeout(struct smbd_server_connection *sconn)
 {
-       struct smbd_server_connection *sconn = smbd_server_conn;
        struct blocking_lock_record *blr;
        struct timeval next_timeout;
        int max_brl_timeout = lp_parm_int(-1, "brl", "recalctime", 5);
@@ -223,10 +223,10 @@ bool push_blocking_lock_request( struct byte_range_lock *br_lck,
        blr->blr_private = NULL;
 
        /* Add a pending lock record for this. */
-       status = brl_lock(smbd_messaging_context(),
+       status = brl_lock(req->sconn->msg_ctx,
                        br_lck,
                        smblctx,
-                       procid_self(),
+                       sconn_server_id(req->sconn),
                        offset,
                        count,
                        lock_type == READ_LOCK ? PENDING_READ_LOCK : PENDING_WRITE_LOCK,
@@ -245,11 +245,11 @@ bool push_blocking_lock_request( struct byte_range_lock *br_lck,
        blr->req = talloc_move(blr, &req);
 
        DLIST_ADD_END(sconn->smb1.locks.blocking_lock_queue, blr, struct blocking_lock_record *);
-       recalc_brl_timeout();
+       recalc_brl_timeout(sconn);
 
        /* Ensure we'll receive messages when this is unlocked. */
        if (!sconn->smb1.locks.blocking_lock_unlock_state) {
-               messaging_register(smbd_messaging_context(), NULL,
+               messaging_register(sconn->msg_ctx, NULL,
                                   MSG_SMB_UNLOCK, received_unlock_msg);
                sconn->smb1.locks.blocking_lock_unlock_state = true;
        }
@@ -302,7 +302,8 @@ static void generic_blocking_lock_error(struct blocking_lock_record *blr, NTSTAT
                if (fsp) {
                        fsp->last_lock_failure.context.smblctx = blr->smblctx;
                        fsp->last_lock_failure.context.tid = fsp->conn->cnum;
-                       fsp->last_lock_failure.context.pid = procid_self();
+                       fsp->last_lock_failure.context.pid =
+                               sconn_server_id(fsp->conn->sconn);
                        fsp->last_lock_failure.start = blr->offset;
                        fsp->last_lock_failure.size = blr->count;
                        fsp->last_lock_failure.fnum = fsp->fnum;
@@ -312,7 +313,7 @@ static void generic_blocking_lock_error(struct blocking_lock_record *blr, NTSTAT
        }
 
        reply_nterror(blr->req, status);
-       if (!srv_send_smb(smbd_server_fd(), (char *)blr->req->outbuf,
+       if (!srv_send_smb(blr->req->sconn, (char *)blr->req->outbuf,
                          true, blr->req->seqnum+1,
                          blr->req->encrypted, NULL)) {
                exit_server_cleanly("generic_blocking_lock_error: srv_send_smb failed.");
@@ -362,7 +363,7 @@ static void reply_lockingX_error(struct blocking_lock_record *blr, NTSTATUS stat
                 * request would never have been queued. JRA.
                 */
 
-               do_unlock(smbd_messaging_context(),
+               do_unlock(fsp->conn->sconn->msg_ctx,
                        fsp,
                        smblctx,
                        count,
@@ -395,7 +396,7 @@ static void blocking_lock_reply_error(struct blocking_lock_record *blr, NTSTATUS
                 */
                SCVAL(blr->req->outbuf,smb_com,SMBtrans2);
 
-               if (!srv_send_smb(smbd_server_fd(),
+               if (!srv_send_smb(blr->req->sconn,
                                  (char *)blr->req->outbuf,
                                  true, blr->req->seqnum+1,
                                  IS_CONN_ENCRYPTED(blr->fsp->conn),
@@ -449,7 +450,7 @@ static bool process_lockingX(struct blocking_lock_record *blr)
                 * request would never have been queued. JRA.
                 */
                errno = 0;
-               br_lck = do_lock(smbd_messaging_context(),
+               br_lck = do_lock(fsp->conn->sconn->msg_ctx,
                                fsp,
                                smblctx,
                                count,
@@ -513,7 +514,8 @@ static bool process_trans2(struct blocking_lock_record *blr)
 {
        char params[2];
        NTSTATUS status;
-       struct byte_range_lock *br_lck = do_lock(smbd_messaging_context(),
+       struct byte_range_lock *br_lck = do_lock(
+                                               blr->fsp->conn->sconn->msg_ctx,
                                                blr->fsp,
                                                blr->smblctx,
                                                blr->count,
@@ -615,7 +617,7 @@ void cancel_pending_lock_requests_by_fid(files_struct *fsp,
 
                brl_lock_cancel(br_lck,
                                blr->smblctx,
-                               procid_self(),
+                               sconn_server_id(sconn),
                                blr->offset,
                                blr->count,
                                blr->lock_flav,
@@ -632,9 +634,9 @@ void cancel_pending_lock_requests_by_fid(files_struct *fsp,
  Only called from the SMB1 cancel code.
 *****************************************************************************/
 
-void remove_pending_lock_requests_by_mid_smb1(uint64_t mid)
+void remove_pending_lock_requests_by_mid_smb1(
+       struct smbd_server_connection *sconn, uint64_t mid)
 {
-       struct smbd_server_connection *sconn = smbd_server_conn;
        struct blocking_lock_record *blr, *next = NULL;
 
        for(blr = sconn->smb1.locks.blocking_lock_queue; blr; blr = next) {
@@ -658,7 +660,7 @@ void remove_pending_lock_requests_by_mid_smb1(uint64_t mid)
 
                        brl_lock_cancel(br_lck,
                                        blr->smblctx,
-                                       procid_self(),
+                                       sconn_server_id(sconn),
                                        blr->offset,
                                        blr->count,
                                        blr->lock_flav,
@@ -677,9 +679,9 @@ void remove_pending_lock_requests_by_mid_smb1(uint64_t mid)
  Currently only called from the SMB1 unix extensions POSIX lock code.
 *****************************************************************************/
 
-bool blocking_lock_was_deferred_smb1(uint64_t mid)
+bool blocking_lock_was_deferred_smb1(
+       struct smbd_server_connection *sconn, uint64_t mid)
 {
-       struct smbd_server_connection *sconn = smbd_server_conn;
        struct blocking_lock_record *blr, *next = NULL;
 
        for(blr = sconn->smb1.locks.blocking_lock_queue; blr; blr = next) {
@@ -701,22 +703,29 @@ static void received_unlock_msg(struct messaging_context *msg,
                                struct server_id server_id,
                                DATA_BLOB *data)
 {
+       struct smbd_server_connection *sconn;
+
+       sconn = msg_ctx_to_sconn(msg);
+       if (sconn == NULL) {
+               DEBUG(1, ("could not find sconn\n"));
+               return;
+       }
+
        DEBUG(10,("received_unlock_msg\n"));
-       process_blocking_lock_queue();
+       process_blocking_lock_queue(sconn);
 }
 
 /****************************************************************************
  Process the blocking lock queue. Note that this is only called as root.
 *****************************************************************************/
 
-void process_blocking_lock_queue(void)
+void process_blocking_lock_queue(struct smbd_server_connection *sconn)
 {
-       struct smbd_server_connection *sconn = smbd_server_conn;
        struct timeval tv_curr = timeval_current();
        struct blocking_lock_record *blr, *next = NULL;
 
        if (sconn->using_smb2) {
-               process_blocking_lock_queue_smb2(tv_curr);
+               process_blocking_lock_queue_smb2(sconn, tv_curr);
                return;
        }
 
@@ -754,7 +763,7 @@ void process_blocking_lock_queue(void)
                        if (br_lck) {
                                brl_lock_cancel(br_lck,
                                        blr->smblctx,
-                                       procid_self(),
+                                       sconn_server_id(sconn),
                                        blr->offset,
                                        blr->count,
                                        blr->lock_flav,
@@ -791,7 +800,7 @@ void process_blocking_lock_queue(void)
 
                                brl_lock_cancel(br_lck,
                                        blr->smblctx,
-                                       procid_self(),
+                                       sconn_server_id(sconn),
                                        blr->offset,
                                        blr->count,
                                        blr->lock_flav,
@@ -805,7 +814,7 @@ void process_blocking_lock_queue(void)
                }
        }
 
-       recalc_brl_timeout();
+       recalc_brl_timeout(sconn);
 }
 
 /****************************************************************************
@@ -820,7 +829,7 @@ static void process_blocking_lock_cancel_message(struct messaging_context *ctx,
                                                 struct server_id server_id,
                                                 DATA_BLOB *data)
 {
-       struct smbd_server_connection *sconn = smbd_server_conn;
+       struct smbd_server_connection *sconn;
        NTSTATUS err;
        const char *msg = (const char *)data->data;
        struct blocking_lock_record *blr;
@@ -835,6 +844,12 @@ static void process_blocking_lock_cancel_message(struct messaging_context *ctx,
                smb_panic("process_blocking_lock_cancel_message: bad msg");
         }
 
+       sconn = msg_ctx_to_sconn(ctx);
+       if (sconn == NULL) {
+               DEBUG(1, ("could not find sconn\n"));
+               return;
+       }
+
        memcpy(&blr, msg, sizeof(blr));
        memcpy(&err, &msg[sizeof(blr)], sizeof(NTSTATUS));
 
@@ -860,13 +875,13 @@ struct blocking_lock_record *blocking_lock_cancel_smb1(files_struct *fsp,
                        unsigned char locktype,
                         NTSTATUS err)
 {
-       struct smbd_server_connection *sconn = smbd_server_conn;
+       struct smbd_server_connection *sconn = fsp->conn->sconn;
        char msg[MSG_BLOCKING_LOCK_CANCEL_SIZE];
        struct blocking_lock_record *blr;
 
        if (!sconn->smb1.locks.blocking_lock_cancel_state) {
                /* Register our message. */
-               messaging_register(smbd_messaging_context(), NULL,
+               messaging_register(sconn->msg_ctx, NULL,
                                   MSG_SMB_BLOCKING_LOCK_CANCEL,
                                   process_blocking_lock_cancel_message);
 
@@ -902,7 +917,7 @@ struct blocking_lock_record *blocking_lock_cancel_smb1(files_struct *fsp,
        memcpy(msg, &blr, sizeof(blr));
        memcpy(&msg[sizeof(blr)], &err, sizeof(NTSTATUS));
 
-       messaging_send_buf(smbd_messaging_context(), procid_self(),
+       messaging_send_buf(sconn->msg_ctx, sconn_server_id(sconn),
                           MSG_SMB_BLOCKING_LOCK_CANCEL,
                           (uint8 *)&msg, sizeof(msg));