/*
- Unix SMB/Netbios implementation.
- Version 1.9.
+ Unix SMB/CIFS implementation.
SMB messaging
- Copyright (C) Andrew Tridgell 1992-1995
+ Copyright (C) Andrew Tridgell 1992-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,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/*
This file handles the messaging system calls for winpopup style
#include "includes.h"
-/* look in server.c for some explanation of these variables */
-extern int DEBUGLEVEL;
-
+extern userdom_struct current_user_info;
+/* look in server.c for some explanation of these variables */
static char msgbuf[1600];
-static int msgpos=0;
-static fstring msgfrom="";
-static fstring msgto="";
+static int msgpos;
+static fstring msgfrom;
+static fstring msgto;
/****************************************************************************
-deliver the message
+ Deliver the message.
****************************************************************************/
+
static void msg_deliver(void)
{
- pstring s;
- fstring name;
- int i;
- int fd;
-
- if (! (*lp_msg_command()))
- {
- DEBUG(1,("no messaging command specified\n"));
- msgpos = 0;
- return;
- }
-
- /* put it in a temporary file */
- sprintf(s,"/tmp/msg.XXXXXX");
- strcpy(name,(char *)mktemp(s));
-
- fd = open(name,O_WRONLY|O_CREAT|O_TRUNC|O_EXCL,0600);
- if (fd == -1) {
- DEBUG(1,("can't open message file %s\n",name));
- return;
- }
-
- for (i=0;i<msgpos;) {
- if (msgbuf[i]=='\r' && i<(msgpos-1) && msgbuf[i+1]=='\n') {
- i++; continue;
- }
- write(fd,&msgbuf[i++],1);
- }
- close(fd);
-
-
- /* run the command */
- if (*lp_msg_command())
- {
- strcpy(s,lp_msg_command());
- string_sub(s,"%s",name);
- string_sub(s,"%f",msgfrom);
- string_sub(s,"%t",msgto);
- standard_sub(-1,s);
- smbrun(s,NULL,False);
- }
-
- msgpos = 0;
+ pstring name;
+ int i;
+ int fd;
+ char *msg;
+ int len;
+ ssize_t sz;
+
+ if (! (*lp_msg_command())) {
+ DEBUG(1,("no messaging command specified\n"));
+ msgpos = 0;
+ return;
+ }
+
+ /* put it in a temporary file */
+ slprintf(name,sizeof(name)-1, "%s/msg.XXXXXX",tmpdir());
+ fd = smb_mkstemp(name);
+
+ if (fd == -1) {
+ DEBUG(1,("can't open message file %s\n",name));
+ return;
+ }
+
+ /*
+ * Incoming message is in DOS codepage format. Convert to UNIX.
+ */
+
+ if ((len = (int)convert_string_allocate(NULL,CH_DOS, CH_UNIX, msgbuf, msgpos, (void **)(void *)&msg, True)) < 0 || !msg) {
+ DEBUG(3,("Conversion failed, delivering message in DOS codepage format\n"));
+ for (i = 0; i < msgpos;) {
+ if (msgbuf[i] == '\r' && i < (msgpos-1) && msgbuf[i+1] == '\n') {
+ i++;
+ continue;
+ }
+ sz = write(fd, &msgbuf[i++], 1);
+ if ( sz != 1 ) {
+ DEBUG(0,("Write error to fd %d: %ld(%d)\n",fd, (long)sz, errno ));
+ }
+ }
+ } else {
+ for (i = 0; i < len;) {
+ if (msg[i] == '\r' && i < (len-1) && msg[i+1] == '\n') {
+ i++;
+ continue;
+ }
+ sz = write(fd, &msg[i++],1);
+ if ( sz != 1 ) {
+ DEBUG(0,("Write error to fd %d: %ld(%d)\n",fd, (long)sz, errno ));
+ }
+ }
+ SAFE_FREE(msg);
+ }
+ close(fd);
+
+ /* run the command */
+ if (*lp_msg_command()) {
+ fstring alpha_msgfrom;
+ fstring alpha_msgto;
+ pstring s;
+
+ pstrcpy(s,lp_msg_command());
+ pstring_sub(s,"%f",alpha_strcpy(alpha_msgfrom,msgfrom,NULL,sizeof(alpha_msgfrom)));
+ pstring_sub(s,"%t",alpha_strcpy(alpha_msgto,msgto,NULL,sizeof(alpha_msgto)));
+ standard_sub_basic(current_user_info.smb_name,
+ current_user_info.domain, s, sizeof(s));
+ pstring_sub(s,"%s",name);
+ smbrun(s,NULL);
+ }
+
+ msgpos = 0;
}
-
-
/****************************************************************************
- reply to a sends
+ Reply to a sends.
+ conn POINTER CAN BE NULL HERE !
****************************************************************************/
-int reply_sends(char *inbuf,char *outbuf)
+
+int reply_sends(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
{
- int len;
- char *orig,*dest,*msg;
- int outsize = 0;
+ int len;
+ char *msg;
+ int outsize = 0;
+ char *p;
- msgpos = 0;
+ START_PROFILE(SMBsends);
+ msgpos = 0;
- if (! (*lp_msg_command()))
- return(ERROR(ERRSRV,ERRmsgoff));
+ if (! (*lp_msg_command())) {
+ END_PROFILE(SMBsends);
+ return(ERROR_DOS(ERRSRV,ERRmsgoff));
+ }
- outsize = set_message(outbuf,0,0,True);
+ outsize = set_message(inbuf,outbuf,0,0,True);
- orig = smb_buf(inbuf)+1;
- dest = skip_string(orig,1)+1;
- msg = skip_string(dest,1)+1;
+ p = smb_buf(inbuf)+1;
+ p += srvstr_pull_buf(inbuf, SVAL(inbuf, smb_flg2), msgfrom, p,
+ sizeof(msgfrom), STR_ASCII|STR_TERMINATE) + 1;
+ p += srvstr_pull_buf(inbuf, SVAL(inbuf, smb_flg2), msgto, p,
+ sizeof(msgto), STR_ASCII|STR_TERMINATE) + 1;
- strcpy(msgfrom,orig);
- strcpy(msgto,dest);
+ msg = p;
- len = SVAL(msg,0);
- len = MIN(len,1600-msgpos);
+ len = SVAL(msg,0);
+ len = MIN(len,sizeof(msgbuf)-msgpos);
- memcpy(&msgbuf[msgpos],msg+2,len);
- msgpos += len;
+ memset(msgbuf,'\0',sizeof(msgbuf));
- DEBUG(3,("%s SMBsends (from %s to %s)\n",timestring(),orig,dest));
+ memcpy(&msgbuf[msgpos],msg+2,len);
+ msgpos += len;
- msg_deliver();
+ msg_deliver();
- return(outsize);
+ END_PROFILE(SMBsends);
+ return(outsize);
}
-
/****************************************************************************
- reply to a sendstrt
+ Reply to a sendstrt.
+ conn POINTER CAN BE NULL HERE !
****************************************************************************/
-int reply_sendstrt(char *inbuf,char *outbuf)
+
+int reply_sendstrt(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
{
- char *orig,*dest;
- int outsize = 0;
+ int outsize = 0;
+ char *p;
- if (! (*lp_msg_command()))
- return(ERROR(ERRSRV,ERRmsgoff));
+ START_PROFILE(SMBsendstrt);
- outsize = set_message(outbuf,1,0,True);
+ if (! (*lp_msg_command())) {
+ END_PROFILE(SMBsendstrt);
+ return(ERROR_DOS(ERRSRV,ERRmsgoff));
+ }
- msgpos = 0;
+ outsize = set_message(inbuf,outbuf,1,0,True);
- orig = smb_buf(inbuf)+1;
- dest = skip_string(orig,1)+1;
+ memset(msgbuf,'\0',sizeof(msgbuf));
+ msgpos = 0;
- strcpy(msgfrom,orig);
- strcpy(msgto,dest);
+ p = smb_buf(inbuf)+1;
+ p += srvstr_pull_buf(inbuf, SVAL(inbuf, smb_flg2), msgfrom, p,
+ sizeof(msgfrom), STR_ASCII|STR_TERMINATE) + 1;
+ p += srvstr_pull_buf(inbuf, SVAL(inbuf, smb_flg2), msgto, p,
+ sizeof(msgto), STR_ASCII|STR_TERMINATE) + 1;
- DEBUG(3,("%s SMBsendstrt (from %s to %s)\n",timestring(),orig,dest));
+ DEBUG( 3, ( "SMBsendstrt (from %s to %s)\n", msgfrom, msgto ) );
- return(outsize);
+ END_PROFILE(SMBsendstrt);
+ return(outsize);
}
-
/****************************************************************************
- reply to a sendtxt
+ Reply to a sendtxt.
+ conn POINTER CAN BE NULL HERE !
****************************************************************************/
-int reply_sendtxt(char *inbuf,char *outbuf)
+
+int reply_sendtxt(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
{
- int len;
- int outsize = 0;
- char *msg;
+ int len;
+ int outsize = 0;
+ char *msg;
+ START_PROFILE(SMBsendtxt);
- if (! (*lp_msg_command()))
- return(ERROR(ERRSRV,ERRmsgoff));
+ if (! (*lp_msg_command())) {
+ END_PROFILE(SMBsendtxt);
+ return(ERROR_DOS(ERRSRV,ERRmsgoff));
+ }
- outsize = set_message(outbuf,0,0,True);
+ outsize = set_message(inbuf,outbuf,0,0,True);
- msg = smb_buf(inbuf) + 1;
+ msg = smb_buf(inbuf) + 1;
- len = SVAL(msg,0);
- len = MIN(len,1600-msgpos);
+ len = SVAL(msg,0);
+ len = MIN(len,sizeof(msgbuf)-msgpos);
- memcpy(&msgbuf[msgpos],msg+2,len);
- msgpos += len;
+ memcpy(&msgbuf[msgpos],msg+2,len);
+ msgpos += len;
- DEBUG(3,("%s SMBsendtxt\n",timestring()));
+ DEBUG( 3, ( "SMBsendtxt\n" ) );
- return(outsize);
+ END_PROFILE(SMBsendtxt);
+ return(outsize);
}
-
/****************************************************************************
- reply to a sendend
+ Reply to a sendend.
+ conn POINTER CAN BE NULL HERE !
****************************************************************************/
-int reply_sendend(char *inbuf,char *outbuf)
+
+int reply_sendend(connection_struct *conn, char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
{
- int outsize = 0;
+ int outsize = 0;
+ START_PROFILE(SMBsendend);
- if (! (*lp_msg_command()))
- return(ERROR(ERRSRV,ERRmsgoff));
+ if (! (*lp_msg_command())) {
+ END_PROFILE(SMBsendend);
+ return(ERROR_DOS(ERRSRV,ERRmsgoff));
+ }
- outsize = set_message(outbuf,0,0,True);
+ outsize = set_message(inbuf,outbuf,0,0,True);
- DEBUG(3,("%s SMBsendend\n",timestring()));
+ DEBUG(3,("SMBsendend\n"));
- msg_deliver();
+ msg_deliver();
- return(outsize);
+ END_PROFILE(SMBsendend);
+ return(outsize);
}
-