1 /*  pckt_vmke.c
2  *
3  *  copyright (c) 2000-2003 SeaD
4  *  see GPL for copying info
5  *
6  */
7 
8 #include <string.h>
9 #include <unistd.h>
10 #include "echat.h"
11 #include "pckt_vpak.h"
12 
make_vhead(void)13 char *make_vhead(void) {
14     static char head[HEADER_LEN];
15     register int n;
16 
17     if (config->packet_qchat) { *head = '\0'; return (head); }
18     if (config->packet_xor) *head = PACKET_VYPRESSXOR;
19     else *head = PACKET_VYPRESS;
20     for (n = 1; n < HEADER_LEN; n++)
21 #ifdef  FREEBSD
22         head[n] = 'a' + ((char) random() & 0x0f);
23 #else   /* FREEBSD */
24         head[n] = 'a' + ((char) rand() & 0x0f);
25 #endif  /* FREEBSD */
26     return (head);
27 }
28 
make_vherewho(void)29 void make_vherewho(void) {
30     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c",
31         make_vhead(), MSG_VHEREWHO,
32         config->nick, MSG_SPLIT);
33 }
34 
make_vhereim(void)35 void make_vhereim(void) {
36     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%u%u",
37         make_vhead(), MSG_VHEREIM,
38         status->nick, MSG_SPLIT,
39         config->nick, MSG_SPLIT,
40         config->mode, config->active);
41 }
42 
make_vchat(void)43 void make_vchat(void) {
44     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c",
45         make_vhead(), MSG_VCHAT,
46         status->room->name, MSG_SPLIT,
47         config->nick, MSG_SPLIT,
48         buf, MSG_SPLIT);
49 }
50 
make_vnick(void)51 void make_vnick(void) {
52     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%u",
53         make_vhead(), MSG_VNICK,
54         status->nick, MSG_SPLIT,
55         config->nick, MSG_SPLIT,
56         config->gender);
57 }
58 
make_qnick(void)59 void make_qnick(void) {
60     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c",
61         make_vhead(), MSG_VNICK,
62         status->nick, MSG_SPLIT,
63         config->nick, MSG_SPLIT);
64 }
65 
make_vjoin(void)66 void make_vjoin(void) {
67     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%u%u",
68         make_vhead(), MSG_VJOIN,
69         config->nick, MSG_SPLIT,
70         status->channel, MSG_SPLIT,
71         config->mode, config->gender);
72 }
73 
make_qjoin(void)74 void make_qjoin(void) {
75     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%u",
76         make_vhead(), MSG_VJOIN,
77         config->nick, MSG_SPLIT,
78         status->channel, MSG_SPLIT,
79         config->mode);
80 }
81 
make_vleave(void)82 void make_vleave(void) {
83     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%u",
84         make_vhead(), MSG_VLEAVE,
85         config->nick, MSG_SPLIT,
86         status->channel, MSG_SPLIT,
87         config->gender);
88 }
89 
make_qleave(void)90 void make_qleave(void) {
91     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c",
92         make_vhead(), MSG_VLEAVE,
93         config->nick, MSG_SPLIT,
94         status->channel, MSG_SPLIT);
95 }
96 
make_vmesg(void)97 void make_vmesg(void) {
98     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c",
99         make_vhead(), MSG_VMESG,
100         config->nick, MSG_SPLIT,
101         status->nick, MSG_SPLIT,
102         buf, MSG_SPLIT);
103 }
104 
make_vmass(void)105 void make_vmass(void) {
106     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c",
107         make_vhead(), MSG_VMASS,
108         config->nick, MSG_SPLIT,
109         status->nick, MSG_SPLIT,
110         buf, MSG_SPLIT);
111 }
112 
make_vmesgack(void)113 void make_vmesgack(void) {
114     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c%u%s%s%s%c",
115         make_vhead(), MSG_VMESGACK,
116         config->mode,
117         status->nick, MSG_SPLIT,
118         config->nick, MSG_SPLIT,
119         config->gender,
120         (config->mode == MOD_DND) ? config->answer_dnd : "",
121         (config->mode == MOD_AWAY) ? config->answer_away : "",
122         (config->mode == MOD_OFF) ? config->answer_off : "",
123         MSG_SPLIT);
124 }
125 
make_qmesgack(void)126 void make_qmesgack(void) {
127     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c",
128         make_vhead(), MSG_VMESGACK,
129         config->mode,
130         status->nick, MSG_SPLIT,
131         config->nick, MSG_SPLIT);
132 }
133 
make_vexec(void)134 void make_vexec(void) {
135     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c%s%c",
136         make_vhead(), MSG_VEXEC,
137         config->nick, MSG_SPLIT,
138         status->nick, MSG_SPLIT,
139         buf, MSG_SPLIT,
140         "", MSG_SPLIT);        /* FIXME: no passwords */
141 }
142 
make_vexecack(void)143 void make_vexecack(void) {
144     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c",
145         make_vhead(), MSG_VEXECACK,
146         status->nick, MSG_SPLIT,
147         config->nick, MSG_SPLIT,
148         "Get out!!!", MSG_SPLIT);
149 }
150 
make_vme(void)151 void make_vme(void) {
152     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c",
153         make_vhead(), MSG_VME,
154         status->room->name, MSG_SPLIT,
155         config->nick, MSG_SPLIT,
156         buf, MSG_SPLIT);
157 }
158 
make_vtopicnew(void)159 void make_vtopicnew(void) {
160     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c",
161         make_vhead(), MSG_VTOPICNEW,
162         status->room->name, MSG_SPLIT,
163         status->room->topic, MSG_SPLIT);
164 }
165 
make_qtopicnew(void)166 void make_qtopicnew(void) {
167     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c",
168         make_vhead(), MSG_VTOPICNEW,
169         status->chnl[0].topic, MSG_SPLIT);
170 }
171 
make_vtopic(void)172 void make_vtopic(void) {
173     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c",
174         make_vhead(), MSG_VTOPIC,
175         status->nick, MSG_SPLIT,
176         status->channel, MSG_SPLIT,
177         status->chnl[chnl_getnum()].topic, MSG_SPLIT);
178 }
179 
make_qtopic(void)180 void make_qtopic(void) {
181     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c",
182         make_vhead(), MSG_VTOPIC,
183         status->nick, MSG_SPLIT,
184         status->chnl[0].topic, MSG_SPLIT);
185 }
186 
make_vmode(void)187 void make_vmode(void) {
188     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%u%u%s%s%s%c",
189         make_vhead(), MSG_VMODE,
190         config->nick, MSG_SPLIT,
191         config->mode, config->gender,
192         (config->mode == MOD_DND) ? config->answer_dnd : "",
193         (config->mode == MOD_AWAY) ? config->answer_away : "",
194         (config->mode == MOD_OFF) ? config->answer_off : "",
195         MSG_SPLIT);
196 }
197 
make_qmode(void)198 void make_qmode(void) {
199     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%u",
200         make_vhead(), MSG_VMODE,
201         config->nick, MSG_SPLIT,
202         config->mode);
203 }
204 
make_vinfo(void)205 void make_vinfo(void) {
206     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c",
207         make_vhead(), MSG_VINFO,
208         status->nick, MSG_SPLIT,
209         config->nick, MSG_SPLIT);
210 }
211 
make_vinform(void)212 void make_vinform(void) {
213     char host[STR_SIZE];
214     char addr[ADDR_SIZE+1];
215     char chnlslist[STR_SIZE];
216     register int n;
217 
218     gethostname(host, STR_SIZE);
219     for (n = 0; n < status->users; n++)
220         if (!strncmp(status->user[n].nick, config->nick, NICK_MAXLEN)) break;
221     if (n == status->users) *addr = '\0';
222     else strncpy(addr, status->user[n].addr, ADDR_SIZE);
223     strncpy(chnlslist, status->chnl[0].name, CHANNEL_MAXLEN);
224     for (n = 1; n < status->channels; n++)
225         if (status->chnl[n].name[0] == CHR_CHNL)
226             strncat(chnlslist, status->chnl[n].name, CHANNEL_MAXLEN);
227     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c%s%c%s%c%s#%c%s%s%s%c",
228         make_vhead(), MSG_VINFORM,
229         status->nick, MSG_SPLIT,
230         config->nick, MSG_SPLIT,
231         host, MSG_SPLIT,
232         config->nick, MSG_SPLIT,
233         addr, MSG_SPLIT,
234         chnlslist, MSG_SPLIT,
235         (config->mode == MOD_DND) ? config->answer_dnd : "",
236         (config->mode == MOD_AWAY) ? config->answer_away : "",
237         (config->mode == MOD_OFF) ? config->answer_off : "",
238         MSG_SPLIT);
239 }
240 
make_qinform(void)241 void make_qinform(void) {
242     char host[STR_SIZE];
243 /*    char addr[ADDR_SIZE]; */
244     char chnlslist[STR_SIZE];
245     register int n;
246 
247     gethostname(host, STR_SIZE);
248 /*    for (n = 0; n < status->users; n++)
249         if (!strncmp(status->user[n].nick, config->nick, NICK_MAXLEN)) break;
250     if (n == status->users) *addr = '\0';
251     else strncpy(addr, status->user[n].addr, ADDR_SIZE); */
252     strncpy(chnlslist, status->chnl[0].name, CHANNEL_MAXLEN);
253     for (n = 1; n < status->channels; n++)
254         if (status->chnl[n].name[0] == CHR_CHNL)
255             strncat(chnlslist, status->chnl[n].name, CHANNEL_MAXLEN); /* FIXME */
256     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c%s%cN/A%cN/A%c%s#%c",
257         make_vhead(), MSG_VINFORM,
258         status->nick, MSG_SPLIT,
259         config->nick, MSG_SPLIT,
260         host, MSG_SPLIT,
261         config->nick, MSG_SPLIT,
262         MSG_SPLIT, MSG_SPLIT,
263         chnlslist, MSG_SPLIT);
264 }
265 
make_vbeepbeep(void)266 void make_vbeepbeep(void) {
267     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c",
268         make_vhead(), MSG_VBEEP, MSG_VBEEPBEEP,
269         status->nick, MSG_SPLIT,
270         config->nick, MSG_SPLIT);
271 }
272 
make_vbeepack(void)273 void make_vbeepack(void) {
274     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c%u",
275         make_vhead(), MSG_VBEEP, MSG_VBEEPACK,
276         status->nick, MSG_SPLIT,
277         config->nick, MSG_SPLIT, config->gender);
278 }
279 
make_qbeepack(void)280 void make_qbeepack(void) {
281     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c",
282         make_vhead(), MSG_VBEEP, MSG_VBEEPACK,
283         status->nick, MSG_SPLIT,
284         config->nick, MSG_SPLIT);
285 }
286 
make_vbeepreq(void)287 void make_vbeepreq(void) {                /* FIXME: dont implemented */
288     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c",
289         make_vhead(), MSG_VBEEPREQ,
290         config->nick, MSG_SPLIT,
291         buf, MSG_SPLIT,
292         status->room->name, MSG_SPLIT);
293 }
294 
make_vprivatjoin(void)295 void make_vprivatjoin(void) {
296     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c%u",
297         make_vhead(), MSG_VPRIVAT, MSG_VPRIVATJOIN,
298         config->nick, MSG_SPLIT,
299         status->channel, MSG_SPLIT,
300         config->gender);
301 }
302 
make_qprivatjoin(void)303 void make_qprivatjoin(void) {
304     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c",
305         make_vhead(), MSG_VPRIVAT, MSG_VPRIVATJOIN,
306         config->nick, MSG_SPLIT,
307         status->channel, MSG_SPLIT);
308 }
309 
make_vprivatleave(void)310 void make_vprivatleave(void) {
311     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c%u",
312         make_vhead(), MSG_VPRIVAT, MSG_VPRIVATLEAVE,
313         config->nick, MSG_SPLIT,
314         status->channel, MSG_SPLIT,
315         config->gender);
316 }
317 
make_qprivatleave(void)318 void make_qprivatleave(void) {
319     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c",
320         make_vhead(), MSG_VPRIVAT, MSG_VPRIVATLEAVE,
321         config->nick, MSG_SPLIT,
322         status->channel, MSG_SPLIT);
323 }
324 
make_vprivatchat(void)325 void make_vprivatchat(void) {
326     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c%s%c",
327         make_vhead(), MSG_VPRIVAT, MSG_VPRIVATCHAT,
328         config->nick, MSG_SPLIT,
329         status->channel, MSG_SPLIT,
330         buf, MSG_SPLIT);
331 }
332 
make_vprivatme(void)333 void make_vprivatme(void) {
334     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%u%s%c%s%c%s%c",
335         make_vhead(), MSG_VPRIVAT, MSG_VPRIVATME,
336         config->nick, MSG_SPLIT,
337         status->channel, MSG_SPLIT,
338         buf, MSG_SPLIT);
339 }
340 
make_vhere(void)341 void make_vhere(void) {
342     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c",
343         make_vhead(), MSG_VHERE,
344         config->nick, MSG_SPLIT,
345         status->channel, MSG_SPLIT);
346 }
347 
make_vherewe(void)348 void make_vherewe(void) {
349     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s%c%s%c%u",
350         make_vhead(), MSG_VHEREWE,
351         status->nick, MSG_SPLIT,
352         status->channel, MSG_SPLIT,
353         config->nick, MSG_SPLIT, config->active);
354 }
355 
make_vactive(void)356 void make_vactive(void) {
357     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%u",
358         make_vhead(), MSG_VACTIVE,
359         config->nick, MSG_SPLIT, config->active);
360 }
361 
make_vuserchnls(void)362 void make_vuserchnls(void) {
363     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c",
364         make_vhead(), MSG_VUSERCHNLS,
365         config->nick, MSG_SPLIT);
366 }
367 
make_vuserchnlslist(void)368 void make_vuserchnlslist(void) {
369     status->packet_len = snprintf(packet, MSG_SIZE, "%s%c%s%c%s#%c",
370         make_vhead(), MSG_VUSERCHNLSLIST,
371         status->nick, MSG_SPLIT,
372         status->info.chnlslist, MSG_SPLIT);
373 }
374