r23779: Change from v2 or later to v3 or later.
[gd/samba/.git] / source3 / libsmb / climessage.c
index e0a308104bda1792c019e6358a1f9f408b0b2c6b..e0685958d46a991fbb36ae1cf3b9ef13eb92a8b6 100644 (file)
@@ -1,12 +1,11 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 3.0
+   Unix SMB/CIFS implementation.
    client message handling routines
    Copyright (C) Andrew Tridgell 1994-1998
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */
 
-#define NO_SYSLOG
-
 #include "includes.h"
 
 
 /****************************************************************************
 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);
-       CVAL(cli->outbuf,smb_com) = SMBsendstrt;
+       set_message(NULL,cli->outbuf,0,0,True);
+       SCVAL(cli->outbuf,smb_com,SMBsendstrt);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
        cli_setup_packet(cli);
        
        p = smb_buf(cli->outbuf);
        *p++ = 4;
-       p += clistr_push(cli, p, username, -1, STR_TERMINATE);
+       p += clistr_push(cli, p, username, -1, STR_ASCII|STR_TERMINATE);
        *p++ = 4;
-       p += clistr_push(cli, p, host, -1, STR_TERMINATE);
+       p += clistr_push(cli, p, host, -1, STR_ASCII|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);      
        
@@ -53,7 +57,7 @@ BOOL cli_message_start(struct cli_state *cli, char *host, char *username,
                return False;
        }
 
-       if (cli_error(cli, NULL, NULL, NULL)) return False;
+       if (cli_is_error(cli)) return False;
 
        *grp = SVAL(cli->inbuf,smb_vwv0);
 
@@ -64,13 +68,15 @@ BOOL cli_message_start(struct cli_state *cli, char *host, char *username,
 /****************************************************************************
 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;
        char *p;
 
        memset(cli->outbuf,'\0',smb_size);
-       set_message(cli->outbuf,1,0,True);
-       CVAL(cli->outbuf,smb_com) = SMBsendtxt;
+       set_message(NULL,cli->outbuf,1,0,True);
+       SCVAL(cli->outbuf,smb_com,SMBsendtxt);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
        cli_setup_packet(cli);
 
@@ -78,18 +84,35 @@ BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp)
        
        p = smb_buf(cli->outbuf);
        *p++ = 1;
-       SSVAL(p,0,len); p += 2;
-       memcpy(p,msg,len);
-       p += len;
+
+       if ((lendos = (int)convert_string_allocate(NULL,CH_UNIX, CH_DOS, msg,len, (void **)(void *)&msgdos, True)) < 0 || !msgdos) {
+               DEBUG(3,("Conversion failed, sending message in UNIX charset\n"));
+               SSVAL(p, 0, len); p += 2;
+               memcpy(p, msg, len);
+               p += len;
+       } else {
+               SSVAL(p, 0, lendos); p += 2;
+               memcpy(p, msgdos, lendos);
+               p += lendos;
+               SAFE_FREE(msgdos);
+       }
 
        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)) {
                return False;
        }
 
-       if (cli_error(cli, NULL, NULL, NULL)) return False;
+       if (cli_is_error(cli)) return False;
 
        return True;
 }      
@@ -97,25 +120,35 @@ BOOL cli_message_text(struct cli_state *cli, char *msg, int len, int grp)
 /****************************************************************************
 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);
-       CVAL(cli->outbuf,smb_com) = SMBsendend;
+       set_message(NULL,cli->outbuf,1,0,True);
+       SCVAL(cli->outbuf,smb_com,SMBsendend);
        SSVAL(cli->outbuf,smb_tid,cli->cnum);
 
        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)) {
                return False;
        }
 
-       if (cli_error(cli, NULL, NULL, NULL)) return False;
+       if (cli_is_error(cli)) return False;
 
        return True;
 }      
-