Mercurial > pidgin
comparison src/toc.c @ 1840:00aef397a1fe
[gaim-migrate @ 1850]
reworked some of the proxy stuff so that it's non-blocking now. next thing to do is to get IRC, MSN, Napster, and Jabber to use the new proxy_connect code. After that, Oscar and Yahoo (maybe Zephyr too? not likely)
committer: Tailor Script <tailor@pidgin.im>
author | Eric Warmenhoven <eric@warmenhoven.org> |
---|---|
date | Sat, 12 May 2001 01:38:04 +0000 |
parents | bb115612a2ed |
children | 1d137dde946f |
comparison
equal
deleted
inserted
replaced
1839:109cacf1ff97 | 1840:00aef397a1fe |
---|---|
113 }; | 113 }; |
114 | 114 |
115 /* constants to identify proto_opts */ | 115 /* constants to identify proto_opts */ |
116 #define USEROPT_AUTH 0 | 116 #define USEROPT_AUTH 0 |
117 #define USEROPT_AUTHPORT 1 | 117 #define USEROPT_AUTHPORT 1 |
118 #define USEROPT_SOCKSHOST 2 | 118 #define USEROPT_PROXYHOST 2 |
119 #define USEROPT_SOCKSPORT 3 | 119 #define USEROPT_PROXYPORT 3 |
120 #define USEROPT_PROXYTYPE 4 | 120 #define USEROPT_PROXYTYPE 4 |
121 | 121 |
122 static GtkWidget *join_chat_spin = NULL; | 122 static GtkWidget *join_chat_spin = NULL; |
123 static GtkWidget *join_chat_entry = NULL; | 123 static GtkWidget *join_chat_entry = NULL; |
124 | 124 |
125 static void toc_login_callback(gpointer, gint, GdkInputCondition); | |
125 static void toc_callback(gpointer, gint, GdkInputCondition); | 126 static void toc_callback(gpointer, gint, GdkInputCondition); |
126 static unsigned char *roast_password(char *); | 127 static unsigned char *roast_password(char *); |
127 static void accept_file_dialog(struct ft_request *); | 128 static void accept_file_dialog(struct ft_request *); |
128 | 129 |
129 /* ok. this function used to take username/password, and return 0 on success. | 130 /* ok. this function used to take username/password, and return 0 on success. |
138 gc = new_gaim_conn(user); | 139 gc = new_gaim_conn(user); |
139 gc->proto_data = tdt = g_new0(struct toc_data, 1); | 140 gc->proto_data = tdt = g_new0(struct toc_data, 1); |
140 | 141 |
141 g_snprintf(buf, sizeof buf, "Looking up %s", | 142 g_snprintf(buf, sizeof buf, "Looking up %s", |
142 user->proto_opt[USEROPT_AUTH][0] ? user->proto_opt[USEROPT_AUTH] : TOC_HOST); | 143 user->proto_opt[USEROPT_AUTH][0] ? user->proto_opt[USEROPT_AUTH] : TOC_HOST); |
143 /* this is such a hack */ | |
144 set_login_progress(gc, 1, buf); | 144 set_login_progress(gc, 1, buf); |
145 while (gtk_events_pending()) | 145 |
146 gtk_main_iteration(); | 146 debug_printf("* Client connects to TOC\n"); |
147 if (!g_slist_find(connections, gc)) | |
148 return; | |
149 | |
150 tdt->toc_fd = | 147 tdt->toc_fd = |
151 proxy_connect(user->proto_opt[USEROPT_AUTH][0] ? user->proto_opt[USEROPT_AUTH] : TOC_HOST, | 148 proxy_connect(user->proto_opt[USEROPT_AUTH][0] ? user->proto_opt[USEROPT_AUTH] : TOC_HOST, |
152 user->proto_opt[USEROPT_AUTHPORT][0] ? atoi(user-> | 149 user->proto_opt[USEROPT_AUTHPORT][0] ? |
153 proto_opt[USEROPT_AUTHPORT]) : | 150 atoi(user->proto_opt[USEROPT_AUTHPORT]) : TOC_PORT, |
154 TOC_PORT, user->proto_opt[USEROPT_SOCKSHOST], | 151 user->proto_opt[USEROPT_PROXYHOST], |
155 atoi(user->proto_opt[USEROPT_SOCKSPORT]), | 152 atoi(user->proto_opt[USEROPT_PROXYPORT]), |
156 atoi(user->proto_opt[USEROPT_PROXYTYPE])); | 153 atoi(user->proto_opt[USEROPT_PROXYTYPE]), |
157 | 154 toc_login_callback, gc); |
158 debug_printf("* Client connects to TOC\n"); | 155 |
159 if (tdt->toc_fd < 0) { | 156 if (tdt->toc_fd < 0) { |
160 g_snprintf(buf, sizeof(buf), "Connect to %s failed", user->proto_opt[USEROPT_AUTH]); | 157 g_snprintf(buf, sizeof(buf), "Connect to %s failed", user->proto_opt[USEROPT_AUTH]); |
161 hide_login_progress(gc, buf); | 158 hide_login_progress(gc, buf); |
162 signoff(gc); | 159 signoff(gc); |
163 return; | 160 return; |
164 } | 161 } |
162 } | |
163 | |
164 static void toc_login_callback(gpointer data, gint source, GdkInputCondition cond) | |
165 { | |
166 struct gaim_connection *gc = data; | |
167 struct toc_data *tdt = gc->proto_data; | |
168 char buf[80]; | |
169 | |
170 if (source == -1) { | |
171 /* we didn't successfully connect. tdt->toc_fd is valid here */ | |
172 hide_login_progress(gc, "Unable to connect."); | |
173 signoff(gc); | |
174 return; | |
175 } | |
176 | |
177 if (tdt->toc_fd == 0) | |
178 tdt->toc_fd = source; | |
165 | 179 |
166 debug_printf("* Client sends \"FLAPON\\r\\n\\r\\n\"\n"); | 180 debug_printf("* Client sends \"FLAPON\\r\\n\\r\\n\"\n"); |
167 if (write(tdt->toc_fd, FLAPON, strlen(FLAPON)) < 0) { | 181 if (write(tdt->toc_fd, FLAPON, strlen(FLAPON)) < 0) { |
168 hide_login_progress(gc, "Disconnected."); | 182 hide_login_progress(gc, "Disconnected."); |
169 signoff(gc); | 183 signoff(gc); |
276 strcpy(rp, "0x"); | 290 strcpy(rp, "0x"); |
277 for (x = 0; (x < 150) && pass[x]; x++) | 291 for (x = 0; (x < 150) && pass[x]; x++) |
278 pos += sprintf(&rp[pos], "%02x", pass[x] ^ roast[x % strlen(roast)]); | 292 pos += sprintf(&rp[pos], "%02x", pass[x] ^ roast[x % strlen(roast)]); |
279 rp[pos] = '\0'; | 293 rp[pos] = '\0'; |
280 return rp; | 294 return rp; |
295 } | |
296 | |
297 static void toc_got_info(gpointer data, char *url_text) | |
298 { | |
299 if (!url_text) | |
300 return; | |
301 | |
302 g_show_info_text(url_text); | |
281 } | 303 } |
282 | 304 |
283 static void toc_callback(gpointer data, gint source, GdkInputCondition condition) | 305 static void toc_callback(gpointer data, gint source, GdkInputCondition condition) |
284 { | 306 { |
285 struct gaim_connection *gc = (struct gaim_connection *)data; | 307 struct gaim_connection *gc = (struct gaim_connection *)data; |
555 char *name, *url, tmp[256]; | 577 char *name, *url, tmp[256]; |
556 | 578 |
557 name = strtok(NULL, ":"); | 579 name = strtok(NULL, ":"); |
558 url = strtok(NULL, ":"); | 580 url = strtok(NULL, ":"); |
559 | 581 |
560 g_snprintf(tmp, sizeof(tmp), "http://%s:%d/%s", TOC_HOST, TOC_PORT, url); | 582 g_snprintf(tmp, sizeof(tmp), "http://%s:%d/%s", |
561 g_show_info(gc->user, tmp); | 583 gc->user->proto_opt[USEROPT_AUTH][0] ? |
584 gc->user->proto_opt[USEROPT_AUTH] : TOC_HOST, | |
585 gc->user->proto_opt[USEROPT_AUTHPORT][0] ? | |
586 atoi(gc->user->proto_opt[USEROPT_AUTHPORT]) : TOC_PORT, | |
587 url); | |
588 grab_url(gc->user, tmp, toc_got_info, NULL); | |
562 } else if (!strcasecmp(c, "DIR_STATUS")) { | 589 } else if (!strcasecmp(c, "DIR_STATUS")) { |
563 } else if (!strcasecmp(c, "ADMIN_NICK_STATUS")) { | 590 } else if (!strcasecmp(c, "ADMIN_NICK_STATUS")) { |
564 } else if (!strcasecmp(c, "ADMIN_PASSWD_STATUS")) { | 591 } else if (!strcasecmp(c, "ADMIN_PASSWD_STATUS")) { |
565 do_error_dialog(_("Password Change Successeful"), _("Gaim - Password Change")); | 592 do_error_dialog(_("Password Change Successeful"), _("Gaim - Password Change")); |
566 } else if (!strcasecmp(c, "PAUSE")) { | 593 } else if (!strcasecmp(c, "PAUSE")) { |
991 g_snprintf(user->proto_opt[USEROPT_AUTH], | 1018 g_snprintf(user->proto_opt[USEROPT_AUTH], |
992 sizeof(user->proto_opt[USEROPT_AUTH]), "%s", gtk_entry_get_text(entry)); | 1019 sizeof(user->proto_opt[USEROPT_AUTH]), "%s", gtk_entry_get_text(entry)); |
993 } else if (entrynum == USEROPT_AUTHPORT) { | 1020 } else if (entrynum == USEROPT_AUTHPORT) { |
994 g_snprintf(user->proto_opt[USEROPT_AUTHPORT], | 1021 g_snprintf(user->proto_opt[USEROPT_AUTHPORT], |
995 sizeof(user->proto_opt[USEROPT_AUTHPORT]), "%s", gtk_entry_get_text(entry)); | 1022 sizeof(user->proto_opt[USEROPT_AUTHPORT]), "%s", gtk_entry_get_text(entry)); |
996 } else if (entrynum == USEROPT_SOCKSHOST) { | 1023 } else if (entrynum == USEROPT_PROXYHOST) { |
997 g_snprintf(user->proto_opt[USEROPT_SOCKSHOST], | 1024 g_snprintf(user->proto_opt[USEROPT_PROXYHOST], |
998 sizeof(user->proto_opt[USEROPT_SOCKSHOST]), "%s", gtk_entry_get_text(entry)); | 1025 sizeof(user->proto_opt[USEROPT_PROXYHOST]), "%s", gtk_entry_get_text(entry)); |
999 } else if (entrynum == USEROPT_SOCKSPORT) { | 1026 } else if (entrynum == USEROPT_PROXYPORT) { |
1000 g_snprintf(user->proto_opt[USEROPT_SOCKSPORT], | 1027 g_snprintf(user->proto_opt[USEROPT_PROXYPORT], |
1001 sizeof(user->proto_opt[USEROPT_SOCKSPORT]), "%s", gtk_entry_get_text(entry)); | 1028 sizeof(user->proto_opt[USEROPT_PROXYPORT]), "%s", gtk_entry_get_text(entry)); |
1002 } | 1029 } |
1003 } | 1030 } |
1004 | 1031 |
1005 static void toc_print_optionrad(GtkRadioButton * entry, struct aim_user *user) | 1032 static void toc_print_optionrad(GtkRadioButton * entry, struct aim_user *user) |
1006 { | 1033 { |
1076 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | 1103 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
1077 gtk_widget_show(label); | 1104 gtk_widget_show(label); |
1078 | 1105 |
1079 entry = gtk_entry_new(); | 1106 entry = gtk_entry_new(); |
1080 gtk_box_pack_end(GTK_BOX(hbox), entry, FALSE, FALSE, 0); | 1107 gtk_box_pack_end(GTK_BOX(hbox), entry, FALSE, FALSE, 0); |
1081 gtk_object_set_user_data(GTK_OBJECT(entry), (void *)USEROPT_SOCKSHOST); | 1108 gtk_object_set_user_data(GTK_OBJECT(entry), (void *)USEROPT_PROXYHOST); |
1082 gtk_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(toc_print_option), user); | 1109 gtk_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(toc_print_option), user); |
1083 if (user->proto_opt[USEROPT_SOCKSHOST][0]) { | 1110 if (user->proto_opt[USEROPT_PROXYHOST][0]) { |
1084 debug_printf("setting text %s\n", user->proto_opt[USEROPT_SOCKSHOST]); | 1111 debug_printf("setting text %s\n", user->proto_opt[USEROPT_PROXYHOST]); |
1085 gtk_entry_set_text(GTK_ENTRY(entry), user->proto_opt[USEROPT_SOCKSHOST]); | 1112 gtk_entry_set_text(GTK_ENTRY(entry), user->proto_opt[USEROPT_PROXYHOST]); |
1086 } | 1113 } |
1087 gtk_widget_show(entry); | 1114 gtk_widget_show(entry); |
1088 | 1115 |
1089 | 1116 |
1090 hbox = gtk_hbox_new(FALSE, 0); | 1117 hbox = gtk_hbox_new(FALSE, 0); |
1095 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); | 1122 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0); |
1096 gtk_widget_show(label); | 1123 gtk_widget_show(label); |
1097 | 1124 |
1098 entry = gtk_entry_new(); | 1125 entry = gtk_entry_new(); |
1099 gtk_box_pack_end(GTK_BOX(hbox), entry, FALSE, FALSE, 0); | 1126 gtk_box_pack_end(GTK_BOX(hbox), entry, FALSE, FALSE, 0); |
1100 gtk_object_set_user_data(GTK_OBJECT(entry), (void *)USEROPT_SOCKSPORT); | 1127 gtk_object_set_user_data(GTK_OBJECT(entry), (void *)USEROPT_PROXYPORT); |
1101 gtk_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(toc_print_option), user); | 1128 gtk_signal_connect(GTK_OBJECT(entry), "changed", GTK_SIGNAL_FUNC(toc_print_option), user); |
1102 if (user->proto_opt[USEROPT_SOCKSPORT][0]) { | 1129 if (user->proto_opt[USEROPT_PROXYPORT][0]) { |
1103 debug_printf("setting text %s\n", user->proto_opt[USEROPT_SOCKSPORT]); | 1130 debug_printf("setting text %s\n", user->proto_opt[USEROPT_PROXYPORT]); |
1104 gtk_entry_set_text(GTK_ENTRY(entry), user->proto_opt[USEROPT_SOCKSPORT]); | 1131 gtk_entry_set_text(GTK_ENTRY(entry), user->proto_opt[USEROPT_PROXYPORT]); |
1105 } | 1132 } |
1106 gtk_widget_show(entry); | 1133 gtk_widget_show(entry); |
1107 | 1134 |
1108 | 1135 |
1109 first = gtk_radio_button_new_with_label(NULL, "No proxy"); | 1136 first = gtk_radio_button_new_with_label(NULL, "No proxy"); |
1373 char *user; | 1400 char *user; |
1374 char *cookie; | 1401 char *cookie; |
1375 char *ip; | 1402 char *ip; |
1376 int port; | 1403 int port; |
1377 long size; | 1404 long size; |
1405 struct stat st; | |
1378 | 1406 |
1379 GtkWidget *window; | 1407 GtkWidget *window; |
1380 int files; | 1408 int files; |
1381 char *filename; | 1409 char *filename; |
1382 FILE *file; | 1410 FILE *file; |
1519 g_free(ft); | 1547 g_free(ft); |
1520 } | 1548 } |
1521 } | 1549 } |
1522 } | 1550 } |
1523 | 1551 |
1552 static void toc_send_file_connect(gpointer data, gint src, GdkInputCondition cond) | |
1553 { | |
1554 struct file_transfer *ft = data; | |
1555 | |
1556 if (src == -1) { | |
1557 do_error_dialog(_("Could not connect for transfer!"), _("Error")); | |
1558 g_free(ft->filename); | |
1559 g_free(ft->cookie); | |
1560 g_free(ft->user); | |
1561 g_free(ft->ip); | |
1562 g_free(ft); | |
1563 return; | |
1564 } | |
1565 | |
1566 ft->inpa = gdk_input_add(src, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, toc_send_file_callback, ft); | |
1567 } | |
1568 | |
1524 static void toc_send_file(gpointer a, struct file_transfer *old_ft) | 1569 static void toc_send_file(gpointer a, struct file_transfer *old_ft) |
1525 { | 1570 { |
1526 struct file_transfer *ft; | 1571 struct file_transfer *ft; |
1527 char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); | 1572 char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); |
1528 int fd; | 1573 int fd; |
1548 g_snprintf(buf, sizeof(buf), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_SEND_UID); | 1593 g_snprintf(buf, sizeof(buf), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_SEND_UID); |
1549 sflap_send(ft->gc, buf, -1, TYPE_DATA); | 1594 sflap_send(ft->gc, buf, -1, TYPE_DATA); |
1550 | 1595 |
1551 fd = | 1596 fd = |
1552 proxy_connect(ft->ip, ft->port, | 1597 proxy_connect(ft->ip, ft->port, |
1553 user->proto_opt[USEROPT_SOCKSHOST], | 1598 user->proto_opt[USEROPT_PROXYHOST], |
1554 atoi(user->proto_opt[USEROPT_SOCKSPORT]), | 1599 atoi(user->proto_opt[USEROPT_PROXYPORT]), |
1555 atoi(user->proto_opt[USEROPT_PROXYTYPE])); | 1600 atoi(user->proto_opt[USEROPT_PROXYTYPE]), |
1601 toc_send_file_connect, ft); | |
1556 if (fd < 0) { | 1602 if (fd < 0) { |
1557 do_error_dialog(_("Could not connect for transfer!"), _("Error")); | 1603 do_error_dialog(_("Could not connect for transfer!"), _("Error")); |
1558 g_free(ft->filename); | 1604 g_free(ft->filename); |
1559 g_free(ft->cookie); | 1605 g_free(ft->cookie); |
1560 g_free(ft->user); | 1606 g_free(ft->user); |
1561 g_free(ft->ip); | 1607 g_free(ft->ip); |
1562 g_free(ft); | 1608 g_free(ft); |
1563 return; | 1609 return; |
1564 } | 1610 } |
1565 | |
1566 ft->inpa = gdk_input_add(fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, toc_send_file_callback, ft); | |
1567 } | 1611 } |
1568 | 1612 |
1569 static void toc_get_file_callback(gpointer data, gint source, GdkInputCondition cond) | 1613 static void toc_get_file_callback(gpointer data, gint source, GdkInputCondition cond) |
1570 { | 1614 { |
1571 char buf[BUF_LONG]; | 1615 char buf[BUF_LONG]; |
1681 g_free(ft); | 1725 g_free(ft); |
1682 return; | 1726 return; |
1683 } | 1727 } |
1684 } | 1728 } |
1685 | 1729 |
1730 static void toc_get_file_connect(gpointer data, gint src, GdkInputCondition cond) | |
1731 { | |
1732 struct file_transfer *ft = data; | |
1733 struct file_header *hdr; | |
1734 char *buf; | |
1735 | |
1736 if (src == -1) { | |
1737 do_error_dialog(_("Could not connect for transfer!"), _("Error")); | |
1738 fclose(ft->file); | |
1739 g_free(ft->filename); | |
1740 g_free(ft->cookie); | |
1741 g_free(ft->user); | |
1742 g_free(ft->ip); | |
1743 g_free(ft); | |
1744 return; | |
1745 } | |
1746 | |
1747 hdr = (struct file_header *)ft; | |
1748 hdr->magic[0] = 'O'; hdr->magic[1] = 'F'; hdr->magic[2] = 'T'; hdr->magic[3] = '2'; | |
1749 hdr->hdrlen = htons(256); | |
1750 hdr->hdrtype = htons(0x1108); | |
1751 buf = frombase64(ft->cookie); | |
1752 g_snprintf(hdr->bcookie, 8, "%s", buf); | |
1753 g_free(buf); | |
1754 hdr->totfiles = htons(1); hdr->filesleft = htons(1); | |
1755 hdr->totparts = htons(1); hdr->partsleft = htons(1); | |
1756 hdr->totsize = htonl((long)ft->st.st_size); /* combined size of all files */ | |
1757 /* size = strlen("mm/dd/yyyy hh:mm sizesize 'name'\r\n") */ | |
1758 hdr->size = htonl(28 + strlen(g_basename(ft->filename))); /* size of listing.txt */ | |
1759 hdr->modtime = htonl(ft->st.st_mtime); | |
1760 hdr->checksum = htonl(0x89f70000); /* uh... */ | |
1761 g_snprintf(hdr->idstring, 32, "OFT_Windows ICBMFT V1.1 32"); | |
1762 hdr->flags = 0x02; | |
1763 hdr->lnameoffset = 0x1A; | |
1764 hdr->lsizeoffset = 0x10; | |
1765 g_snprintf(hdr->name, 64, "listing.txt"); | |
1766 if (write(src, hdr, 256) < 0) { | |
1767 do_error_dialog(_("Could not write file header!"), _("Error")); | |
1768 fclose(ft->file); | |
1769 g_free(ft->filename); | |
1770 g_free(ft->cookie); | |
1771 g_free(ft->user); | |
1772 g_free(ft->ip); | |
1773 g_free(ft); | |
1774 return; | |
1775 } | |
1776 | |
1777 ft->inpa = gdk_input_add(src, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, toc_get_file_callback, ft); | |
1778 } | |
1779 | |
1686 static void toc_get_file(gpointer a, struct file_transfer *old_ft) | 1780 static void toc_get_file(gpointer a, struct file_transfer *old_ft) |
1687 { | 1781 { |
1688 struct file_transfer *ft; | 1782 struct file_transfer *ft; |
1689 struct file_header *hdr; | |
1690 char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); | 1783 char *dirname = gtk_file_selection_get_filename(GTK_FILE_SELECTION(old_ft->window)); |
1691 int fd; | 1784 int fd; |
1692 struct aim_user *user; | 1785 struct aim_user *user; |
1693 char *buf, buf2[BUF_LEN * 2]; | 1786 char *buf, buf2[BUF_LEN * 2]; |
1694 struct stat st; | |
1695 | 1787 |
1696 if (file_is_dir(dirname, old_ft->window)) | 1788 if (file_is_dir(dirname, old_ft->window)) |
1697 return; | 1789 return; |
1698 ft = g_new0(struct file_transfer, 1); | 1790 ft = g_new0(struct file_transfer, 1); |
1699 ft->filename = g_strdup(dirname); | 1791 ft->filename = g_strdup(dirname); |
1704 g_free(buf); | 1796 g_free(buf); |
1705 g_free(ft->filename); | 1797 g_free(ft->filename); |
1706 g_free(ft); | 1798 g_free(ft); |
1707 return; | 1799 return; |
1708 } | 1800 } |
1709 if (stat(dirname, &st)) { | 1801 if (stat(dirname, &ft->st)) { |
1710 buf = g_strdup_printf("Unable to examine %s!", dirname); | 1802 buf = g_strdup_printf("Unable to examine %s!", dirname); |
1711 do_error_dialog(buf, "Error"); | 1803 do_error_dialog(buf, "Error"); |
1712 g_free(buf); | 1804 g_free(buf); |
1713 g_free(ft->filename); | 1805 g_free(ft->filename); |
1714 g_free(ft); | 1806 g_free(ft); |
1725 g_snprintf(buf2, sizeof(buf2), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_GET_UID); | 1817 g_snprintf(buf2, sizeof(buf2), "toc_rvous_accept %s %s %s", ft->user, ft->cookie, FILE_GET_UID); |
1726 sflap_send(ft->gc, buf2, -1, TYPE_DATA); | 1818 sflap_send(ft->gc, buf2, -1, TYPE_DATA); |
1727 | 1819 |
1728 fd = | 1820 fd = |
1729 proxy_connect(ft->ip, ft->port, | 1821 proxy_connect(ft->ip, ft->port, |
1730 user->proto_opt[USEROPT_SOCKSHOST], | 1822 user->proto_opt[USEROPT_PROXYHOST], |
1731 atoi(user->proto_opt[USEROPT_SOCKSPORT]), | 1823 atoi(user->proto_opt[USEROPT_PROXYPORT]), |
1732 atoi(user->proto_opt[USEROPT_PROXYTYPE])); | 1824 atoi(user->proto_opt[USEROPT_PROXYTYPE]), |
1825 toc_get_file_connect, ft); | |
1733 if (fd < 0) { | 1826 if (fd < 0) { |
1734 do_error_dialog(_("Could not connect for transfer!"), _("Error")); | 1827 do_error_dialog(_("Could not connect for transfer!"), _("Error")); |
1735 fclose(ft->file); | 1828 fclose(ft->file); |
1736 g_free(ft->filename); | 1829 g_free(ft->filename); |
1737 g_free(ft->cookie); | 1830 g_free(ft->cookie); |
1738 g_free(ft->user); | 1831 g_free(ft->user); |
1739 g_free(ft->ip); | 1832 g_free(ft->ip); |
1740 g_free(ft); | 1833 g_free(ft); |
1741 return; | 1834 return; |
1742 } | 1835 } |
1743 | |
1744 hdr = (struct file_header *)ft; | |
1745 hdr->magic[0] = 'O'; hdr->magic[1] = 'F'; hdr->magic[2] = 'T'; hdr->magic[3] = '2'; | |
1746 hdr->hdrlen = htons(256); | |
1747 hdr->hdrtype = htons(0x1108); | |
1748 buf = frombase64(ft->cookie); | |
1749 g_snprintf(hdr->bcookie, 8, "%s", buf); | |
1750 g_free(buf); | |
1751 hdr->totfiles = htons(1); hdr->filesleft = htons(1); | |
1752 hdr->totparts = htons(1); hdr->partsleft = htons(1); | |
1753 hdr->totsize = htonl((long)st.st_size); /* combined size of all files */ | |
1754 /* size = strlen("mm/dd/yyyy hh:mm sizesize 'name'\r\n") */ | |
1755 hdr->size = htonl(28 + strlen(g_basename(ft->filename))); /* size of listing.txt */ | |
1756 hdr->modtime = htonl(st.st_mtime); | |
1757 hdr->checksum = htonl(0x89f70000); /* uh... */ | |
1758 g_snprintf(hdr->idstring, 32, "OFT_Windows ICBMFT V1.1 32"); | |
1759 hdr->flags = 0x02; | |
1760 hdr->lnameoffset = 0x1A; | |
1761 hdr->lsizeoffset = 0x10; | |
1762 g_snprintf(hdr->name, 64, "listing.txt"); | |
1763 if (write(fd, hdr, 256) < 0) { | |
1764 do_error_dialog(_("Could not write file header!"), _("Error")); | |
1765 fclose(ft->file); | |
1766 g_free(ft->filename); | |
1767 g_free(ft->cookie); | |
1768 g_free(ft->user); | |
1769 g_free(ft->ip); | |
1770 g_free(ft); | |
1771 return; | |
1772 } | |
1773 | |
1774 ft->inpa = gdk_input_add(fd, GDK_INPUT_READ | GDK_INPUT_EXCEPTION, toc_get_file_callback, ft); | |
1775 } | 1836 } |
1776 | 1837 |
1777 static void cancel_callback(gpointer a, struct file_transfer *ft) { | 1838 static void cancel_callback(gpointer a, struct file_transfer *ft) { |
1778 gtk_widget_destroy(ft->window); | 1839 gtk_widget_destroy(ft->window); |
1779 if (a == ft->window) { | 1840 if (a == ft->window) { |