Commit Diff


commit - ec34878030f89c79a18054c9f008a5f12cd53c2f
commit + 5b30aca674fcba8d97a4da8fabbc55413eb6220e
blob - 4a12ec5e428acf72ca569eae5b02f9c7dc53d634
blob + cb520b93e981d42e809768609ced4ec673ac9009
--- irc.c
+++ irc.c
@@ -51,6 +51,7 @@ char irc_ident[256];
 char irc_nick[256];
 char irc_channel[256];
 int in_irc_channel;
+int in_cap;
 
 /*
  * irc_recv() receives read(2) chunks and assembles complete lines, which are
@@ -91,6 +92,16 @@ irc_recv(const char *buf, unsigned len, int client_fd,
 }
 
 static void
+irc_complete_registration(int server_fd)
+{
+	if (icb_logged_in || *irc_nick == '\0' || *irc_ident == '\0')
+		return;
+	if (in_cap)
+		return;
+	icb_send_login(server_fd, irc_nick, irc_ident, irc_pass);
+}
+
+static void
 irc_cmd(char *cmd, int client_fd, int server_fd)
 {
 	char *argv[10], *p;
@@ -118,9 +129,7 @@ irc_cmd(char *cmd, int client_fd, int server_fd)
 		strlcpy(irc_pass, argv[1], sizeof(irc_pass));
 	} else if (!strcasecmp(argv[0], "USER")) {
 		strlcpy(irc_ident, argv[1], sizeof(irc_ident));
-		if (!icb_logged_in && irc_nick[0] && irc_ident[0])
-			icb_send_login(server_fd, irc_nick,
-			    irc_ident, irc_pass);
+		irc_complete_registration(server_fd);
 	} else if (!strcasecmp(argv[0], "NICK")) {
 		strlcpy(irc_nick, argv[1], sizeof(irc_nick));
 		if (icb_logged_in)
@@ -195,14 +204,17 @@ irc_cmd(char *cmd, int client_fd, int server_fd)
 		icbirc_quit();
 	} else if (!strcasecmp(argv[0], "CAP")) {
 		if (!strcasecmp(argv[1], "LS")) {
+			in_cap = 1;
 			printf("CAP * LS :\n");
 			fflush(stdout);
 		} else if (!strcasecmp(argv[1], "REQ")) {
+			in_cap = 1;
 			printf("CAP * NAK :%s\n", argv[2]);
 			fflush(stdout);
-		} else if (!strcasecmp(argv[1], "END"))
-			;
-		else
+		} else if (!strcasecmp(argv[1], "END")) {
+			in_cap = 0;
+			irc_complete_registration(server_fd);
+		} else
 			warnx("irc_cmd: unknown command 'CAP %s'", argv[1]);
 	} else
 		warnx("irc_cmd: unknown command '%s'", argv[0]);