static void construct_reply_common(struct smb_request *req, const char *inbuf,
char *outbuf);
-bool smbd_lock_socket(struct smbd_server_connection *sconn)
+static bool smbd_lock_socket_internal(struct smbd_server_connection *sconn)
{
bool ok;
return true;
}
+ smbd_server_conn->smb1.echo_handler.ref_count++;
+
+ if (smbd_server_conn->smb1.echo_handler.ref_count > 1) {
+ return true;
+ }
+
DEBUG(10,("pid[%d] wait for socket lock\n", (int)sys_getpid()));
ok = fcntl_lock(smbd_server_conn->smb1.echo_handler.socket_lock_fd,
return true;
}
-bool smbd_unlock_socket(struct smbd_server_connection *sconn)
+void smbd_lock_socket(struct smbd_server_connection *sconn)
+{
+ if (!smbd_lock_socket_internal(sconn)) {
+ exit_server_cleanly("failed to lock socket");
+ }
+}
+
+static bool smbd_unlock_socket_internal(struct smbd_server_connection *sconn)
{
bool ok;
return true;
}
+ smbd_server_conn->smb1.echo_handler.ref_count--;
+
+ if (smbd_server_conn->smb1.echo_handler.ref_count > 0) {
+ return true;
+ }
+
ok = fcntl_lock(smbd_server_conn->smb1.echo_handler.socket_lock_fd,
SMB_F_SETLKW, 0, 0, F_UNLCK);
if (!ok) {
return true;
}
+void smbd_unlock_socket(struct smbd_server_connection *sconn)
+{
+ if (!smbd_unlock_socket_internal(sconn)) {
+ exit_server_cleanly("failed to unlock socket");
+ }
+}
+
/* Accessor function for smb_read_error for smbd functions. */
/****************************************************************************
size_t nwritten=0;
ssize_t ret;
char *buf_out = buffer;
- bool ok;
- ok = smbd_lock_socket(smbd_server_conn);
- if (!ok) {
- exit_server_cleanly("failed to lock socket");
- }
+ smbd_lock_socket(smbd_server_conn);
if (do_signing) {
/* Sign the outgoing packet if required. */
out:
SMB_PERFCOUNT_END(pcd);
- ok = smbd_unlock_socket(smbd_server_conn);
- if (!ok) {
- exit_server_cleanly("failed to unlock socket");
- }
-
+ smbd_unlock_socket(smbd_server_conn);
return true;
}
NTSTATUS status;
uint32_t seqnum;
- bool ok;
-
bool from_client = (smbd_server_fd() == fd)?true:false;
if (from_client) {
- ok = smbd_lock_socket(conn);
- if (!ok) {
- exit_server_cleanly("failed to lock socket");
- }
+ smbd_lock_socket(conn);
if (!fd_is_readable(smbd_server_fd())) {
DEBUG(10,("the echo listener was faster\n"));
- ok = smbd_unlock_socket(conn);
- if (!ok) {
- exit_server_cleanly("failed to unlock");
- }
+ smbd_unlock_socket(conn);
return;
}
&encrypted,
&inbuf_len, &seqnum,
false /* trusted channel */);
- ok = smbd_unlock_socket(conn);
- if (!ok) {
- exit_server_cleanly("failed to unlock");
- }
+ smbd_unlock_socket(conn);
} else {
/* TODO: make this completely nonblocking */
status = receive_smb_talloc(mem_ctx, fd,
*/
static bool keepalive_fn(const struct timeval *now, void *private_data)
{
- bool ok;
bool ret;
- ok = smbd_lock_socket(smbd_server_conn);
- if (!ok) {
- exit_server_cleanly("failed to lock socket");
- }
-
+ smbd_lock_socket(smbd_server_conn);
ret = send_keepalive(smbd_server_fd());
-
- ok = smbd_unlock_socket(smbd_server_conn);
- if (!ok) {
- exit_server_cleanly("failed to unlock socket");
- }
+ smbd_unlock_socket(smbd_server_conn);
if (!ret) {
DEBUG( 2, ( "Keepalive failed - exiting.\n" ) );
bool ok;
bool encrypted = false;
- ok = smbd_lock_socket(sconn);
+ ok = smbd_lock_socket_internal(sconn);
if (!ok) {
DEBUG(0, ("%s: failed to lock socket\n",
__location__));
if (!fd_is_readable(smbd_server_fd())) {
DEBUG(10,("echo_handler[%d] the parent smbd was faster\n",
(int)sys_getpid()));
- ok = smbd_unlock_socket(sconn);
+ ok = smbd_unlock_socket_internal(sconn);
if (!ok) {
DEBUG(1, ("%s: failed to unlock socket in\n",
__location__));
exit(1);
}
- ok = smbd_unlock_socket(sconn);
+ ok = smbd_unlock_socket_internal(sconn);
if (!ok) {
DEBUG(1, ("%s: failed to unlock socket in\n",
__location__));
static void reply_readbraw_error(void)
{
- bool ok;
char header[4];
SIVAL(header,0,0);
- ok = smbd_lock_socket(smbd_server_conn);
- if (!ok) {
- exit_server_cleanly("failed to lock socket");
- }
+ smbd_lock_socket(smbd_server_conn);
if (write_data(smbd_server_fd(),header,4) != 4) {
fail_readraw();
}
- ok = smbd_unlock_socket(smbd_server_conn);
- if (!ok) {
- exit_server_cleanly("failed to unlock socket");
- }
+ smbd_unlock_socket(smbd_server_conn);
}
/****************************************************************************
goto nosendfile_read;
}
- if (smbd_server_conn->smb1.echo_handler.trusted_fde) {
- goto nosendfile_read;
- }
-
#if defined(WITH_SENDFILE)
/*
* We can only use sendfile on a non-chained packet
goto out;
}
+ smbd_lock_socket(smbd_server_conn);
send_file_readX(conn, req, fsp, startpos, smb_maxcnt);
+ smbd_unlock_socket(smbd_server_conn);
out:
END_PROFILE(SMBreadX);