1 /* SmoothWall setup program.
3 * This program is distributed under the terms of the GNU General Public
4 * Licence. See the file COPYING for details.
6 * (c) Lawrence Manning, 2001
7 * The big one: networking.
9 * $Id: networking.c,v 1.5.2.6 2006/02/06 22:00:13 gespinasse Exp $
17 #define DEFAULT_GATEWAY 2
18 #define DNSGATEWAY_TOTAL 3
27 #define HAS_ORANGE (configtype == 1 || configtype == 3 || configtype == 5 || configtype == 7)
28 #define HAS_RED (configtype == 2 || configtype == 3 || configtype == 6 || configtype == 7)
29 #define HAS_BLUE (configtype == 4 || configtype == 5 || configtype == 6 || configtype == 7)
30 #define RED_IS_NOT_ETH (configtype == 0 || configtype == 1 || configtype == 4 || configtype == 5)
32 extern struct nic nics
[];
34 char *configtypenames
[] = {
35 "GREEN (RED is modem/ISDN)",
36 "GREEN + ORANGE (RED is modem/ISDN)",
38 "GREEN + ORANGE + RED",
39 "GREEN + BLUE (RED is modem/ISDN) ",
40 "GREEN + ORANGE + BLUE (RED is modem/ISDN)",
42 "GREEN + ORANGE + BLUE + RED",
46 int oktoleave(char *errormessage
);
48 int configtypemenu(void);
50 int changedrivers(void);
51 int greenaddressmenu(void);
52 int addressesmenu(void);
53 int dnsgatewaymenu(void);
55 int handlenetworking(void)
59 char errormessage
[STRING_SIZE
];
87 if (oktoleave(errormessage
))
90 errorbox(errormessage
);
100 /* Restart networking! */
101 if (netaddresschange
)
103 runcommandwithstatus("/etc/rc.d/rc.netaddress.down",
104 ctr
[TR_PUSHING_NETWORK_DOWN
]);
105 runcommandwithstatus("/etc/rc.d/rc.netaddress.up",
106 ctr
[TR_PULLING_NETWORK_UP
]);
107 mysystem("/etc/rc.d/rc.pcmcia start");
114 int oktoleave(char *errormessage
)
116 struct keyvalue
*kv
= initkeyvalues();
117 char temp
[STRING_SIZE
];
120 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
123 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
127 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
); configtype
= atol(temp
);
128 if (configtype
< 0 || configtype
> 7) configtype
= 0;
132 strcpy(temp
, ""); findkey(kv
, "BLUE_DEV", temp
);
135 strcpy(errormessage
, ctr
[TR_NO_BLUE_INTERFACE
]);
138 if (!(interfacecheck(kv
, "BLUE")))
140 strcpy(errormessage
, ctr
[TR_MISSING_BLUE_IP
]);
146 strcpy(temp
, ""); findkey(kv
, "ORANGE_DEV", temp
);
149 strcpy(errormessage
, ctr
[TR_NO_ORANGE_INTERFACE
]);
152 if (!(interfacecheck(kv
, "ORANGE")))
154 strcpy(errormessage
, ctr
[TR_MISSING_ORANGE_IP
]);
160 strcpy(temp
, ""); findkey(kv
, "RED_DEV", temp
);
163 strcpy(errormessage
, ctr
[TR_NO_RED_INTERFACE
]);
166 if (!(interfacecheck(kv
, "RED")))
168 strcpy(errormessage
, ctr
[TR_MISSING_RED_IP
]);
172 strcpy(errormessage
, "");
176 if (strlen(errormessage
))
183 /* Shows the main menu and a summary of the current settings. */
186 char *sections
[] = { ctr
[TR_NETWORK_CONFIGURATION_TYPE
],
187 ctr
[TR_DRIVERS_AND_CARD_ASSIGNMENTS
],
188 ctr
[TR_ADDRESS_SETTINGS
],
189 ctr
[TR_DNS_AND_GATEWAY_SETTINGS
], NULL
};
191 static int choice
= 0;
192 struct keyvalue
*kv
= initkeyvalues();
194 char temp
[STRING_SIZE
];
197 char networkrestart
[STRING_SIZE
] = "";
199 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
202 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
206 if (netaddresschange
)
207 strcpy(networkrestart
, ctr
[TR_RESTART_REQUIRED
]);
209 strcpy(temp
, ""); findkey(kv
, "CONFIG_TYPE", temp
); x
= atol(temp
);
210 if (x
< 0 || x
> 7) x
= 0;
211 /* Format heading bit. */
212 snprintf(message
, 1000, ctr
[TR_CURRENT_CONFIG
], configtypenames
[x
],
214 rc
= newtWinMenu(ctr
[TR_NETWORK_CONFIGURATION_MENU
], message
, 50, 5, 5, 6,
215 sections
, &choice
, ctr
[TR_OK
], ctr
[TR_DONE
], NULL
);
217 if (rc
== 0 || rc
== 1)
225 /* Here they choose general network config, number of nics etc. */
226 int configtypemenu(void)
228 struct keyvalue
*kv
= initkeyvalues();
229 char temp
[STRING_SIZE
] = "0";
234 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
237 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
241 findkey(kv
, "CONFIG_TYPE", temp
); choice
= atol(temp
);
242 sprintf(message
, ctr
[TR_NETWORK_CONFIGURATION_TYPE_LONG
], NAME
);
243 rc
= newtWinMenu(ctr
[TR_NETWORK_CONFIGURATION_TYPE
], message
, 50, 5, 5,
244 6, configtypenames
, &choice
, ctr
[TR_OK
], ctr
[TR_CANCEL
], NULL
);
246 if (rc
== 0 || rc
== 1)
248 runcommandwithstatus("/etc/rc.d/rc.netaddress.down NOTGREEN",
249 ctr
[TR_PUSHING_NON_LOCAL_NETWORK_DOWN
]);
251 sprintf(temp
, "%d", choice
);
252 replacekeyvalue(kv
, "CONFIG_TYPE", temp
);
253 replacekeyvalue(kv
, "ORANGE_DEV", "");
254 replacekeyvalue(kv
, "BLUE_DEV", "");
255 replacekeyvalue(kv
, "RED_DEV", "");
256 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
257 netaddresschange
= 1;
265 /* Driver menu. Choose drivers.. */
268 struct keyvalue
*kv
= initkeyvalues();
270 char temp
[STRING_SIZE
], temp1
[STRING_SIZE
];
271 char driver
[STRING_SIZE
], dev
[STRING_SIZE
];
275 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
278 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
282 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
283 configtype
= atol(temp
);
288 errorbox(ctr
[TR_YOUR_CONFIGURATION_IS_SINGLE_GREEN_ALREADY_HAS_DRIVER
]);
292 strcpy(message
, ctr
[TR_CONFIGURE_NETWORK_DRIVERS
]);
294 /* This horrible big formats the heading :( */
295 strcpy(driver
, ""); findkey(kv
, "GREEN_DISPLAYDRIVER", driver
);
296 findnicdescription(driver
, temp
);
297 strcpy(dev
, ctr
[TR_UNSET
]); findkey(kv
, "GREEN_DEV", dev
);
298 if (!strlen(dev
)) strcpy(dev
, ctr
[TR_UNSET
]);
299 sprintf(temp1
, "GREEN: %s (%s)\n", temp
, dev
);
300 strcat(message
, temp1
);
303 strcpy(driver
, ""); findkey(kv
, "BLUE_DISPLAYDRIVER", driver
);
304 findnicdescription(driver
, temp
);
305 strcpy(dev
, ctr
[TR_UNSET
]); findkey(kv
, "BLUE_DEV", dev
);
306 if (!strlen(dev
)) strcpy(dev
, ctr
[TR_UNSET
]);
307 sprintf(temp1
, "BLUE: %s (%s)\n", temp
, dev
);
308 strcat(message
, temp1
);
312 strcpy(driver
, ""); findkey(kv
, "ORANGE_DISPLAYDRIVER", driver
);
313 findnicdescription(driver
, temp
);
314 strcpy(dev
, ctr
[TR_UNSET
]); findkey(kv
, "ORANGE_DEV", dev
);
315 if (!strlen(dev
)) strcpy(dev
, ctr
[TR_UNSET
]);
316 sprintf(temp1
, "ORANGE: %s (%s)\n", temp
, dev
);
317 strcat(message
, temp1
);
321 strcpy(driver
, ""); findkey(kv
, "RED_DISPLAYDRIVER", driver
);
322 findnicdescription(driver
, temp
);
323 strcpy(dev
, ctr
[TR_UNSET
]); findkey(kv
, "RED_DEV", dev
);
324 if (!strlen(dev
)) strcpy(dev
, ctr
[TR_UNSET
]);
325 sprintf(temp1
, "RED: %s (%s)\n", temp
, dev
);
326 strcat(message
, temp1
);
328 strcat(message
, ctr
[TR_DO_YOU_WISH_TO_CHANGE_THESE_SETTINGS
]);
329 rc
= newtWinChoice(ctr
[TR_DRIVERS_AND_CARD_ASSIGNMENTS
], ctr
[TR_OK
],
330 ctr
[TR_CANCEL
], message
);
331 if (rc
== 0 || rc
== 1)
333 /* Shit, got to do something.. */
342 int changedrivers(void)
344 struct keyvalue
*kv
= initkeyvalues();
346 char temp
[STRING_SIZE
];
347 char driver
[STRING_SIZE
];
351 int needcards
, sofarallocated
, countofcards
, toallocate
;
352 char *orange
= "ORANGE";
357 char nexteth
[STRING_SIZE
];
359 char currentdriver
[STRING_SIZE
], currentdriveroptions
[STRING_SIZE
];
360 char displaydriver
[STRING_SIZE
];
363 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
366 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
370 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
371 configtype
= atol(temp
);
373 runcommandwithstatus("/etc/rc.d/rc.netaddress.down NOTGREEN",
374 ctr
[TR_PUSHING_NON_LOCAL_NETWORK_DOWN
]);
376 /* Remove all modules not needed for green networking. */
378 strcpy(driver
, ""); findkey(kv
, "GREEN_DRIVER", driver
);
379 if (strcmp(driver
, "pcmcia") != 0) {
380 stat("/proc/bus/pccard", &st
);
381 mysystem("/etc/rc.d/rc.pcmcia stop");
382 if (S_ISDIR(st
.st_mode
)) {
383 mysystem("/sbin/modprobe pcmcia_core");
384 mysystem("/sbin/modprobe pcmcia-controller");
385 mysystem("/sbin/modprobe ds");
388 while (nics
[c
].modulename
)
390 if (strcmp(nics
[c
].modulename
, driver
) != 0)
392 if (checkformodule(nics
[c
].modulename
))
394 sprintf(temp
, "/sbin/rmmod %s", nics
[c
].modulename
);
401 /* Blank them so the rc.netaddress.up does not get confused. */
402 replacekeyvalue(kv
, "ORANGE_DEV", "");
403 replacekeyvalue(kv
, "BLUE_DEV", "");
404 replacekeyvalue(kv
, "RED_DEV", "");
408 else if (configtype
== 1 || configtype
== 2 || configtype
== 4)
410 else if (configtype
== 7)
415 /* This is the green card. */
418 findkey(kv
, "GREEN_DRIVER", currentdriver
);
419 findkey(kv
, "GREEN_DRIVER_OPTIONS", currentdriveroptions
);
420 strcpy(displaydriver
, currentdriver
);
422 if (countcards() > 1)
423 strcpy(currentdriver
, "");
426 /* Keep going till all cards are got, or they give up. */
427 while (sofarallocated
< needcards
&& !abort
)
429 countofcards
= countcards();
431 /* This is how many cards were added by the last module. */
432 toallocate
= countofcards
- sofarallocated
;
433 while (toallocate
> 0 && sofarallocated
< needcards
)
435 findnicdescription(displaydriver
, temp
);
436 sprintf(message
, ctr
[TR_UNCLAIMED_DRIVER
], temp
);
438 strcpy(temp
, ""); findkey(kv
, "BLUE_DEV", temp
);
439 if (HAS_BLUE
&& !strlen(temp
))
444 strcpy(temp
, ""); findkey(kv
, "ORANGE_DEV", temp
);
445 if (HAS_ORANGE
&& !strlen(temp
))
447 sections
[c
] = orange
;
450 strcpy(temp
, ""); findkey(kv
, "RED_DEV", temp
);
451 if (HAS_RED
&& !strlen(temp
))
457 rc
= newtWinMenu(ctr
[TR_CARD_ASSIGNMENT
],
458 message
, 50, 5, 5, 6, sections
, &choice
, ctr
[TR_OK
],
459 ctr
[TR_CANCEL
], NULL
);
460 if (rc
== 0 || rc
== 1)
462 /* Now we see which iface needs its settings changed. */
463 sprintf(nexteth
, "eth%d", sofarallocated
);
464 if (strcmp(sections
[choice
], blue
) == 0)
466 replacekeyvalue(kv
, "BLUE_DEV", nexteth
);
467 replacekeyvalue(kv
, "BLUE_DRIVER", currentdriver
);
468 replacekeyvalue(kv
, "BLUE_DRIVER_OPTIONS", currentdriveroptions
);
469 replacekeyvalue(kv
, "BLUE_DISPLAYDRIVER", displaydriver
);
472 strcpy(currentdriver
, "");
473 strcpy(currentdriveroptions
, "");
475 if (strcmp(sections
[choice
], orange
) == 0)
477 replacekeyvalue(kv
, "ORANGE_DEV", nexteth
);
478 replacekeyvalue(kv
, "ORANGE_DRIVER", currentdriver
);
479 replacekeyvalue(kv
, "ORANGE_DRIVER_OPTIONS", currentdriveroptions
);
480 replacekeyvalue(kv
, "ORANGE_DISPLAYDRIVER", displaydriver
);
483 strcpy(currentdriver
, "");
484 strcpy(currentdriveroptions
, "");
486 if (strcmp(sections
[choice
], red
) == 0)
488 replacekeyvalue(kv
, "RED_DEV", nexteth
);
489 replacekeyvalue(kv
, "RED_DRIVER", currentdriver
);
490 replacekeyvalue(kv
, "RED_DRIVER_OPTIONS", currentdriveroptions
);
491 replacekeyvalue(kv
, "RED_DISPLAYDRIVER", displaydriver
);
494 strcpy(currentdriver
, "");
495 strcpy(currentdriveroptions
, "");
504 /* Need another module! The nitty gritty code is in libsmooth. */
505 if (sofarallocated
< needcards
)
507 rc
= newtWinTernary(ctr
[TR_CARD_ASSIGNMENT
], ctr
[TR_PROBE
],
508 ctr
[TR_SELECT
], ctr
[TR_CANCEL
], ctr
[TR_NO_UNALLOCATED_CARDS
]);
510 if (rc
== 0 || rc
== 1)
512 probecards(currentdriver
, currentdriveroptions
);
513 if (!strlen(currentdriver
))
514 errorbox(ctr
[TR_PROBE_FAILED
]);
517 choosecards(currentdriver
, currentdriveroptions
);
521 strcpy(displaydriver
, currentdriver
);
525 countofcards
= countcards();
527 if (countofcards
>= needcards
)
529 newtWinMessage(ctr
[TR_CARD_ASSIGNMENT
], ctr
[TR_OK
],
530 ctr
[TR_ALL_CARDS_SUCCESSFULLY_ALLOCATED
]);
533 errorbox(ctr
[TR_NOT_ENOUGH_CARDS_WERE_ALLOCATED
]);
535 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
539 netaddresschange
= 1;
544 /* Let user change GREEN address. */
545 int greenaddressmenu(void)
547 struct keyvalue
*kv
= initkeyvalues();
551 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
554 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
558 sprintf(message
, ctr
[TR_WARNING_LONG
], NAME
);
559 rc
= newtWinChoice(ctr
[TR_WARNING
], ctr
[TR_OK
], ctr
[TR_CANCEL
], message
);
561 if (rc
== 0 || rc
== 1)
563 if (changeaddress(kv
, "GREEN", 0, ""))
565 netaddresschange
= 1;
566 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
576 /* They can change BLUE, ORANGE and GREEN too :) */
577 int addressesmenu(void)
579 struct keyvalue
*kv
= initkeyvalues();
580 struct keyvalue
*mainkv
= initkeyvalues();
583 char *green
= "GREEN";
584 char *orange
= "ORANGE";
588 char greenaddress
[STRING_SIZE
];
589 char oldgreenaddress
[STRING_SIZE
];
590 char temp
[STRING_SIZE
];
591 char temp2
[STRING_SIZE
];
596 char hostname
[STRING_SIZE
];
598 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
601 freekeyvalues(mainkv
);
602 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
605 if (!(readkeyvalues(mainkv
, CONFIG_ROOT
"/main/settings")))
608 freekeyvalues(mainkv
);
609 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
613 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
614 configtype
= atol(temp
);
625 sections
[c
] = orange
;
639 rc
= newtWinMenu(ctr
[TR_ADDRESS_SETTINGS
],
640 ctr
[TR_SELECT_THE_INTERFACE_YOU_WISH_TO_RECONFIGURE
], 50, 5,
641 5, 6, sections
, &choice
, ctr
[TR_OK
], ctr
[TR_DONE
], NULL
);
643 if (rc
== 0 || rc
== 1)
645 if (strcmp(sections
[choice
], "GREEN") == 0)
647 findkey(kv
, "GREEN_ADDRESS", oldgreenaddress
);
648 sprintf(message
, ctr
[TR_WARNING_LONG
], NAME
);
649 rc
= newtWinChoice(ctr
[TR_WARNING
], ctr
[TR_OK
], ctr
[TR_CANCEL
],
651 if (rc
== 0 || rc
== 1)
653 if (changeaddress(kv
, "GREEN", 0, ""))
655 netaddresschange
= 1;
656 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
658 findkey(kv
, "GREEN_ADDRESS", greenaddress
);
659 snprintf(temp
, STRING_SIZE
-1, "option routers %s", oldgreenaddress
);
660 snprintf(temp2
, STRING_SIZE
-1, "option routers %s", greenaddress
);
661 replace (CONFIG_ROOT
"/dhcp/dhcpd.conf", temp
, temp2
);
662 chown (CONFIG_ROOT
"/dhcp/dhcpd.conf", 99, 99);
666 if (strcmp(sections
[choice
], "BLUE") == 0)
668 if (changeaddress(kv
, "BLUE", 0, ""))
669 netaddresschange
= 1;
671 if (strcmp(sections
[choice
], "ORANGE") == 0)
673 if (changeaddress(kv
, "ORANGE", 0, ""))
674 netaddresschange
= 1;
676 if (strcmp(sections
[choice
], "RED") == 0)
678 strcpy(hostname
, "");
679 findkey(mainkv
, "HOSTNAME", hostname
);
680 if (changeaddress(kv
, "RED", 1, hostname
))
681 netaddresschange
= 1;
688 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");
690 freekeyvalues(mainkv
);
695 /* DNS and default gateway.... */
696 int dnsgatewaymenu(void)
698 struct keyvalue
*kv
= initkeyvalues();
700 char temp
[STRING_SIZE
] = "0";
701 struct newtWinEntry entries
[DNSGATEWAY_TOTAL
+1];
702 char *values
[DNSGATEWAY_TOTAL
]; /* pointers for the values. */
707 if (!(readkeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings")))
710 errorbox(ctr
[TR_UNABLE_TO_OPEN_SETTINGS_FILE
]);
714 strcpy(temp
, "0"); findkey(kv
, "CONFIG_TYPE", temp
);
715 configtype
= atol(temp
);
720 errorbox(ctr
[TR_DNS_GATEWAY_WITH_GREEN
]);
724 entries
[DNS1
].text
= ctr
[TR_PRIMARY_DNS
];
725 strcpy(temp
, ""); findkey(kv
, "DNS1", temp
);
726 values
[DNS1
] = strdup(temp
);
727 entries
[DNS1
].value
= &values
[DNS1
];
728 entries
[DNS1
].flags
= 0;
730 entries
[DNS2
].text
= ctr
[TR_SECONDARY_DNS
];
731 strcpy(temp
, ""); findkey(kv
, "DNS2", temp
);
732 values
[DNS2
] = strdup(temp
);
733 entries
[DNS2
].value
= &values
[DNS2
];
734 entries
[DNS2
].flags
= 0;
736 entries
[DEFAULT_GATEWAY
].text
= ctr
[TR_DEFAULT_GATEWAY
];
737 strcpy(temp
, ""); findkey(kv
, "DEFAULT_GATEWAY", temp
);
738 values
[DEFAULT_GATEWAY
] = strdup(temp
);
739 entries
[DEFAULT_GATEWAY
].value
= &values
[DEFAULT_GATEWAY
];
740 entries
[DEFAULT_GATEWAY
].flags
= 0;
742 entries
[DNSGATEWAY_TOTAL
].text
= NULL
;
743 entries
[DNSGATEWAY_TOTAL
].value
= NULL
;
744 entries
[DNSGATEWAY_TOTAL
].flags
= 0;
750 rc
= newtWinEntries(ctr
[TR_DNS_AND_GATEWAY_SETTINGS
],
751 ctr
[TR_DNS_AND_GATEWAY_SETTINGS_LONG
], 50, 5, 5, 18, entries
,
752 ctr
[TR_OK
], ctr
[TR_CANCEL
], NULL
);
753 if (rc
== 0 || rc
== 1)
755 strcpy(message
, ctr
[TR_INVALID_FIELDS
]);
756 if (strlen(values
[DNS1
]))
758 if (inet_addr(values
[DNS1
]) == INADDR_NONE
)
760 strcat(message
, ctr
[TR_PRIMARY_DNS_CR
]);
764 if (strlen(values
[DNS2
]))
766 if (inet_addr(values
[DNS2
]) == INADDR_NONE
)
768 strcat(message
, ctr
[TR_SECONDARY_DNS_CR
]);
772 if (strlen(values
[DEFAULT_GATEWAY
]))
774 if (inet_addr(values
[DEFAULT_GATEWAY
]) == INADDR_NONE
)
776 strcat(message
, ctr
[TR_DEFAULT_GATEWAY_CR
]);
780 if (!strlen(values
[DNS1
]) && strlen(values
[DNS2
]))
782 strcpy(message
, ctr
[TR_SECONDARY_WITHOUT_PRIMARY_DNS
]);
790 replacekeyvalue(kv
, "DNS1", values
[DNS1
]);
791 replacekeyvalue(kv
, "DNS2", values
[DNS2
]);
792 replacekeyvalue(kv
, "DEFAULT_GATEWAY", values
[DEFAULT_GATEWAY
]);
793 netaddresschange
= 1;
796 free(values
[DEFAULT_GATEWAY
]);
797 writekeyvalues(kv
, CONFIG_ROOT
"/ethernet/settings");