12
12
#include <sys/wait.h>
13
13
#include <termios.h>
14
14
15
- #define BUFF 512 /* buffer size (see RFC 2812) */
15
+ #define IRC_MSG_MAX 512 /* guaranteed max message length */
16
+ #define IRC_CHAN_MAX 200 /* gauranteed max channel length */
16
17
17
- static int conn ; /* socket connection */
18
+ static int conn ; /* connection socket */
18
19
static int verb = 0 ; /* verbose output (e.g. raw stream) */
19
20
static int cmax = 80 ; /* max number of chars per line */
20
21
static int gutl = 10 ; /* max char width of left column */
@@ -66,21 +67,24 @@ input_handler(size_t size) {
66
67
67
68
/* send command to irc server */
68
69
static void
69
- raw (char * s , char * fmt , ...) {
70
+ raw (char * cmd_str , char * fmt , ...) {
70
71
71
72
va_list ap ;
72
73
73
74
va_start (ap , fmt );
74
- vsnprintf (s , BUFF , fmt , ap );
75
+ vsnprintf (cmd_str , IRC_MSG_MAX , fmt , ap );
75
76
va_end (ap );
76
- if (verb ) printf ("<< %s" , s );
77
- write (conn , s , strlen (s ));
77
+
78
+ if (verb ) printf ("<< %s" , cmd_str );
79
+
80
+ write (conn , cmd_str , strlen (cmd_str ));
78
81
}
79
82
80
83
/* initial irc server connection */
81
84
static void
82
- irc_init (char * s ) {
85
+ irc_init (size_t size ) {
83
86
87
+ char * s = malloc (sizeof (char ) * (size + 1 ));
84
88
struct addrinfo * res , hints = {
85
89
.ai_family = AF_INET ,
86
90
.ai_socktype = SOCK_STREAM
@@ -90,11 +94,11 @@ irc_init(char *s) {
90
94
conn = socket (res -> ai_family , res -> ai_socktype , res -> ai_protocol );
91
95
connect (conn , res -> ai_addr , res -> ai_addrlen );
92
96
93
- if (nick ) raw (s , "NICK %s\r\n" , nick );
94
- if (user && real ) raw (s , "USER %s - - :%s\r\n" , user , real );
95
- if (user && !real && nick ) raw (s , "USER %s - - :%s\r\n" , user , nick );
97
+ if (nick ) raw (s , "NICK %s\r\n" , nick );
98
+ if (user && real ) raw (s , "USER %s - - :%s\r\n" , user , real );
99
+ if (user && !real && nick ) raw (s , "USER %s - - :%s\r\n" , user , nick );
96
100
if (!user && !real && nick ) raw (s , "USER %s - - :%s\r\n" , nick , nick );
97
- if (pass ) raw (s , "PASS %s\r\n" , pass );
101
+ if (pass ) raw (s , "PASS %s\r\n" , pass );
98
102
99
103
fcntl (conn , F_SETFL , O_NONBLOCK );
100
104
}
@@ -104,11 +108,11 @@ static void
104
108
printw (const char * format , ...) {
105
109
106
110
va_list argptr ;
107
- char * tok , line [BUFF + 1 ];
111
+ char * tok , line [IRC_MSG_MAX + 1 ];
108
112
int len , i , s ;
109
113
110
114
va_start (argptr , format );
111
- vsnprintf (line , BUFF + 1 , format , argptr );
115
+ vsnprintf (line , IRC_MSG_MAX + 1 , format , argptr );
112
116
va_end (argptr );
113
117
for (i = 0 ; isspace (line [i ]); i ++ ) printf ("%c" , line [i ]);
114
118
@@ -132,14 +136,14 @@ static void
132
136
parser (int sl , char * s ) {
133
137
134
138
int len , i , o = -1 ;
135
- char buf_c [BUFF + 1 ], ltr [200 ], cha [50 ], nic [200 ], hos [200 ], \
139
+ char buf_c [IRC_MSG_MAX + 1 ], ltr [200 ], cha [IRC_CHAN_MAX ], nic [200 ], hos [200 ], \
136
140
usr [200 ], cmd [200 ], msg [200 ], pre [200 ];
137
141
138
142
for (i = 0 ; i < sl ; i ++ ) {
139
143
o ++ ;
140
144
buf_c [o ] = s [i ];
141
145
142
- if ((i > 0 && s [i ] == '\n' && s [i - 1 ] == '\r' ) || o == BUFF ) {
146
+ if ((i > 0 && s [i ] == '\n' && s [i - 1 ] == '\r' ) || o == IRC_MSG_MAX ) {
143
147
buf_c [o + 1 ] = '\0' ;
144
148
o = -1 ;
145
149
@@ -208,28 +212,28 @@ main(int argc, char **argv) {
208
212
209
213
if (pid == 0 ) {
210
214
int sl , i ;
211
- char u [BUFF ], s [BUFF ];
215
+ char u [IRC_MSG_MAX ], s [IRC_MSG_MAX ];
212
216
213
- irc_init (s );
217
+ irc_init (IRC_MSG_MAX );
214
218
215
- while ((sl = read (conn , s , BUFF ))) {
219
+ while ((sl = read (conn , s , IRC_MSG_MAX ))) {
216
220
parser (sl , s );
217
- if (read (fd [0 ], u , BUFF ) > 0 ) {
221
+ if (read (fd [0 ], u , IRC_MSG_MAX ) > 0 ) {
218
222
for (i = 0 ; u [i ] != '\n' ; i ++ ) continue ;
219
223
if (u [0 ] != ':' ) raw (s , "%-*.*s\r\n" , i , i , u );
220
224
}
221
225
}
222
- printf ( "%*s<<press RETURN key to exit >>" , gutl + 2 , "" );
226
+ fprintf ( stderr , "%*s <<irc server connection closed >>" , gutl , "" );
223
227
}
224
228
else {
225
- char usrin [BUFF ], v1 [BUFF - 20 ], v2 [20 ], c1 ;
229
+ char usrin [IRC_MSG_MAX ], v1 [IRC_MSG_MAX - 20 ], v2 [20 ], c1 ;
226
230
227
231
while (waitpid (pid , NULL , WNOHANG ) == 0 ) {
228
232
while (!kbhit () && waitpid (pid , NULL , WNOHANG ) == 0 ) {
229
233
dprintf (fd [1 ], ":\n" );
230
234
}
231
235
232
- strcpy (usrin , input_handler (BUFF ));
236
+ strcpy (usrin , input_handler (IRC_MSG_MAX ));
233
237
234
238
if (sscanf (usrin , ":%[M] %s %[^\n]\n" , & c1 , v2 , v1 ) == 3 ||
235
239
sscanf (usrin , ":%[Qnjpm] %[^\n]\n" , & c1 , v1 ) == 2 ||
0 commit comments