16
16
#define CHA_MAX 200 /* gauranteed max channel length */
17
17
18
18
static int conn ; /* connection socket */
19
- static int verb = 0 ; /* verbose output (e.g. raw stream) */
20
- static int cmax = 80 ; /* max number of chars per line */
21
- static int gutl = 10 ; /* max char width of left column */
19
+ static size_t verb = 0 ; /* verbose output (e.g. raw stream) */
20
+ static size_t cmax = 80 ; /* max number of chars per line */
21
+ static size_t gutl = 10 ; /* max char width of left column */
22
22
static char * host = "irc.freenode.org" ; /* irc host address */
23
23
static char * chan = "kisslinux" ; /* channel */
24
24
static char * port = "6667" ; /* server port */
@@ -39,49 +39,30 @@ static int
39
39
kbhit (void ) {
40
40
41
41
int byteswaiting ;
42
- struct termios term ;
43
- tcgetattr (0 , & term );
44
42
fd_set fds ;
45
43
struct timespec ts = {0 };
46
- struct termios term2 = term ;
47
44
48
- term2 .c_lflag &= ~ICANON ;
49
- tcsetattr (0 , TCSANOW , & term2 );
50
45
FD_ZERO (& fds );
51
46
FD_SET (0 , & fds );
52
47
byteswaiting = pselect (1 , & fds , NULL , NULL , & ts , NULL );
53
- tcsetattr (0 , TCSANOW , & term );
54
48
55
49
return byteswaiting > 0 ;
56
50
}
57
51
58
- static void
59
- input_handler (char * usrin , int len ) {
60
-
61
- struct termios tp , save ;
62
-
63
- tcgetattr (STDIN_FILENO , & tp );
64
- save = tp ;
65
- tp .c_cc [VERASE ] = 127 ;
66
- tcsetattr (STDIN_FILENO , TCSANOW , & tp );
67
- fgets (usrin , len , stdin );
68
- tcsetattr (STDIN_FILENO , TCSANOW , & save );
69
- }
70
-
71
52
static void
72
53
raw (char * fmt , ...) {
73
54
74
55
va_list ap ;
75
- char * cmd_str = malloc (sizeof ( char ) * ( MSG_MAX + 1 ) );
56
+ char * cmd_str = malloc (MSG_MAX );
76
57
77
58
va_start (ap , fmt );
78
59
vsnprintf (cmd_str , MSG_MAX , fmt , ap );
79
60
va_end (ap );
80
61
81
62
if (verb ) printf ("<< %s" , cmd_str );
82
63
if (olog ) printa (cmd_str );
64
+ if (write (conn , cmd_str , strlen (cmd_str )) < 0 ) exit (1 );
83
65
84
- write (conn , cmd_str , strlen (cmd_str ));
85
66
free (cmd_str );
86
67
}
87
68
@@ -110,11 +91,11 @@ static void
110
91
printw (const char * format , ...) {
111
92
112
93
va_list argptr ;
113
- char * tok , line [MSG_MAX + 1 ];
114
- int i , wordwidth , spaceleft , spacewidth = 1 ;
94
+ char * tok , line [MSG_MAX ];
95
+ size_t i , wordwidth , spaceleft , spacewidth = 1 ;
115
96
116
97
va_start (argptr , format );
117
- vsnprintf (line , MSG_MAX + 1 , format , argptr );
98
+ vsnprintf (line , MSG_MAX , format , argptr );
118
99
va_end (argptr );
119
100
120
101
if (olog ) printa (line );
@@ -126,7 +107,7 @@ printw(const char *format, ...) {
126
107
for (tok = strtok (& line [i ], " " ); tok != NULL ; tok = strtok (NULL , " " )) {
127
108
wordwidth = strlen (tok );
128
109
if ((wordwidth + spacewidth ) > spaceleft ) {
129
- printf ("\n%*.s%s" , gutl + 2 , "" , tok );
110
+ printf ("\n%*.s%s" , ( int ) gutl + 2 , "" , tok );
130
111
spaceleft = cmax - (gutl + 2 + wordwidth );
131
112
} else {
132
113
printf (" %s" , tok );
@@ -136,10 +117,7 @@ printw(const char *format, ...) {
136
117
}
137
118
138
119
static void
139
- parser (char * in ) {
140
-
141
- int len = 0 ;
142
-
120
+ raw_parser (char * in ) {
143
121
if (verb ) printf (">> %s\n" , in );
144
122
if (!strncmp (in , "PING" , 4 )) {
145
123
in [1 ] = 'O' ;
@@ -156,11 +134,11 @@ parser(char *in) {
156
134
} else if (!strncmp (command , "JOIN" , 4 )) {
157
135
printw ("%*s \x1b[32;1m%s\x1b[0m\n" , gutl , "-->" , nickname );
158
136
} else if (!strncmp (command , "PRIVMSG" , 7 ) && !strncmp (channel , nick , strlen (nick ))) {
159
- while ( nickname [ len ] != '\0' ) len ++ ;
137
+ size_t len = strlen ( nickname ) ;
160
138
printw ("%*s\x1b[43;1m%-.*s\x1b[0m %s\n" , \
161
139
gutl - (len <= gutl ? len : gutl ), "" , gutl , nickname , message );
162
140
} else {
163
- while ( nickname [ len ] != '\0' ) len ++ ;
141
+ size_t len = strlen ( nickname ) ;
164
142
printw ("%*s\x1b[33;1m%-.*s\x1b[0m %s\n" , \
165
143
gutl - (len <= gutl ? len : gutl ), "" , gutl , nickname , message );
166
144
}
@@ -174,7 +152,7 @@ main(int argc, char **argv) {
174
152
175
153
while ((cval = getopt (argc , argv , "s:p:o:n:k:c:u:r:w:W:vV" )) != -1 ) {
176
154
switch (cval ) {
177
- case 'v' : puts ("kirc-0.0.6 " ); return 0 ;
155
+ case 'v' : puts ("kirc-0.0.7 " ); return 0 ;
178
156
case 'V' : verb = 1 ; break ;
179
157
case 's' : host = optarg ; break ;
180
158
case 'w' : gutl = atoi (optarg ); break ;
@@ -213,41 +191,46 @@ main(int argc, char **argv) {
213
191
214
192
if ((o > 0 && b [o - 1 ] == '\r' && b [o ] == '\n' ) || o == MSG_MAX ) {
215
193
b [o + 1 ] = '\0' ;
216
- parser (b );
194
+ raw_parser (b );
217
195
o = 0 ;
218
196
} else if (sl > 0 ) o ++ ;
219
197
220
198
if (read (fd [0 ], u , MSG_MAX ) > 0 ) {
221
199
for (i = 0 ; u [i ] != '\n' ; i ++ ) continue ;
222
- if (u [0 ] != ': ' ) raw ("%-*.*s\r\n" , i , i , u );
200
+ if (u [0 ] != '/ ' ) raw ("%-*.*s\r\n" , i , i , u );
223
201
}
224
202
}
225
203
}
226
204
else {
227
205
char usrin [MSG_MAX ], v1 [MSG_MAX - CHA_MAX ], v2 [CHA_MAX ], c1 ;
206
+ struct termios tp , save ;
207
+ tcgetattr (STDIN_FILENO , & tp );
208
+ save = tp ;
209
+ tp .c_cc [VERASE ] = 127 ;
228
210
229
211
while (waitpid (pid , NULL , WNOHANG ) == 0 ) {
230
- if (!kbhit ()) dprintf (fd [1 ], ": \n" );
212
+ if (!kbhit ()) dprintf (fd [1 ], "/ \n" );
231
213
else {
232
- input_handler (usrin , MSG_MAX );
214
+ tcsetattr (STDIN_FILENO , TCSANOW , & tp );
215
+ if (fgets (usrin , MSG_MAX , stdin ) == NULL ) return 1 ;
216
+ tcsetattr (STDIN_FILENO , TCSANOW , & save );
233
217
234
- if (sscanf (usrin , ":%[M ] %s %[^\n]\n" , & c1 , v2 , v1 ) == 3 ||
235
- sscanf (usrin , ":%[Qnjpm ] %[^\n]\n" , & c1 , v1 ) == 2 ||
236
- sscanf (usrin , ": %[q]\n" , & c1 ) == 1 ) {
218
+ if (sscanf (usrin , "/%[m ] %s %[^\n]\n" , & c1 , v2 , v1 ) == 3 ||
219
+ sscanf (usrin , "/%[Qnjp ] %[^\n]\n" , & c1 , v1 ) == 2 ||
220
+ sscanf (usrin , "/ %[q]\n" , & c1 ) == 1 ) {
237
221
switch (c1 ) {
238
222
case 'q' : dprintf (fd [1 ], "quit\n" ); break ;
239
223
case 'Q' : dprintf (fd [1 ], "quit %s\n" , v1 ); break ;
240
224
case 'j' : dprintf (fd [1 ], "join %s\n" , v1 ); break ;
241
225
case 'p' : dprintf (fd [1 ], "part %s\n" , v1 ); break ;
242
- case 'm' : dprintf (fd [1 ], "privmsg #%s :%s\n" , chan , v1 ); break ;
243
226
case 'n' : dprintf (fd [1 ], "privmsg nickserv :%s\n" , v1 ); break ;
244
- case 'M ' : dprintf (fd [1 ], "privmsg %s :%s\n" , v2 , v1 ); break ;
227
+ case 'm ' : dprintf (fd [1 ], "privmsg %s :%s\n" , v2 , v1 ); break ;
245
228
}
246
- } else dprintf (fd [1 ], "%s " , usrin );
229
+ } else dprintf (fd [1 ], "privmsg #%s :%s " , chan , usrin );
247
230
}
248
231
}
249
232
250
- fprintf (stderr , "%*s << irc server connection closed>>\n" , gutl , " " );
233
+ fprintf (stderr , "<< irc server connection closed\n " );
251
234
}
252
235
return 0 ;
253
236
}
0 commit comments