cf0 #include #include #include #include #include #include #include "connap.h" #include "io.h" #include "message.h" #include "connect.h" #include "command.h" #include "chat.h" SOCKET srv_sock = INVALID_SOCKET; int srv_port; int srv_conn = 0; static char *redirect(char *meta_server, int meta_port) { int i, r; SOCKET meta_sock; char *tmp = (char*)malloc(4096); char c; /* sprintf(tmp, "Trying metaserver %s...", meta_server); err_msg(tmp); */ if (! conn_sock(meta_server, meta_port, &meta_sock)) { err_msg(ws_strerror()); goto error; } memset(tmp, 0, strlen(tmp)); i = 0; while (1) { while (((r = recv(meta_sock, &c, 1, 0)) == -1) && (WSAGetLastError() == WSAEWOULDBLOCK)); if (r <= 0) { if (r == -1) { closesocket(meta_sock); err_msg(ws_strerror()); goto error; } break; } if (c == '\n') break; tmp[i++] = c; } closesocket(meta_sock); return tmp; error: free(tmp); return NULL; } void do_connect(char *server, int port, int meta) { char login_msg[256]; int real_port; char *tmp, *srv_string; static int conn_in_progress = 0; if (srv_conn) return; if (conn_in_progress) { err_msg("Connect already in progress"); return; } conn_in_progress = 1; if (cur_server.name) free(cur_server.name); cur_server.name = new_string(server); cur_server.port = port; cur_server.meta = meta; if (real_srv_name) { free(real_srv_name); real_srv_name = (char*)NULL; } if (meta) { if (! (srv_string = redirect(server, port))) goto error; if ((! strlen(srv_string)) || (! strchr(srv_string, ':'))) { err_msg("Got invalid string from metaserver"); free(srv_string); goto error; } tmp = strtok(srv_string, ":"); real_srv_name = new_string(tmp); real_port = atoi(strtok(NULL, "\0")); free(srv_string); } else { real_srv_name = new_string(server); real_port = port; } /* tmp = (char*)malloc(sizeof("Connecting to ") + strlen(real_srv_name) + sizeof("...") + 1); sprintf(tmp, "Connecting to %s...", real_srv_name); err_msg(tmp); free(tmp); */ if (! conn_sock(real_srv_name, real_port, &srv_sock)) { err_msg(ws_strerror()); goto error; } if (! user_info.registered) { if (send_msg(MSG_CLIENT_REGISTER, user_info.user_name)) { disconnect(ws_strerror()); goto error; } } else { sprintf(login_msg, "%s %s %04d \"%s\" %d", user_info.user_name, user_info.password, user_info.data_port, client, user_info.link_type); if (send_msg(MSG_CLIENT_LOGIN, login_msg)) { disconnect(ws_strerror()); goto error; } } srv_conn = 1; error: conn_in_progress = 0; } void do_login_stuff(void) { /* notify_shared_files(); send_hotlist(); send_auto_commands(); */ } void disconnect(char *err) { if (strlen(err)) err_msg(err); part_all_channels(); /* clear_online_list(); */ closesocket(srv_sock); srv_conn = 0; srv_sock = INVALID_SOCKET; } . 0