@@ -582,7 +582,7 @@ static inline void state_reset(state l)
582
582
history_add ("" );
583
583
}
584
584
585
- static char * ctime_now (char buf [ 26 ] )
585
+ static char * ctime_now (char * buf )
586
586
{
587
587
struct tm tm_ ;
588
588
time_t now = time (NULL );
@@ -737,17 +737,13 @@ static short parse_dcc_send_message(const char *message, char *filename, unsigne
737
737
{
738
738
/* TODO: Fix horrible hacks */
739
739
740
- char ipv6 = 0 ;
741
-
742
740
if (sscanf (message , "SEND \"%" STR (FNM_MAX ) "[^\"]\" %41s %hu %zu" , filename , ipv6_addr , port , file_size ) == 4 ) {
743
- ipv6 = !!(ipv6_addr [15 ]);
744
- if (ipv6 == 1 ) {
741
+ if (ipv6_addr [15 ]) {
745
742
return 1 ;
746
743
}
747
744
}
748
745
if (sscanf (message , "SEND %" STR (FNM_MAX ) "s %41s %hu %zu" , filename , ipv6_addr , port , file_size ) == 4 ) {
749
- ipv6 = !!(ipv6_addr [15 ]);
750
- if (ipv6 == 1 ) {
746
+ if (ipv6_addr [15 ]) {
751
747
return 1 ;
752
748
}
753
749
}
@@ -773,15 +769,15 @@ static short parse_dcc_accept_message(const char *message, char *filename, unsig
773
769
return 1 ;
774
770
}
775
771
776
- static void open_socket (int slot , int * file_fd )
772
+ static void open_socket (int slot , int file_fd )
777
773
{
778
774
int sock_fd ;
779
775
if (!ipv6 ) {
780
776
sock_fd = socket (AF_INET , SOCK_STREAM , 0 );
781
777
struct sockaddr_in sockaddr = dcc_sessions .slots [slot ].sin ;
782
778
if (connect (sock_fd , (const struct sockaddr * )& sockaddr , sizeof (sockaddr )) < 0 ) {
783
779
close (sock_fd );
784
- close (* file_fd );
780
+ close (file_fd );
785
781
perror ("connect" );
786
782
return ;
787
783
}
@@ -791,20 +787,20 @@ static void open_socket(int slot, int *file_fd)
791
787
struct sockaddr_in6 sockaddr = dcc_sessions .slots [slot ].sin6 ;
792
788
if (connect (sock_fd , (const struct sockaddr * )& sockaddr , sizeof (sockaddr )) < 0 ) {
793
789
close (sock_fd );
794
- close (* file_fd );
790
+ close (file_fd );
795
791
perror ("connect" );
796
792
return ;
797
793
}
798
794
}
799
795
if (sock_fd < 0 ) {
800
- close (* file_fd );
796
+ close (file_fd );
801
797
perror ("socket" );
802
798
return ;
803
799
}
804
800
int flags = fcntl (sock_fd , F_GETFL , 0 ) | O_NONBLOCK ;
805
801
if (flags < 0 || fcntl (sock_fd , F_SETFL , flags ) < 0 ) {
806
802
close (sock_fd );
807
- close (* file_fd );
803
+ close (file_fd );
808
804
perror ("fcntl" );
809
805
return ;
810
806
}
@@ -819,7 +815,9 @@ static void handle_dcc(param p)
819
815
size_t file_size = 0 ;
820
816
unsigned int ip_addr = 0 ;
821
817
unsigned short port = 0 ;
822
- char ipv6_addr [42 ];
818
+ char ipv6_addr [INET6_ADDRSTRLEN ];
819
+
820
+ memset (ipv6_addr , 0 , sizeof (ipv6_addr ));
823
821
824
822
int slot = -1 ;
825
823
int file_fd ;
@@ -876,6 +874,7 @@ static void handle_dcc(param p)
876
874
.file_size = file_size ,
877
875
.file_fd = file_fd ,
878
876
};
877
+
879
878
strcpy (dcc_sessions .slots [slot ].filename , filename );
880
879
if (!ipv6 ) {
881
880
dcc_sessions .slots [slot ].sin = (struct sockaddr_in ){
@@ -885,6 +884,7 @@ static void handle_dcc(param p)
885
884
};
886
885
goto check_resume ;
887
886
}
887
+
888
888
struct in6_addr result ;
889
889
if (inet_pton (AF_INET6 , ipv6_addr , & result ) != 1 ){
890
890
close (file_fd );
@@ -901,9 +901,10 @@ static void handle_dcc(param p)
901
901
p -> nickname , filename , port , bytes_read );
902
902
return ;
903
903
}
904
- open_socket (slot , & file_fd );
904
+ open_socket (slot , file_fd );
905
905
return ;
906
906
}
907
+
907
908
if (!strncmp (message , "ACCEPT" , 6 )) {
908
909
if (parse_dcc_accept_message (message , filename , & port , & file_size )) {
909
910
return ;
@@ -916,7 +917,7 @@ static void handle_dcc(param p)
916
917
}
917
918
918
919
file_fd = dcc_sessions .slots [slot ].file_fd ;
919
- open_socket (slot , & file_fd );
920
+ open_socket (slot , file_fd );
920
921
return ;
921
922
}
922
923
}
@@ -931,7 +932,7 @@ static void handle_ctcp(param p)
931
932
raw ("NOTICE %s :\001VERSION kirc " VERSION "\001\r\n" , p -> nickname );
932
933
return ;
933
934
}
934
- if (!strncmp (message , "TIME" , 7 )) {
935
+ if (!strncmp (message , "TIME" , 4 )) {
935
936
char buf [26 ];
936
937
if (!ctime_now (buf )) {
937
938
raw ("NOTICE %s :\001TIME %s\001\r\n" , p -> nickname , buf );
@@ -983,6 +984,7 @@ static void param_print_private(param p)
983
984
if (p -> channel != NULL && (strcmp (p -> channel , nick ) == 0 )) {
984
985
handle_ctcp (p );
985
986
printf ("%*s\x1b[33;1m%-.*s [PRIVMSG]\x1b[36m " , s , "" , p -> nicklen , p -> nickname );
987
+ p -> offset += sizeof (" [PRIVMSG]" );
986
988
} else if (p -> channel != NULL && strcmp (p -> channel + 1 , chan )) {
987
989
printf ("%*s\x1b[33;1m%-.*s\x1b[0m" , s , "" , p -> nicklen , p -> nickname );
988
990
printf (" [\x1b[33m%s\x1b[0m] " , p -> channel );
@@ -1132,6 +1134,7 @@ static void join_command(state l)
1132
1134
raw ("join #%s\r\n" , chan );
1133
1135
printf ("\x1b[35m%s\x1b[0m\r\n" , l -> buf );
1134
1136
printf ("\x1b[35mJoined #%s!\x1b[0m\r\n" , chan );
1137
+ l -> nick_privmsg = 0 ;
1135
1138
}
1136
1139
1137
1140
static void part_command (state l )
@@ -1178,16 +1181,29 @@ static void msg_command(state l)
1178
1181
1179
1182
static void action_command (state l )
1180
1183
{
1181
- char * tok ;
1182
- strtok_r (l -> buf + 7 , " " , & tok );
1183
1184
int offset = 0 ;
1184
1185
while (* (l -> buf + 7 + offset ) == ' ' ) {
1185
1186
offset ++ ;
1186
1187
}
1188
+
1187
1189
raw ("privmsg #%s :\001ACTION %s\001\r\n" , chan , l -> buf + 7 + offset );
1188
1190
printf ("\x1b[35mprivmsg #%s :ACTION %s\x1b[0m\r\n" , chan , l -> buf + 7 + offset );
1189
1191
}
1190
1192
1193
+ static void set_privmsg_command (state l )
1194
+ {
1195
+ int offset = 0 ;
1196
+ while (* (l -> buf + 11 + offset ) == ' ' ) {
1197
+ offset ++ ;
1198
+ }
1199
+
1200
+ strcpy (chan , l -> buf + 11 + offset );
1201
+
1202
+ printf ("\x1b[35mNew privmsg target: %s\x1b[0m\r\n" , l -> buf + 11 + offset );
1203
+ l -> nick_privmsg = 1 ;
1204
+ }
1205
+
1206
+
1191
1207
static void nick_command (state l )
1192
1208
{
1193
1209
char * tok ;
@@ -1238,8 +1254,14 @@ static void handle_user_input(state l)
1238
1254
action_command (l );
1239
1255
return ;
1240
1256
}
1257
+ if (!strncmp (l -> buf + 1 , "SETPRIVMSG" , 10 ) || !strncmp (l -> buf + 1 , "setprivmsg" , 10 )) {
1258
+ set_privmsg_command (l );
1259
+ return ;
1260
+ }
1261
+
1241
1262
if (l -> buf [1 ] == '#' ) {
1242
1263
strcpy (chan , l -> buf + 2 );
1264
+ l -> nick_privmsg = 0 ;
1243
1265
printf ("\x1b[35mnew channel: #%s\x1b[0m\r\n" , chan );
1244
1266
return ;
1245
1267
}
@@ -1257,8 +1279,14 @@ static void handle_user_input(state l)
1257
1279
printf ("\x1b[35mprivmsg %s :ACTION %s\x1b[0m\r\n" , l -> buf + 2 , tok );
1258
1280
return ;
1259
1281
default : /* send private message to default channel */
1260
- raw ("privmsg #%s :%s\r\n" , chan , l -> buf );
1261
- printf ("\x1b[35mprivmsg #%s :%s\x1b[0m\r\n" , chan , l -> buf );
1282
+ if (l -> nick_privmsg == 0 ) {
1283
+ raw ("privmsg #%s :%s\r\n" , chan , l -> buf );
1284
+ printf ("\x1b[35mprivmsg #%s :%s\x1b[0m\r\n" , chan , l -> buf );
1285
+ }
1286
+ else {
1287
+ raw ("privmsg %s :%s\r\n" , chan , l -> buf );
1288
+ printf ("\x1b[35mprivmsg %s :%s\x1b[0m\r\n" , chan , l -> buf );
1289
+ }
1262
1290
return ;
1263
1291
}
1264
1292
}
@@ -1434,6 +1462,7 @@ int main(int argc, char **argv)
1434
1462
dcc_sessions .sock_fds [CON_MAX ] = (struct pollfd ){.fd = ttyinfd ,.events = POLLIN };
1435
1463
dcc_sessions .sock_fds [CON_MAX + 1 ] = (struct pollfd ){.fd = conn ,.events = POLLIN };
1436
1464
state_t l ;
1465
+ memset (& l , 0 , sizeof (l ));
1437
1466
l .buflen = MSG_MAX ;
1438
1467
state_reset (& l );
1439
1468
int rc , editReturnFlag = 0 ;
0 commit comments