Samba 3.0: climessage.c patch
David Lee
t.d.lee at durham.ac.uk
Thu Apr 24 21:16:54 GMT 2003
Enclosed is a patch to fix a blocking problem in the family of routines:
cli_message_start()
cli_message_text()
cli_message_end()
As written each of these is:
cli_message_X() {
inline_build_message_X;
cli_send_smb(cli);
cli_receive_smb(cli);
}
This has the potential to block, especially between "send" and "receive".
If the caller is something simple and synchronous, such as the "smbclient"
program, there is not really a problem. But if one builds a more
sophisticated caller, which requires asynchronous, polling I/O, then this
blocking could be unpleasant. (A potential example is "write"/"wall"
functionality discussed in recent years, which might even be part of a
future "smbd".)
The idea of the patch is to put the intricate, non-blocking
"inline_build_message_X" code as separate subroutines, so each routine now
becomes a pair:
cli_message_X_build() {
inline_build_message_X;
}
cli_message_X() {
cli_message_X_build();
cli_send_smb(cli);
cli_receive_smb(cli);
}
The change is entirely self-contained and makes (or should make!) no
difference whatsoever to existing applications and linking (such as the
"smbclient" program which continues to use the unchanged "cli_message_X()"
interface.
The gain is allowing the writing of newer applications which can call the
common-code "cli_message_X_build()" routines, and then do their own,
async, calling of "cli_send_smb()" and "cli_receive_smb()".
The patch below is against 3.0alpha23:
================================ snip ===============================
--- climessage.c.orig Mon Mar 31 03:28:29 2003
+++ climessage.c Wed Apr 23 18:00:39 2003
@@ -26,12 +26,11 @@
/****************************************************************************
start a message sequence
****************************************************************************/
-BOOL cli_message_start(struct cli_state *cli, char *host, char *username,
- int *grp)
+int cli_message_start_build(struct cli_state *cli, char *host, char *username)
{
char *p;
- /* send a SMBsendstrt command */
+ /* construct a SMBsendstrt command */
memset(cli->outbuf,'\0',smb_size);
set_message(cli->outbuf,0,0,True);
SCVAL(cli->outbuf,smb_com,SMBsendstrt);
@@ -45,6 +44,14 @@
p += clistr_push(cli, p, host, -1, STR_TERMINATE);
cli_setup_bcc(cli, p);
+
+ return(PTR_DIFF(p, cli->outbuf));
+}
+
+BOOL cli_message_start(struct cli_state *cli, char *host, char *username,
+ int *grp)
+{
+ cli_message_start_build(cli, host, username);
cli_send_smb(cli);
@@ -63,7 +70,7 @@
/****************************************************************************
send a message
****************************************************************************/
-BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp)
+int cli_message_text_build(struct cli_state *cli, char *msg, int len, int grp)
{
char *msgdos;
int lendos;
@@ -93,6 +100,14 @@
}
cli_setup_bcc(cli, p);
+
+ return(PTR_DIFF(p, cli->outbuf));
+}
+
+BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp)
+{
+ cli_message_text_build(cli, msg, len, grp);
+
cli_send_smb(cli);
if (!cli_receive_smb(cli)) {
@@ -107,8 +122,10 @@
/****************************************************************************
end a message
****************************************************************************/
-BOOL cli_message_end(struct cli_state *cli, int grp)
+int cli_message_end_build(struct cli_state *cli, int grp)
{
+ char *p;
+
memset(cli->outbuf,'\0',smb_size);
set_message(cli->outbuf,1,0,True);
SCVAL(cli->outbuf,smb_com,SMBsendend);
@@ -117,7 +134,16 @@
SSVAL(cli->outbuf,smb_vwv0,grp);
cli_setup_packet(cli);
-
+
+ p = smb_buf(cli->outbuf);
+
+ return(PTR_DIFF(p, cli->outbuf));
+}
+
+BOOL cli_message_end(struct cli_state *cli, int grp)
+{
+ cli_message_end_build(cli, grp);
+
cli_send_smb(cli);
if (!cli_receive_smb(cli)) {
================================ snip ===============================
--
: David Lee I.T. Service :
: Systems Programmer Computer Centre :
: University of Durham :
: http://www.dur.ac.uk/t.d.lee/ South Road :
: Durham :
: Phone: +44 191 334 2752 U.K. :
More information about the samba-technical
mailing list