]> git.pld-linux.org Git - packages/irssi.git/blame_incremental - irssi-dcc-send-limit.patch
- release 4.2
[packages/irssi.git] / irssi-dcc-send-limit.patch
... / ...
CommitLineData
1diff -ur irssi-0.8.4.orig/src/irc/dcc/dcc-rec.h irssi-0.8.4/src/irc/dcc/dcc-rec.h
2--- irssi-0.8.4.orig/src/irc/dcc/dcc-rec.h Mon Feb 19 04:40:06 2001
3+++ irssi-0.8.4/src/irc/dcc/dcc-rec.h Thu Mar 14 02:20:25 2002
4@@ -20,6 +20,12 @@
5 time_t starttime; /* transfer start time */
6 unsigned long transfd; /* bytes transferred */
7
8+int timeout_tag;
9+
10+unsigned long skip_bytes;
11+unsigned long limit_starttime;
12+unsigned long max_speed;
13+
14 unsigned int destroyed:1; /* We're about to destroy this DCC recond */
15
16 GHashTable *module_data;
17diff -ur irssi-0.8.4.orig/src/irc/dcc/dcc-send.c irssi-0.8.4/src/irc/dcc/dcc-send.c
18--- irssi-0.8.4.orig/src/irc/dcc/dcc-send.c Sun Jan 20 04:10:27 2002
19+++ irssi-0.8.4/src/irc/dcc/dcc-send.c Thu Mar 14 02:21:22 2002
20@@ -50,14 +50,84 @@
21 {
22 if (!IS_DCC_SEND(dcc)) return;
23
24+ if (dcc->timeout_tag != -1)
25+ g_source_remove(dcc->timeout_tag);
26+
27 if (dcc->fhandle != -1) close(dcc->fhandle);
28 }
29
30+static int sent_too_much(SEND_DCC_REC *dcc)
31+{
32+ GTimeVal gtv;
33+ gulong timediff, curtime;
34+ gulong transfd, speed;
35+
36+ /* 0 == unlimited speed */
37+ if (dcc->max_speed == 0) return 0;
38+
39+ /* get time difference in milliseconds */
40+ g_get_current_time(&gtv);
41+ curtime = (gtv.tv_sec * 1000) + (gtv.tv_usec / 1000);
42+
43+ transfd = (dcc->transfd - dcc->skip_bytes);
44+ timediff = curtime - dcc->limit_starttime + 1;
45+ speed = ((transfd * 1000) / timediff);
46+
47+ /* reset speed counter every 30 seconds */
48+ if (timediff >= 30000) {
49+ dcc->limit_starttime = curtime;
50+ dcc->skip_bytes = dcc->transfd;
51+ }
52+
53+ return (speed > (dcc->max_speed * 1024));
54+}
55+
56+static void dcc_send_data(SEND_DCC_REC *dcc);
57+
58+static void reset_dcc_send(SEND_DCC_REC *dcc)
59+{
60+ if (g_slist_find(dcc_conns, dcc) == NULL) {
61+ /* the DCC was closed during the wait */
62+ return;
63+ }
64+
65+ if (dcc->timeout_tag != -1)
66+ g_source_remove(dcc->timeout_tag);
67+ dcc->timeout_tag = -1;
68+
69+ dcc->tagwrite = g_input_add(dcc->handle, G_INPUT_WRITE,
70+ (GInputFunction) dcc_send_data, dcc);
71+
72+ return;
73+}
74+
75 /* input function: DCC SEND - we're ready to send more data */
76 static void dcc_send_data(SEND_DCC_REC *dcc)
77 {
78 char buffer[512];
79- int ret;
80+ int ret, max_speed;
81+ GTimeVal gtv;
82+
83+ max_speed = settings_get_int("dcc_send_top_speed");
84+ if (max_speed != dcc->max_speed) {
85+ /* speed setting has changed, calculate speed from current position
86+ instead of from the start to eliminate speed boosts/slowdowns */
87+
88+ dcc->max_speed = max_speed;
89+ dcc->skip_bytes = dcc->transfd;
90+
91+ g_get_current_time(&gtv);
92+ dcc->limit_starttime = (gtv.tv_sec * 1000) + (gtv.tv_usec / 1000);
93+ }
94+
95+ if (sent_too_much(dcc)) {
96+ /* disable calling this function for 1/10th of a second. */
97+ g_source_remove(dcc->tagwrite);
98+ dcc->tagwrite = -1;
99+ dcc->timeout_tag = g_timeout_add(100, (GSourceFunc)
100+ reset_dcc_send, dcc);
101+ return;
102+ }
103
104 ret = read(dcc->fhandle, buffer, sizeof(buffer));
105 if (ret <= 0) {
106@@ -118,6 +188,7 @@
107 GIOChannel *handle;
108 IPADDR addr;
109 int port;
110+ GTimeVal gtv;
111
112 /* accept connection */
113 handle = net_accept(dcc->handle, &addr, &port);
114@@ -132,6 +203,13 @@
115 g_source_remove(dcc->tagconn);
116 dcc->tagconn = -1;
117
118+ dcc->skip_bytes = 0;
119+ dcc->max_speed = settings_get_int("dcc_send_top_speed");
120+
121+ /* get starttime in milliseconds */
122+ g_get_current_time(&gtv);
123+ dcc->limit_starttime = (gtv.tv_sec * 1000) + (gtv.tv_usec / 1000);
124+
125 dcc->starttime = time(NULL);
126 dcc->handle = handle;
127 memcpy(&dcc->addr, &addr, sizeof(IPADDR));
128@@ -235,6 +313,7 @@
129 dcc->size = fsize;
130 dcc->fhandle = hfile;
131 dcc->file_quoted = strchr(fname, ' ') != NULL;
132+ dcc->timeout_tag = -1;
133 dcc->tagconn = g_input_add(handle, G_INPUT_READ,
134 (GInputFunction) dcc_send_connected, dcc);
135
136@@ -256,6 +335,7 @@
137 {
138 dcc_register_type("SEND");
139 settings_add_str("dcc", "dcc_upload_path", "~");
140+ settings_add_int("dcc", "dcc_send_top_speed", 0);
141
142 signal_add("dcc destroyed", (SIGNAL_FUNC) sig_dcc_destroyed);
143 command_bind("dcc send", NULL, (SIGNAL_FUNC) cmd_dcc_send);
This page took 0.12703 seconds and 4 git commands to generate.