1996-05-04 11:50:46 +04:00
/*
Unix SMB / Netbios implementation .
Version 1.9 .
SMB messaging
1997-05-08 05:14:17 +04:00
Copyright ( C ) Andrew Tridgell 1992 - 1997
1996-05-04 11:50:46 +04:00
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
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
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 0213 9 , USA .
*/
/*
This file handles the messaging system calls for winpopup style
messages
*/
# include "includes.h"
/* look in server.c for some explanation of these variables */
extern int DEBUGLEVEL ;
static char msgbuf [ 1600 ] ;
static int msgpos = 0 ;
static fstring msgfrom = " " ;
static fstring msgto = " " ;
/****************************************************************************
deliver the message
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
static void msg_deliver ( void )
{
pstring s ;
fstring name ;
int i ;
1996-10-04 13:31:07 +04:00
int fd ;
1996-05-04 11:50:46 +04:00
if ( ! ( * lp_msg_command ( ) ) )
{
DEBUG ( 1 , ( " no messaging command specified \n " ) ) ;
msgpos = 0 ;
return ;
}
/* put it in a temporary file */
1996-10-24 04:09:08 +04:00
sprintf ( s , " %s/msg.XXXXXX " , tmpdir ( ) ) ;
1996-05-04 11:50:46 +04:00
strcpy ( name , ( char * ) mktemp ( s ) ) ;
1996-10-04 13:31:07 +04:00
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 ;
}
1996-05-04 11:50:46 +04:00
1996-10-04 13:31:07 +04:00
for ( i = 0 ; i < msgpos ; ) {
if ( msgbuf [ i ] = = ' \r ' & & i < ( msgpos - 1 ) & & msgbuf [ i + 1 ] = = ' \n ' ) {
i + + ; continue ;
1996-05-04 11:50:46 +04:00
}
1996-10-04 13:31:07 +04:00
write ( fd , & msgbuf [ i + + ] , 1 ) ;
}
close ( fd ) ;
1996-05-04 11:50:46 +04:00
/* 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 ) ;
1996-10-04 13:31:07 +04:00
smbrun ( s , NULL , False ) ;
1996-05-04 11:50:46 +04:00
}
msgpos = 0 ;
}
/****************************************************************************
reply to a sends
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int reply_sends ( char * inbuf , char * outbuf )
{
int len ;
char * orig , * dest , * msg ;
int outsize = 0 ;
msgpos = 0 ;
if ( ! ( * lp_msg_command ( ) ) )
return ( ERROR ( ERRSRV , ERRmsgoff ) ) ;
outsize = set_message ( outbuf , 0 , 0 , True ) ;
orig = smb_buf ( inbuf ) + 1 ;
dest = skip_string ( orig , 1 ) + 1 ;
msg = skip_string ( dest , 1 ) + 1 ;
strcpy ( msgfrom , orig ) ;
strcpy ( msgto , dest ) ;
len = SVAL ( msg , 0 ) ;
len = MIN ( len , 1600 - msgpos ) ;
memcpy ( & msgbuf [ msgpos ] , msg + 2 , len ) ;
msgpos + = len ;
DEBUG ( 3 , ( " %s SMBsends (from %s to %s) \n " , timestring ( ) , orig , dest ) ) ;
msg_deliver ( ) ;
return ( outsize ) ;
}
/****************************************************************************
reply to a sendstrt
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int reply_sendstrt ( char * inbuf , char * outbuf )
{
char * orig , * dest ;
int outsize = 0 ;
if ( ! ( * lp_msg_command ( ) ) )
return ( ERROR ( ERRSRV , ERRmsgoff ) ) ;
outsize = set_message ( outbuf , 1 , 0 , True ) ;
msgpos = 0 ;
orig = smb_buf ( inbuf ) + 1 ;
dest = skip_string ( orig , 1 ) + 1 ;
strcpy ( msgfrom , orig ) ;
strcpy ( msgto , dest ) ;
DEBUG ( 3 , ( " %s SMBsendstrt (from %s to %s) \n " , timestring ( ) , orig , dest ) ) ;
return ( outsize ) ;
}
/****************************************************************************
reply to a sendtxt
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int reply_sendtxt ( char * inbuf , char * outbuf )
{
int len ;
int outsize = 0 ;
char * msg ;
if ( ! ( * lp_msg_command ( ) ) )
return ( ERROR ( ERRSRV , ERRmsgoff ) ) ;
outsize = set_message ( outbuf , 0 , 0 , True ) ;
msg = smb_buf ( inbuf ) + 1 ;
len = SVAL ( msg , 0 ) ;
len = MIN ( len , 1600 - msgpos ) ;
memcpy ( & msgbuf [ msgpos ] , msg + 2 , len ) ;
msgpos + = len ;
DEBUG ( 3 , ( " %s SMBsendtxt \n " , timestring ( ) ) ) ;
return ( outsize ) ;
}
/****************************************************************************
reply to a sendend
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
int reply_sendend ( char * inbuf , char * outbuf )
{
int outsize = 0 ;
if ( ! ( * lp_msg_command ( ) ) )
return ( ERROR ( ERRSRV , ERRmsgoff ) ) ;
outsize = set_message ( outbuf , 0 , 0 , True ) ;
DEBUG ( 3 , ( " %s SMBsendend \n " , timestring ( ) ) ) ;
msg_deliver ( ) ;
return ( outsize ) ;
}