-/*
- * Receiving side of the chat window. This is implemented in a
- * tiny hidden IFRAME that just does JavaScript writes to
- * other frames whenever it refreshes and finds new data.
- */
-void chat_recv(void) {
- int i;
- struct pollfd pf;
- int got_data = 0;
- int end_chat_now = 0;
- char buf[SIZ];
- char cl_user[SIZ];
- char cl_text[SIZ];
- char *output_data = NULL;
-
- output_headers(0, 0, 0, 0, 0, 0);
-
- wprintf("Content-type: text/html; charset=utf-8\n");
- wprintf("\n");
- wprintf("<html>\n"
- "<head>\n"
- "<meta http-equiv=\"refresh\" content=\"3\" />\n"
- "</head>\n"
-
- "<body bgcolor=\"#FFFFFF\">\n"
- );
-
- if (setup_chat_socket() != 0) {
- wprintf(_("An error occurred while setting up the chat socket."));
- wprintf("</BODY></HTML>\n");
- wDumpContent(0);
- return;
- }
-
- /*
- * See if there is any chat data waiting.
- */
- output_data = strdup("");
- do {
- got_data = 0;
- pf.fd = WC->chat_sock;
- pf.events = POLLIN;
- pf.revents = 0;
- if (poll(&pf, 1, 1) > 0) if (pf.revents & POLLIN) {
- ++got_data;
-
- /* Temporarily swap the serv and chat sockets during chat talk */
- i = WC->serv_sock;
- WC->serv_sock = WC->chat_sock;
- WC->chat_sock = i;
-
- serv_getln(buf, sizeof buf);
-
- if (!strcmp(buf, "000")) {
- strcpy(buf, ":|");
- strcat(buf, _("Now exiting chat mode."));
- end_chat_now = 1;
- }
-
- /* Unswap the sockets. */
- i = WC->serv_sock;
- WC->serv_sock = WC->chat_sock;
- WC->chat_sock = i;
-
- /* Append our output data */
- output_data = realloc(output_data, strlen(output_data) + strlen(buf) + 4);
- strcat(output_data, buf);
- strcat(output_data, "\n");
- }
-
- } while ( (got_data) && (!end_chat_now) );
-
- if (end_chat_now) {
- close(WC->chat_sock);
- WC->chat_sock = (-1);
- wprintf("<img src=\"static/blank.gif\" onLoad=\"parent.window.close();\">\n");
- }
-
- if (strlen(output_data) > 0) {
-
- if (output_data[strlen(output_data)-1] == '\n') {
- output_data[strlen(output_data)-1] = 0;
- }