1 /*
2 * decode_irc.c
3 *
4 * Internet Relay Chat.
5 *
6 * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
7 *
8 * $Id: decode_irc.c,v 1.6 2001/03/15 08:33:01 dugsong Exp $
9 */
10
11 #include "config.h"
12
13 #include <sys/types.h>
14
15 #include <stdio.h>
16 #include <string.h>
17
18 #include "buf.h"
19 #include "decode.h"
20
21 int
decode_irc(u_char * buf,int len,u_char * obuf,int olen)22 decode_irc(u_char *buf, int len, u_char *obuf, int olen)
23 {
24 struct buf *line, inbuf, outbuf;
25 int i, got_auth;
26
27 buf_init(&inbuf, buf, len);
28 buf_init(&outbuf, obuf, olen);
29 got_auth = 0;
30
31 while ((i = buf_index(&inbuf, "\n", 1)) != -1) {
32 line = buf_tok(&inbuf, NULL, i);
33 buf_skip(&inbuf, 1);
34
35 if (i > 0 && line->base[i - 1] == '\r')
36 line->end--;
37 line->base[line->end] = '\0';
38
39 if (buf_cmp(&inbuf, ";", 1) == 0) {
40 if ((i = buf_index(line, " ", 1)) < 0)
41 continue;
42 buf_skip(line, i + 1);
43 }
44 if (buf_cmp(line, "USER ", 5) == 0 ||
45 buf_cmp(line, "NICK ", 5) == 0) {
46 buf_rewind(line);
47 buf_putf(&outbuf, "%s\n", buf_ptr(line));
48 }
49 else if (buf_cmp(line, "PASS ", 5) == 0 ||
50 buf_cmp(line, "OPER ", 5) == 0) {
51 buf_rewind(line);
52 buf_putf(&outbuf, "%s\n", buf_ptr(line));
53 got_auth = 1;
54 }
55 else if (buf_cmp(line, "MODE ", 5) == 0 &&
56 buf_index(line, " +k ", 4) != -1) {
57 buf_rewind(line);
58 buf_putf(&outbuf, "%s\n", buf_ptr(line));
59 got_auth = 1;
60 }
61 else if (buf_cmp(line, "JOIN ", 5) == 0) {
62 buf_skip(line, 5);
63 if ((i = buf_index(line, " ", 1)) < 0)
64 continue;
65 buf_skip(line, i + 1);
66 if (buf_len(line) < 1)
67 continue;
68 buf_rewind(line);
69 buf_putf(&outbuf, "%s\n", buf_ptr(line));
70 got_auth = 1;
71 }
72 }
73 buf_end(&outbuf);
74
75 return (got_auth ? buf_len(&outbuf) : 0);
76 }
77