25 |
#include <stdlib.h> |
#include <stdlib.h> |
26 |
#include <stdio.h> |
#include <stdio.h> |
27 |
#include <unistd.h> |
#include <unistd.h> |
28 |
|
#include <sys/socket.h> |
29 |
#include <netinet/in.h> |
#include <netinet/in.h> |
30 |
|
#include <arpa/inet.h> |
31 |
|
#include <string.h> |
32 |
|
#include <errno.h> |
33 |
|
|
34 |
#include "log.h" |
#include "log.h" |
35 |
#include "misc.h" |
#include "misc.h" |
36 |
#include "options.h" |
#include "options.h" |
37 |
|
|
38 |
int |
int |
39 |
launch_ip_up (if_name, if_addr, if_netmask, if_network, if_broadcast, |
launch_ip_up (if_name, if_addr, dns, domain, mtu) |
|
if_gateway) |
|
40 |
char *if_name; |
char *if_name; |
41 |
in_addr_t if_addr; |
struct in_addr if_addr; |
42 |
in_addr_t if_netmask; |
struct in_addr dns; |
43 |
in_addr_t if_network; |
char *domain; |
44 |
in_addr_t if_broadcast; |
int mtu; |
|
in_addr_t if_gateway; |
|
45 |
{ |
{ |
46 |
char name[128]; |
char env_name[128]; |
47 |
char addr[128]; |
char env_addr[128]; |
48 |
char netmask[128]; |
char env_dns[128]; |
49 |
char network[128]; |
char env_domain[128]; |
50 |
char broadcast[128]; |
char env_mtu[128]; |
|
char gateway[128]; |
|
51 |
int pid; |
int pid; |
52 |
struct stat st; |
struct stat st; |
53 |
|
|
54 |
snprintf (name, sizeof (name) - 1, "IFNAME=%s", if_name); |
snprintf (env_name, sizeof (env_name) - 1, "IFNAME=%s", if_name); |
55 |
snprintf (addr, sizeof (addr) - 1, "ADDRESS=%d.%d.%d.%d", |
snprintf (env_addr, sizeof (env_addr) - 1, "ADDRESS=%s", inet_ntoa(if_addr)); |
56 |
if_addr >> 24 & 0xff, |
snprintf (env_dns, sizeof (env_dns) - 1, "DNS=%s", inet_ntoa(dns)); |
57 |
if_addr >> 16 & 0xff, if_addr >> 8 & 0xff, if_addr & 0xff); |
snprintf (env_domain, sizeof (env_domain) - 1, "DOMAIN=%s", domain); |
58 |
snprintf (netmask, sizeof (netmask) - 1, "NETMASK=%d.%d.%d.%d", |
snprintf (env_mtu, sizeof (env_mtu) - 1, "MTU=%d", mtu); |
|
if_netmask >> 24 & 0xff, |
|
|
if_netmask >> 16 & 0xff, |
|
|
if_netmask >> 8 & 0xff, if_netmask & 0xff); |
|
|
snprintf (network, sizeof (network) - 1, "NETWORK=%d.%d.%d.%d", |
|
|
if_network >> 24 & 0xff, |
|
|
if_network >> 16 & 0xff, |
|
|
if_network >> 8 & 0xff, if_network & 0xff); |
|
|
snprintf (broadcast, sizeof (broadcast) - 1, "BROADCAST=%d.%d.%d.%d", |
|
|
if_broadcast >> 24 & 0xff, |
|
|
if_broadcast >> 16 & 0xff, |
|
|
if_broadcast >> 8 & 0xff, if_broadcast & 0xff); |
|
|
snprintf (gateway, sizeof (gateway) - 1, "GATEWAY=%d.%d.%d.%d", |
|
|
if_gateway >> 24 & 0xff, |
|
|
if_gateway >> 16 & 0xff, |
|
|
if_gateway >> 8 & 0xff, if_gateway & 0xff); |
|
59 |
|
|
60 |
if (PARAM_IP_UP && !stat (PARAM_IP_UP, &st)) |
if (PARAM_IP_UP && !stat (PARAM_IP_UP, &st)) |
61 |
{ |
{ |
64 |
pid = fork (); |
pid = fork (); |
65 |
if (pid == 0) |
if (pid == 0) |
66 |
{ |
{ |
67 |
if (putenv (name) || |
if (putenv (env_name) || putenv (env_addr) || |
68 |
putenv (addr) || |
putenv (env_dns) || putenv (env_domain) || putenv (env_mtu)) |
69 |
putenv (netmask) || |
log (LOG_WARNING, "Can't set environment variables: %s (%d)", |
70 |
putenv (network) || putenv (broadcast) || putenv (gateway)) |
strerror(errno), errno); |
|
perror ("putenv"); |
|
71 |
|
|
72 |
/* execlp allows shell script execution */ |
/* execlp allows shell script execution */ |
73 |
if (execlp (PARAM_IP_UP, PARAM_IP_UP, NULL)) |
if (execlp (PARAM_IP_UP, PARAM_IP_UP, NULL)) |
74 |
perror ("execlp"); |
log (LOG_WARNING, "Can't exec script %s: %s (%d)", |
75 |
|
PARAM_IP_UP, strerror(errno), errno); |
76 |
exit (-1); |
exit (-1); |
77 |
} |
} |
78 |
else if (pid > 0) |
else if (pid > 0) |
81 |
} |
} |
82 |
else |
else |
83 |
{ |
{ |
84 |
perror ("fork"); |
log (LOG_WARNING, "Can't fork: %s (%d)", |
85 |
|
strerror(errno), errno); |
86 |
return 0; |
return 0; |
87 |
} |
} |
88 |
} |
} |
91 |
|
|
92 |
|
|
93 |
int |
int |
94 |
launch_down_up (if_name, if_addr, if_netmask, if_network, if_broadcast, |
launch_ip_down (if_name) |
|
if_gateway) |
|
95 |
char *if_name; |
char *if_name; |
|
in_addr_t if_addr; |
|
|
in_addr_t if_netmask; |
|
|
in_addr_t if_network; |
|
|
in_addr_t if_broadcast; |
|
|
in_addr_t if_gateway; |
|
96 |
{ |
{ |
97 |
char name[128]; |
char name[128]; |
|
char addr[128]; |
|
|
char netmask[128]; |
|
|
char network[128]; |
|
|
char broadcast[128]; |
|
|
char gateway[128]; |
|
98 |
int pid; |
int pid; |
99 |
struct stat st; |
struct stat st; |
100 |
|
|
101 |
snprintf (name, sizeof (name) - 1, "IFNAME=%s", if_name); |
snprintf (name, sizeof (name) - 1, "IFNAME=%s", if_name); |
|
snprintf (addr, sizeof (addr) - 1, "ADDRESS=%d.%d.%d.%d", |
|
|
if_addr >> 24 & 0xff, |
|
|
if_addr >> 16 & 0xff, if_addr >> 8 & 0xff, if_addr & 0xff); |
|
|
snprintf (netmask, sizeof (netmask) - 1, "NETMASK=%d.%d.%d.%d", |
|
|
if_netmask >> 24 & 0xff, |
|
|
if_netmask >> 16 & 0xff, |
|
|
if_netmask >> 8 & 0xff, if_netmask & 0xff); |
|
|
snprintf (network, sizeof (network) - 1, "NETWORK=%d.%d.%d.%d", |
|
|
if_network >> 24 & 0xff, |
|
|
if_network >> 16 & 0xff, |
|
|
if_network >> 8 & 0xff, if_network & 0xff); |
|
|
snprintf (broadcast, sizeof (broadcast) - 1, "BROADCAST=%d.%d.%d.%d", |
|
|
if_broadcast >> 24 & 0xff, |
|
|
if_broadcast >> 16 & 0xff, |
|
|
if_broadcast >> 8 & 0xff, if_broadcast & 0xff); |
|
|
snprintf (gateway, sizeof (gateway) - 1, "GATEWAY=%d.%d.%d.%d", |
|
|
if_gateway >> 24 & 0xff, |
|
|
if_gateway >> 16 & 0xff, |
|
|
if_gateway >> 8 & 0xff, if_gateway & 0xff); |
|
102 |
|
|
103 |
if (PARAM_IP_DOWN && !stat (PARAM_IP_DOWN, &st)) |
if (PARAM_IP_DOWN && !stat (PARAM_IP_DOWN, &st)) |
104 |
{ |
{ |
107 |
pid = fork (); |
pid = fork (); |
108 |
if (pid > 0) |
if (pid > 0) |
109 |
{ |
{ |
110 |
if (putenv (name) || |
if (putenv (name)) |
111 |
putenv (addr) || |
log (LOG_WARNING, "Can't set environment variables: %s (%d)", |
112 |
putenv (netmask) || |
strerror(errno), errno); |
|
putenv (network) || putenv (broadcast) || putenv (gateway)) |
|
|
perror ("putenv"); |
|
113 |
|
|
114 |
if (execlp (PARAM_IP_DOWN, PARAM_IP_DOWN, NULL)) |
if (execlp (PARAM_IP_DOWN, PARAM_IP_DOWN, NULL)) |
115 |
perror ("execv"); |
log (LOG_WARNING, "Can't exec script %s: %s (%d)", |
116 |
|
PARAM_IP_UP, strerror(errno), errno); |
117 |
exit (-1); |
exit (-1); |
118 |
} |
} |
119 |
else if (pid == 0) |
else if (pid == 0) |
121 |
} |
} |
122 |
else |
else |
123 |
{ |
{ |
124 |
perror ("fork"); |
log (LOG_WARNING, "Can't fork: %s (%d)", |
125 |
|
strerror(errno), errno); |
126 |
return 0; |
return 0; |
127 |
} |
} |
128 |
} |
} |