Configure tsocks with a simple heuristic.
Consider the proxy has to be in a 'local' network. It means it is directly
reachable by the local machine, even if the local machine has to hop through
one or more gates to reach the proxy (often the case in enterprise networks
where class A 10.0.0.0/8 is in fact sub-divided into smaller networks, each
one of them in a different location, eg. 10.1.0.0/16 in a place, while
10.2.0.0/16 would be on the other side of the world). Not being in the same
subnet does not mean the proxy is not available.
So we will build a mask with at most high bits set, which defines a network
that has both the local machine and the proxy. Because a machine may have
more than one interface, build a mask for each of them, removing 127.0.0.1
which is added automagically by tsocks, and removing duplicate masks.
If all of this does not work, then it means the local machine can NOT in fact
reach the proxy, which in turn means the user mis-configured something (most
probably a typo...).
/trunk/scripts/crosstool.sh | 61 52 9 0 +++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 52 insertions(+), 9 deletions(-)
2 * checklist.c -- implements the checklist box
4 * ORIGINAL AUTHOR: Savio Lam (lam836@cs.cuhk.hk)
5 * Stuart Herbert - S.Herbert@sheffield.ac.uk: radiolist extension
6 * Alessandro Rubini - rubini@ipvvis.unipv.it: merged the two
7 * MODIFIED FOR LINUX KERNEL CONFIG BY: William Roadcap (roadcap@cfw.com)
9 * This program is free software; you can redistribute it and/or
10 * modify it under the terms of the GNU General Public License
11 * as published by the Free Software Foundation; either version 2
12 * of the License, or (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26 static int list_width, check_x, item_x;
31 static void print_item(WINDOW * win, int choice, int selected)
35 /* Clear 'residue' of last item */
36 wattrset(win, dlg.menubox.atr);
37 wmove(win, choice, 0);
38 for (i = 0; i < list_width; i++)
41 wmove(win, choice, check_x);
42 wattrset(win, selected ? dlg.check_selected.atr
44 wprintw(win, "(%c)", item_is_tag('X') ? 'X' : ' ');
46 wattrset(win, selected ? dlg.tag_selected.atr : dlg.tag.atr);
47 mvwaddch(win, choice, item_x, item_str()[0]);
48 wattrset(win, selected ? dlg.item_selected.atr : dlg.item.atr);
49 waddstr(win, (char *)item_str() + 1);
51 wmove(win, choice, check_x + 1);
57 * Print the scroll indicators.
59 static void print_arrows(WINDOW * win, int choice, int item_no, int scroll,
60 int y, int x, int height)
65 wattrset(win, dlg.uarrow.atr);
66 waddch(win, ACS_UARROW);
69 wattrset(win, dlg.menubox.atr);
70 waddch(win, ACS_HLINE);
71 waddch(win, ACS_HLINE);
72 waddch(win, ACS_HLINE);
73 waddch(win, ACS_HLINE);
79 if ((height < item_no) && (scroll + choice < item_no - 1)) {
80 wattrset(win, dlg.darrow.atr);
81 waddch(win, ACS_DARROW);
84 wattrset(win, dlg.menubox_border.atr);
85 waddch(win, ACS_HLINE);
86 waddch(win, ACS_HLINE);
87 waddch(win, ACS_HLINE);
88 waddch(win, ACS_HLINE);
93 * Display the termination buttons
95 static void print_buttons(WINDOW * dialog, int height, int width, int selected)
97 int x = width / 2 - 11;
100 print_button(dialog, "Select", y, x, selected == 0);
101 print_button(dialog, " Help ", y, x + 14, selected == 1);
103 wmove(dialog, y, x + 1 + 14 * selected);
108 * Display a dialog box with a list of options that can be turned on or off
109 * in the style of radiolist (only one option turned on at a time).
111 int dialog_checklist(const char *title, const char *prompt, int height,
112 int width, int list_height)
114 int i, x, y, box_x, box_y;
115 int key = 0, button = 0, choice = 0, scroll = 0, max_choice;
116 WINDOW *dialog, *list;
118 /* which item to highlight */
120 if (item_is_tag('X'))
122 if (item_is_selected()) {
129 if (getmaxy(stdscr) < (height + 6))
130 return -ERRDISPLAYTOOSMALL;
131 if (getmaxx(stdscr) < (width + 6))
132 return -ERRDISPLAYTOOSMALL;
134 max_choice = MIN(list_height, item_count());
136 /* center dialog box on screen */
137 x = (COLS - width) / 2;
138 y = (LINES - height) / 2;
140 draw_shadow(stdscr, y, x, height, width);
142 dialog = newwin(height, width, y, x);
143 keypad(dialog, TRUE);
145 draw_box(dialog, 0, 0, height, width,
146 dlg.dialog.atr, dlg.border.atr);
147 wattrset(dialog, dlg.border.atr);
148 mvwaddch(dialog, height - 3, 0, ACS_LTEE);
149 for (i = 0; i < width - 2; i++)
150 waddch(dialog, ACS_HLINE);
151 wattrset(dialog, dlg.dialog.atr);
152 waddch(dialog, ACS_RTEE);
154 print_title(dialog, title, width);
156 wattrset(dialog, dlg.dialog.atr);
157 print_autowrap(dialog, prompt, width - 2, 1, 3);
159 list_width = width - 6;
160 box_y = height - list_height - 5;
161 box_x = (width - list_width) / 2 - 1;
163 /* create new window for the list */
164 list = subwin(dialog, list_height, list_width, y + box_y + 1,
169 /* draw a box around the list items */
170 draw_box(dialog, box_y, box_x, list_height + 2, list_width + 2,
171 dlg.menubox_border.atr, dlg.menubox.atr);
173 /* Find length of longest item in order to center checklist */
176 check_x = MAX(check_x, strlen(item_str()) + 4);
178 check_x = (list_width - check_x) / 2;
179 item_x = check_x + 4;
181 if (choice >= list_height) {
182 scroll = choice - list_height + 1;
187 for (i = 0; i < max_choice; i++) {
188 item_set(scroll + i);
189 print_item(list, i, i == choice);
192 print_arrows(dialog, choice, item_count(), scroll,
193 box_y, box_x + check_x + 5, list_height);
195 print_buttons(dialog, height, width, 0);
197 wnoutrefresh(dialog);
201 while (key != KEY_ESC) {
202 key = wgetch(dialog);
204 for (i = 0; i < max_choice; i++) {
205 item_set(i + scroll);
206 if (toupper(key) == toupper(item_str()[0]))
210 if (i < max_choice || key == KEY_UP || key == KEY_DOWN ||
211 key == '+' || key == '-') {
212 if (key == KEY_UP || key == '-') {
216 /* Scroll list down */
217 if (list_height > 1) {
218 /* De-highlight current first item */
220 print_item(list, 0, FALSE);
221 scrollok(list, TRUE);
223 scrollok(list, FALSE);
227 print_item(list, 0, TRUE);
228 print_arrows(dialog, choice, item_count(),
229 scroll, box_y, box_x + check_x + 5, list_height);
231 wnoutrefresh(dialog);
234 continue; /* wait for another key press */
237 } else if (key == KEY_DOWN || key == '+') {
238 if (choice == max_choice - 1) {
239 if (scroll + choice >= item_count() - 1)
242 if (list_height > 1) {
243 /* De-highlight current last item before scrolling up */
244 item_set(scroll + max_choice - 1);
248 scrollok(list, TRUE);
250 scrollok(list, FALSE);
253 item_set(scroll + max_choice - 1);
254 print_item(list, max_choice - 1, TRUE);
256 print_arrows(dialog, choice, item_count(),
257 scroll, box_y, box_x + check_x + 5, list_height);
259 wnoutrefresh(dialog);
262 continue; /* wait for another key press */
267 /* De-highlight current item */
268 item_set(scroll + choice);
269 print_item(list, choice, FALSE);
270 /* Highlight new item */
272 item_set(scroll + choice);
273 print_item(list, choice, TRUE);
274 wnoutrefresh(dialog);
277 continue; /* wait for another key press */
290 item_set_selected(0);
291 item_set(scroll + choice);
292 item_set_selected(1);
299 button = ((key == KEY_LEFT ? --button : ++button) < 0)
300 ? 1 : (button > 1 ? 0 : button);
302 print_buttons(dialog, height, width, button);
310 key = on_key_esc(dialog);
319 /* Now, update everything... */
324 return key; /* ESC pressed */