Following info from TAKAHASHI Motonobu <monyo@samba.gr.jp>,
[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-1998
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;
35 static fstring msgfrom;
36 static fstring msgto;
37
38 /****************************************************************************
39 deliver the message
40 ****************************************************************************/
41 static void msg_deliver(void)
42 {
43   pstring name;
44   int i;
45   int fd;
46
47   if (! (*lp_msg_command()))
48     {
49       DEBUG(1,("no messaging command specified\n"));
50       msgpos = 0;
51       return;
52     }
53
54   /* put it in a temporary file */
55   slprintf(name,sizeof(name)-1, "%s/msg.XXXXXX",tmpdir());
56   fd = smb_mkstemp(name);
57
58   if (fd == -1) {
59     DEBUG(1,("can't open message file %s\n",name));
60     return;
61   }
62
63   /*
64    * Incoming message is in DOS codepage format. Convert to UNIX.
65    */
66
67   if(msgpos > 0) {
68     msgbuf[msgpos] = '\0'; /* Ensure null terminated. */
69     pstrcpy(msgbuf,dos_to_unix(msgbuf,False));
70   }
71
72   for (i=0;i<msgpos;) {
73     if (msgbuf[i]=='\r' && i<(msgpos-1) && msgbuf[i+1]=='\n') {
74       i++; continue;      
75     }
76     write(fd,&msgbuf[i++],1);
77   }
78   close(fd);
79
80
81   /* run the command */
82   if (*lp_msg_command())
83     {
84       fstring alpha_msgfrom;
85       fstring alpha_msgto;
86       pstring s;
87
88       pstrcpy(s,lp_msg_command());
89       pstring_sub(s,"%f",alpha_strcpy(alpha_msgfrom,msgfrom,sizeof(alpha_msgfrom)));
90       pstring_sub(s,"%t",alpha_strcpy(alpha_msgto,msgto,sizeof(alpha_msgto)));
91       standard_sub_basic(s);
92       pstring_sub(s,"%s",name);
93       smbrun(s,NULL);
94     }
95
96   msgpos = 0;
97 }
98
99
100
101 /****************************************************************************
102   reply to a sends
103 ****************************************************************************/
104 int reply_sends(connection_struct *conn,
105                 char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
106 {
107   int len;
108   char *msg;
109   int outsize = 0;
110   char *p;
111
112   START_PROFILE(SMBsends);
113
114   msgpos = 0;
115
116   if (! (*lp_msg_command())) {
117     END_PROFILE(SMBsends);
118     return(ERROR(ERRSRV,ERRmsgoff));
119   }
120
121   outsize = set_message(outbuf,0,0,True);
122
123   p = smb_buf(inbuf)+1;
124   p += srvstr_pull(inbuf, msgfrom, p, sizeof(msgfrom), -1, STR_TERMINATE|STR_CONVERT) + 1;
125   p += srvstr_pull(inbuf, msgto, p, sizeof(msgto), -1, STR_TERMINATE|STR_CONVERT) + 1;
126
127   msg = p;
128
129   len = SVAL(msg,0);
130   len = MIN(len,sizeof(msgbuf)-msgpos);
131
132   memset(msgbuf,'\0',sizeof(msgbuf));
133
134   memcpy(&msgbuf[msgpos],msg+2,len);
135   msgpos += len;
136
137   msg_deliver();
138
139   END_PROFILE(SMBsends);
140   return(outsize);
141 }
142
143
144 /****************************************************************************
145   reply to a sendstrt
146 ****************************************************************************/
147 int reply_sendstrt(connection_struct *conn,
148                    char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
149 {
150   int outsize = 0;
151   char *p;
152
153   START_PROFILE(SMBsendstrt);
154
155   if (! (*lp_msg_command())) {
156     END_PROFILE(SMBsendstrt);
157     return(ERROR(ERRSRV,ERRmsgoff));
158   }
159
160   outsize = set_message(outbuf,1,0,True);
161
162   memset(msgbuf,'\0',sizeof(msgbuf));
163   msgpos = 0;
164
165   p = smb_buf(inbuf)+1;
166   p += srvstr_pull(inbuf, msgfrom, p, sizeof(msgfrom), -1, STR_TERMINATE|STR_CONVERT) + 1;
167   p += srvstr_pull(inbuf, msgto, p, sizeof(msgto), -1, STR_TERMINATE|STR_CONVERT) + 1;
168
169   DEBUG( 3, ( "SMBsendstrt (from %s to %s)\n", msgfrom, msgto ) );
170
171   END_PROFILE(SMBsendstrt);
172   return(outsize);
173 }
174
175
176 /****************************************************************************
177   reply to a sendtxt
178 ****************************************************************************/
179 int reply_sendtxt(connection_struct *conn,
180                   char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
181 {
182   int len;
183   int outsize = 0;
184   char *msg;
185   START_PROFILE(SMBsendtxt);
186
187   if (! (*lp_msg_command())) {
188     END_PROFILE(SMBsendtxt);
189     return(ERROR(ERRSRV,ERRmsgoff));
190   }
191
192   outsize = set_message(outbuf,0,0,True);
193
194   msg = smb_buf(inbuf) + 1;
195
196   len = SVAL(msg,0);
197   len = MIN(len,sizeof(msgbuf)-msgpos);
198
199   memcpy(&msgbuf[msgpos],msg+2,len);
200   msgpos += len;
201
202   DEBUG( 3, ( "SMBsendtxt\n" ) );
203
204   END_PROFILE(SMBsendtxt);
205   return(outsize);
206 }
207
208
209 /****************************************************************************
210   reply to a sendend
211 ****************************************************************************/
212 int reply_sendend(connection_struct *conn,
213                   char *inbuf,char *outbuf, int dum_size, int dum_buffsize)
214 {
215   int outsize = 0;
216   START_PROFILE(SMBsendend);
217
218   if (! (*lp_msg_command())) {
219     END_PROFILE(SMBsendend);
220     return(ERROR(ERRSRV,ERRmsgoff));
221   }
222
223   outsize = set_message(outbuf,0,0,True);
224
225   DEBUG(3,("SMBsendend\n"));
226
227   msg_deliver();
228
229   END_PROFILE(SMBsendend);
230   return(outsize);
231 }