15
15
16
16
#define MSG_MAX 512 /* guaranteed max message length */
17
17
#define CHA_MAX 200 /* guaranteed max channel length */
18
- #define VERSION "0.1.1" /* software version */
19
- #define USAGE "kirc [-s hostname] [-p port] [-c channel] [-n nick] \
20
- [-r real_name] [-u username] [-k password] [-a token] [-x init_command] \
21
- [-w columns] [-W columns] [-o path] [-h|v|V]"
22
18
23
19
static int conn ; /* connection socket */
24
20
static char chan_default [MSG_MAX ]; /* default channel for PRIVMSG */
25
21
static int verb = 0 ; /* verbose output (e.g. raw stream) */
22
+ static int sasl = 0 ; /* SASL method (PLAIN=0, EXTERNAL=1) */
26
23
static size_t cmax = 80 ; /* max number of chars per line */
27
24
static size_t gutl = 20 ; /* max char width of left column */
28
25
static char * host = "irc.freenode.org" ; /* irc host address */
@@ -148,11 +145,6 @@ raw_parser(char *string) {
148
145
return ;
149
146
}
150
147
151
- if (!strncmp (string , "AUTHENTICATE +" , 14 )) {
152
- raw ("AUTHENTICATE %s\r\n" , auth );
153
- return ;
154
- }
155
-
156
148
if (string [0 ] != ':' ) return ;
157
149
158
150
if (olog ) log_append (string , olog );
@@ -168,8 +160,6 @@ raw_parser(char *string) {
168
160
strcpy (chan_default , tok );
169
161
raw ("JOIN #%s\r\n" , tok );
170
162
} return ;
171
- } else if (!strncmp (command , "90" , 2 )) {
172
- raw ("CAP END\r\n" );
173
163
} else if (!strncmp (command , "QUIT" , 4 ) || !strncmp (command , "PART" , 4 )) {
174
164
printf ("%*s<-- \x1b[34;1m%s\x1b[0m\n" , g - 3 , "" , nickname );
175
165
return ;
@@ -275,45 +265,55 @@ keyboard_hit() {
275
265
return byteswaiting ;
276
266
}
277
267
268
+ static void
269
+ usage (void ) {
270
+ fputs ("kirc [-s hostname] [-p port] [-c channel] [-n nick] \
271
+ [-r real_name] [-u username] [-k password] [-a token] [-x init_command] \
272
+ [-w columns] [-W columns] [-o path] [-e|v|V]\n" , stderr );
273
+ exit (EXIT_FAILURE );
274
+ }
275
+
278
276
int
279
277
main (int argc , char * * argv ) {
280
278
281
279
int cval ;
282
280
283
- while ((cval = getopt (argc , argv , "s:p:o:n:k:c:u:r:x:w:W:a:hvV " )) != -1 ) {
281
+ while ((cval = getopt (argc , argv , "s:p:o:n:k:c:u:r:x:w:W:a:hevV " )) != -1 ) {
284
282
switch (cval ) {
285
- case 'V' : verb = 1 ; break ;
286
- case 's ' : host = optarg ; break ;
287
- case 'p ' : port = optarg ; break ;
288
- case 'r ' : real = optarg ; break ;
289
- case 'u ' : user = optarg ; break ;
290
- case 'a ' : auth = optarg ; break ;
291
- case 'o ' : olog = optarg ; break ;
292
- case 'n ' : nick = optarg ; break ;
293
- case 'k ' : pass = optarg ; break ;
294
- case 'c ' : chan = optarg ; break ;
295
- case 'x ' : inic = optarg ; break ;
296
- case 'w ' : gutl = atoi ( optarg ); break ;
297
- case 'W ' : cmax = atoi (optarg ); break ;
298
- case 'v ' : printf ( "kirc %s\n" , VERSION ); return EXIT_SUCCESS ;
299
- case 'h ' : printf ( "usage: %s \n", USAGE ); return EXIT_SUCCESS ;
300
- case '?' : return EXIT_FAILURE ;
283
+ case 'V' : ++ verb ; break ;
284
+ case 'e ' : ++ sasl ; break ;
285
+ case 's ' : host = optarg ; break ;
286
+ case 'p ' : port = optarg ; break ;
287
+ case 'r ' : real = optarg ; break ;
288
+ case 'u ' : user = optarg ; break ;
289
+ case 'a ' : auth = optarg ; break ;
290
+ case 'o ' : olog = optarg ; break ;
291
+ case 'n ' : nick = optarg ; break ;
292
+ case 'k ' : pass = optarg ; break ;
293
+ case 'c ' : chan = optarg ; break ;
294
+ case 'x ' : inic = optarg ; break ;
295
+ case 'w ' : gutl = atoi (optarg ); break ;
296
+ case 'W ' : cmax = atoi ( optarg ); break ;
297
+ case 'v ' : puts ( "kirc 0.1.2 \n" ); break ;
298
+ case '?' : usage (); break ;
301
299
}
302
300
}
303
301
304
302
if (!nick ) {
305
303
fputs ("Nick not specified\n" , stderr );
306
- return EXIT_FAILURE ;
304
+ usage () ;
307
305
}
308
306
309
307
if (connection_initialize () != 0 ) {
310
308
return EXIT_FAILURE ;
311
309
}
312
310
313
- if (auth ) raw ("CAP REQ :sasl\r\n" );
311
+ if (auth || sasl ) raw ("CAP REQ :sasl\r\n" );
314
312
raw ("NICK %s\r\n" , nick );
315
313
raw ("USER %s - - :%s\r\n" , (user ? user : nick ), (real ? real : nick ));
316
- if (auth ) raw ("AUTHENTICATE PLAIN\r\n" );
314
+ if (auth || sasl ) raw ("AUTHENTICATE %s\r\n" , (sasl ? "EXTERNAL" : "PLAIN" ));
315
+ if (auth || sasl ) raw ("AUTHENTICATE %s\r\n" , (sasl ? "+" : auth ));
316
+ if (auth || sasl ) raw ("CAP END\r\n" );
317
317
if (pass ) raw ("PASS %s\r\n" , pass );
318
318
if (inic ) raw ("%s\r\n" , inic );
319
319
0 commit comments