93a2d9d850a2c7be84e1ec7de311d1c658fbf55f
[nivanova/samba-autobuild/.git] / source3 / smbd / message.c
1 /* 
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    SMB messaging
5    Copyright (C) Andrew Tridgell 1992-1997
6    
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11    
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16    
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21 /*
22    This file handles the messaging system calls for winpopup style
23    messages
24 */
25
26
27 #include "includes.h"
28
29 /* look in server.c for some explanation of these variables */
30 extern int DEBUGLEVEL;
31
32
33 static char msgbuf[1600];
34 static int msgpos=0;
35 static fstring msgfrom="";
36 static fstring msgto="";
37
38 /****************************************************************************
39 deliver the message
40 ****************************************************************************/
41 static void msg_deliver(void)
42 {
43   pstring s;
44   fstring name;
45   int i;
46   int fd;
47
48   if (! (*lp_msg_command()))
49     {
50       DEBUG(1,("no messaging command specified\n"));
51       msgpos = 0;
52       return;
53     }
54
55   /* put it in a temporary file */
56   sprintf(s,"%s/msg.XXXXXX",tmpdir());
57   strcpy(name,(char *)mktemp(s));
58
59   fd = open(name,O_WRONLY|O_CREAT|O_TRUNC|O_EXCL,0600);
60   if (fd == -1) {
61     DEBUG(1,("can't open message file %s\n",name));
62     return;
63   }
64
65   for (i=0;i<msgpos;) {
66     if (msgbuf[i]=='\r' && i<(msgpos-1) && msgbuf[i+1]=='\n') {
67       i++; continue;      
68     }
69     write(fd,&msgbuf[i++],1);
70   }
71   close(fd);
72
73
74   /* run the command */
75   if (*lp_msg_command())
76     {
77       strcpy(s,lp_msg_command());
78       string_sub(s,"%s",name);
79       string_sub(s,"%f",msgfrom);
80       string_sub(s,"%t",msgto);
81       standard_sub(-1,s);
82       smbrun(s,NULL,False);
83     }
84
85   msgpos = 0;
86 }
87
88
89
90 /****************************************************************************
91   reply to a sends
92 ****************************************************************************/
93 int reply_sends(char *inbuf,char *outbuf)
94 {
95   int len;
96   char *orig,*dest,*msg;
97   int outsize = 0;
98
99   msgpos = 0;
100
101
102   if (! (*lp_msg_command()))
103     return(ERROR(ERRSRV,ERRmsgoff));
104
105   outsize = set_message(outbuf,0,0,True);
106
107   orig = smb_buf(inbuf)+1;
108   dest = skip_string(orig,1)+1;
109   msg = skip_string(dest,1)+1;
110
111   strcpy(msgfrom,orig);
112   strcpy(msgto,dest);
113
114   len = SVAL(msg,0);
115   len = MIN(len,1600-msgpos);
116
117   memcpy(&msgbuf[msgpos],msg+2,len);
118   msgpos += len;
119
120   DEBUG(3,("%s SMBsends (from %s to %s)\n",timestring(),orig,dest));
121
122   msg_deliver();
123
124   return(outsize);
125 }
126
127
128 /****************************************************************************
129   reply to a sendstrt
130 ****************************************************************************/
131 int reply_sendstrt(char *inbuf,char *outbuf)
132 {
133   char *orig,*dest;
134   int outsize = 0;
135
136   if (! (*lp_msg_command()))
137     return(ERROR(ERRSRV,ERRmsgoff));
138
139   outsize = set_message(outbuf,1,0,True);
140
141   msgpos = 0;
142
143   orig = smb_buf(inbuf)+1;
144   dest = skip_string(orig,1)+1;
145
146   strcpy(msgfrom,orig);
147   strcpy(msgto,dest);
148
149   DEBUG(3,("%s SMBsendstrt (from %s to %s)\n",timestring(),orig,dest));
150
151   return(outsize);
152 }
153
154
155 /****************************************************************************
156   reply to a sendtxt
157 ****************************************************************************/
158 int reply_sendtxt(char *inbuf,char *outbuf)
159 {
160   int len;
161   int outsize = 0;
162   char *msg;
163
164   if (! (*lp_msg_command()))
165     return(ERROR(ERRSRV,ERRmsgoff));
166
167   outsize = set_message(outbuf,0,0,True);
168
169   msg = smb_buf(inbuf) + 1;
170
171   len = SVAL(msg,0);
172   len = MIN(len,1600-msgpos);
173
174   memcpy(&msgbuf[msgpos],msg+2,len);
175   msgpos += len;
176
177   DEBUG(3,("%s SMBsendtxt\n",timestring()));
178
179   return(outsize);
180 }
181
182
183 /****************************************************************************
184   reply to a sendend
185 ****************************************************************************/
186 int reply_sendend(char *inbuf,char *outbuf)
187 {
188   int outsize = 0;
189
190   if (! (*lp_msg_command()))
191     return(ERROR(ERRSRV,ERRmsgoff));
192
193   outsize = set_message(outbuf,0,0,True);
194
195   DEBUG(3,("%s SMBsendend\n",timestring()));
196
197   msg_deliver();
198
199   return(outsize);
200 }
201