diff options
Diffstat (limited to 'source3/smbd/message.c')
-rw-r--r-- | source3/smbd/message.c | 156 |
1 files changed, 90 insertions, 66 deletions
diff --git a/source3/smbd/message.c b/source3/smbd/message.c index 6a96b4c7a9..971834c012 100644 --- a/source3/smbd/message.c +++ b/source3/smbd/message.c @@ -1,8 +1,7 @@ /* - 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 @@ -25,26 +24,23 @@ #include "includes.h" -#include "loadparm.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 ****************************************************************************/ static void msg_deliver(void) { - pstring s; - fstring name; - FILE *f; + pstring name; int i; + int fd; if (! (*lp_msg_command())) { @@ -54,34 +50,43 @@ static void msg_deliver(void) } /* put it in a temporary file */ - sprintf(s,"/tmp/msg.XXXXXX"); - strcpy(name,(char *)mktemp(s)); + slprintf(name,sizeof(name)-1, "%s/msg.XXXXXX",tmpdir()); + fd = smb_mkstemp(name); - f = fopen(name,"w"); - if (!f) - { - DEBUG(1,("can't open message file %s\n",name)); - return; - } + 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++; - fputc(msgbuf[i++],f); - } + /* + * Incoming message is in DOS codepage format. Convert to UNIX. + */ - fclose(f); + if(msgpos > 0) { + msgbuf[msgpos] = '\0'; /* Ensure null terminated. */ + } + + 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); + 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, s); + pstring_sub(s,"%s",name); smbrun(s,NULL); } @@ -93,37 +98,42 @@ static void msg_deliver(void) /**************************************************************************** reply to a sends ****************************************************************************/ -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; + 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); - 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(inbuf, msgfrom, p, sizeof(msgfrom), -1, STR_TERMINATE) + 1; + p += srvstr_pull(inbuf, msgto, p, sizeof(msgto), -1, STR_TERMINATE) + 1; - strcpy(msgfrom,orig); - strcpy(msgto,dest); + msg = p; len = SVAL(msg,0); - len = MIN(len,1600-msgpos); + len = MIN(len,sizeof(msgbuf)-msgpos); + + memset(msgbuf,'\0',sizeof(msgbuf)); memcpy(&msgbuf[msgpos],msg+2,len); msgpos += len; - DEBUG(3,("%s SMBsends (from %s to %s)\n",timestring(),orig,dest)); - msg_deliver(); + END_PROFILE(SMBsends); return(outsize); } @@ -131,26 +141,31 @@ int reply_sends(char *inbuf,char *outbuf) /**************************************************************************** reply to a sendstrt ****************************************************************************/ -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; + char *p; - if (! (*lp_msg_command())) - return(ERROR(ERRSRV,ERRmsgoff)); + START_PROFILE(SMBsendstrt); + + if (! (*lp_msg_command())) { + END_PROFILE(SMBsendstrt); + return(ERROR_DOS(ERRSRV,ERRmsgoff)); + } outsize = set_message(outbuf,1,0,True); + memset(msgbuf,'\0',sizeof(msgbuf)); msgpos = 0; - orig = smb_buf(inbuf)+1; - dest = skip_string(orig,1)+1; - - strcpy(msgfrom,orig); - strcpy(msgto,dest); + p = smb_buf(inbuf)+1; + p += srvstr_pull(inbuf, msgfrom, p, sizeof(msgfrom), -1, STR_TERMINATE) + 1; + p += srvstr_pull(inbuf, msgto, p, sizeof(msgto), -1, 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 ) ); + END_PROFILE(SMBsendstrt); return(outsize); } @@ -158,27 +173,32 @@ int reply_sendstrt(char *inbuf,char *outbuf) /**************************************************************************** reply to a sendtxt ****************************************************************************/ -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; + 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); msg = smb_buf(inbuf) + 1; len = SVAL(msg,0); - len = MIN(len,1600-msgpos); + len = MIN(len,sizeof(msgbuf)-msgpos); memcpy(&msgbuf[msgpos],msg+2,len); msgpos += len; - DEBUG(3,("%s SMBsendtxt\n",timestring())); + DEBUG( 3, ( "SMBsendtxt\n" ) ); + END_PROFILE(SMBsendtxt); return(outsize); } @@ -186,19 +206,23 @@ int reply_sendtxt(char *inbuf,char *outbuf) /**************************************************************************** reply to a sendend ****************************************************************************/ -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; + 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); - DEBUG(3,("%s SMBsendend\n",timestring())); + DEBUG(3,("SMBsendend\n")); msg_deliver(); + END_PROFILE(SMBsendend); return(outsize); } - |