662
if(if_index != AVAHI_IF_UNSPEC and mc->interfaces != NULL){
663
/* Check if the interface is one of the interfaces we are using */
666
char *interface = NULL;
667
while((interface=argz_next(mc->interfaces, mc->interfaces_size,
669
if(if_nametoindex(interface) == (unsigned int)if_index){
677
char interface[IF_NAMESIZE];
678
if(if_indextoname((unsigned int)if_index, interface) == NULL){
679
perror_plus("if_indextoname");
681
fprintf_plus(stderr, "Skipping server on non-used interface"
683
if_indextoname((unsigned int)if_index,
691
660
ret = init_gnutls_session(&session, mc);
1786
1755
int main(int argc, char *argv[]){
1787
1756
mandos_context mc = { .server = NULL, .dh_bits = 1024,
1788
1757
.priority = "SECURE256:!CTYPE-X.509:"
1789
"+CTYPE-OPENPGP", .current_server = NULL,
1790
.interfaces = NULL, .interfaces_size = 0 };
1758
"+CTYPE-OPENPGP", .current_server = NULL };
1791
1759
AvahiSServiceBrowser *sb = NULL;
1792
1760
error_t ret_errno;
1794
1762
intmax_t tmpmax;
1796
1764
int exitcode = EXIT_SUCCESS;
1765
char *interfaces = NULL;
1766
size_t interfaces_size = 0;
1797
1767
char *interfaces_to_take_down = NULL;
1798
1768
size_t interfaces_to_take_down_size = 0;
1799
1769
char tempdir[] = "/tmp/mandosXXXXXX";
1899
1869
connect_to = arg;
1901
1871
case 'i': /* --interface */
1902
ret_errno = argz_add_sep(&mc.interfaces, &mc.interfaces_size,
1872
ret_errno = argz_add_sep(&interfaces, &interfaces_size, arg,
1904
1874
if(ret_errno != 0){
1905
1875
argp_error(state, "%s", strerror(ret_errno));
2035
2005
/* Lower privileges */
2009
perror_plus("seteuid");
2040
/* Remove invalid interface names (except "none") */
2014
/* Remove empty interface names */
2042
2016
char *interface = NULL;
2043
while((interface = argz_next(mc.interfaces, mc.interfaces_size,
2017
while((interface = argz_next(interfaces, interfaces_size,
2045
if(strcmp(interface, "none") != 0
2046
and if_nametoindex(interface) == 0){
2047
if(interface[0] != '\0'){
2019
if(if_nametoindex(interface) == 0){
2020
if(interface[0] != '\0' and strcmp(interface, "none") != 0){
2048
2021
fprintf_plus(stderr, "Not using nonexisting interface"
2049
2022
" \"%s\"\n", interface);
2051
argz_delete(&mc.interfaces, &mc.interfaces_size, interface);
2024
argz_delete(&interfaces, &interfaces_size, interface);
2052
2025
interface = NULL;
2057
2030
/* Run network hooks */
2059
if(mc.interfaces != NULL){
2060
interfaces_hooks = malloc(mc.interfaces_size);
2033
if(interfaces != NULL){
2034
interfaces_hooks = malloc(interfaces_size);
2061
2035
if(interfaces_hooks == NULL){
2062
2036
perror_plus("malloc");
2065
memcpy(interfaces_hooks, mc.interfaces, mc.interfaces_size);
2066
interfaces_hooks_size = mc.interfaces_size;
2039
memcpy(interfaces_hooks, interfaces, interfaces_size);
2040
interfaces_hooks_size = interfaces_size;
2067
2041
argz_stringify(interfaces_hooks, interfaces_hooks_size,
2155
2129
/* If no interfaces were specified, make a list */
2156
if(mc.interfaces == NULL){
2130
if(interfaces == NULL){
2157
2131
struct dirent **direntries;
2158
2132
/* Look for any good interfaces */
2159
2133
ret = scandir(sys_class_net, &direntries, good_interface,
2162
2136
/* Add all found interfaces to interfaces list */
2163
2137
for(int i = 0; i < ret; ++i){
2164
ret_errno = argz_add(&mc.interfaces, &mc.interfaces_size,
2138
ret_errno = argz_add(&interfaces, &interfaces_size,
2165
2139
direntries[i]->d_name);
2166
2140
if(ret_errno != 0){
2167
2141
perror_plus("argz_add");
2158
/* If we only got one interface, explicitly use only that one */
2159
if(argz_count(interfaces, interfaces_size) == 1){
2161
fprintf_plus(stderr, "Using only interface \"%s\"\n",
2164
if_index = (AvahiIfIndex)if_nametoindex(interfaces);
2184
2167
/* Bring up interfaces which are down */
2168
if(not (argz_count(interfaces, interfaces_size) == 1
2169
and strcmp(interfaces, "none") == 0)){
2186
2170
char *interface = NULL;
2187
while((interface = argz_next(mc.interfaces, mc.interfaces_size,
2171
while((interface = argz_next(interfaces, interfaces_size,
2189
/* If interface name is "none", stop bringing up interfaces.
2190
Also remove all instances of "none" from the list */
2191
if(strcmp(interface, "none") == 0){
2192
argz_delete(&mc.interfaces, &mc.interfaces_size,
2195
while((interface = argz_next(mc.interfaces,
2196
mc.interfaces_size, interface))){
2197
if(strcmp(interface, "none") == 0){
2198
argz_delete(&mc.interfaces, &mc.interfaces_size,
2205
2173
bool interface_was_up = interface_is_up(interface);
2206
2174
ret = bring_up_interface(interface, delay);
2207
2175
if(not interface_was_up){
2188
interfaces_size = 0;
2218
2189
if(debug and (interfaces_to_take_down == NULL)){
2219
2190
fprintf_plus(stderr, "No interfaces were brought up\n");
2223
/* If we only got one interface, explicitly use only that one */
2224
if(argz_count(mc.interfaces, mc.interfaces_size) == 1){
2226
fprintf_plus(stderr, "Using only interface \"%s\"\n",
2229
if_index = (AvahiIfIndex)if_nametoindex(mc.interfaces);