Removed version number from file header.
[kai/samba.git] / source3 / smbd / message.c
index b368c4d031a302b2852237f6e212dc802bb4e409..971834c012c104c1827ee2be7b52d9dcadf8f2a5 100644 (file)
@@ -1,6 +1,5 @@
 /* 
-   Unix SMB/Netbios implementation.
-   Version 1.9.
+   Unix SMB/CIFS implementation.
    SMB messaging
    Copyright (C) Andrew Tridgell 1992-1998
    
 
 #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
 ****************************************************************************/
 static void msg_deliver(void)
 {
-  pstring s;
-  fstring name;
+  pstring name;
   int i;
   int fd;
 
@@ -53,15 +50,22 @@ static void msg_deliver(void)
     }
 
   /* put it in a temporary file */
-  slprintf(s,sizeof(s)-1, "%s/msg.XXXXXX",tmpdir());
-  fstrcpy(name,(char *)mktemp(s));
+  slprintf(name,sizeof(name)-1, "%s/msg.XXXXXX",tmpdir());
+  fd = smb_mkstemp(name);
 
-  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;
   }
 
+  /*
+   * Incoming message is in DOS codepage format. Convert to UNIX.
+   */
+
+  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;      
@@ -74,12 +78,16 @@ static void msg_deliver(void)
   /* run the command */
   if (*lp_msg_command())
     {
+      fstring alpha_msgfrom;
+      fstring alpha_msgto;
+      pstring s;
+
       pstrcpy(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);
+      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);
     }
 
   msgpos = 0;
@@ -90,37 +98,42 @@ static void msg_deliver(void)
 /****************************************************************************
   reply to a sends
 ****************************************************************************/
-int reply_sends(char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
+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;
 
-  fstrcpy(msgfrom,orig);
-  fstrcpy(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);
 }
 
@@ -128,26 +141,31 @@ int reply_sends(char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
 /****************************************************************************
   reply to a sendstrt
 ****************************************************************************/
-int reply_sendstrt(char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
+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;
-
-  fstrcpy(msgfrom,orig);
-  fstrcpy(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(),msgfrom,msgto));
+  DEBUG( 3, ( "SMBsendstrt (from %s to %s)\n", msgfrom, msgto ) );
 
+  END_PROFILE(SMBsendstrt);
   return(outsize);
 }
 
@@ -155,27 +173,32 @@ int reply_sendstrt(char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
 /****************************************************************************
   reply to a sendtxt
 ****************************************************************************/
-int reply_sendtxt(char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
+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);
 }
 
@@ -183,19 +206,23 @@ int reply_sendtxt(char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
 /****************************************************************************
   reply to a sendend
 ****************************************************************************/
-int reply_sendend(char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
+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);
 }
-