1
0
mirror of git://projects.qi-hardware.com/ben-wpan.git synced 2024-11-29 11:47:11 +02:00

tools/dirtpan/: if given an interface conf command, run it with tunX in $ITF

- dirtpan.c (open_tun): if a command is given, set the environment
  variable ITF to the interface name and system(3) the command
- dirtpan.c (usage, main): accept an interface configuration command as
  the 4th command-line argument
This commit is contained in:
Werner Almesberger 2011-05-11 16:46:29 -03:00
parent e17881c91b
commit de72af351f

View File

@ -17,9 +17,11 @@
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <fcntl.h> #include <fcntl.h>
#include <signal.h>
#include <assert.h> #include <assert.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/time.h> #include <sys/time.h>
#include <sys/wait.h>
#include <sys/select.h> #include <sys/select.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/socket.h> #include <sys/socket.h>
@ -474,10 +476,10 @@ static int open_net(uint16_t pan, uint16_t me, uint16_t peer)
} }
static int open_tun(void) static int open_tun(const char *cmd)
{ {
struct ifreq ifr; struct ifreq ifr;
int fd; int fd, res;
fd = open(TUN_DEV, O_RDWR); fd = open(TUN_DEV, O_RDWR);
if (fd < 0) { if (fd < 0) {
@ -493,9 +495,33 @@ static int open_tun(void)
exit(1); exit(1);
} }
if (!cmd) {
fprintf(stderr, "%s\n", ifr.ifr_name); fprintf(stderr, "%s\n", ifr.ifr_name);
return fd; return fd;
}
if (setenv("ITF", ifr.ifr_name, 1) < 0) {
perror("setenv");
exit(1);
}
res = system(cmd);
if (res < 0) {
perror("system");
exit(1);
}
if (WIFEXITED(res)) {
if (!WEXITSTATUS(res))
return fd;
exit(WEXITSTATUS(res));
}
if (WIFSIGNALED(res)) {
raise(WTERMSIG(res));
exit(1);
}
fprintf(stderr, "cryptic exit status %d\n", res);
exit(1);
} }
@ -504,8 +530,9 @@ static int open_tun(void)
static void usage(const char *name) static void usage(const char *name)
{ {
fprintf(stderr, "usage: %s [-d [-d]] pan_id src_addr dst_addr\n", fprintf(stderr,
name); "usage: %s [-d [-d]] pan_id src_addr dst_addr [command]\n"
, name);
exit(1); exit(1);
} }
@ -526,6 +553,7 @@ static uint16_t addr(const char *name, const char *s)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
const char *cmd = NULL;
uint16_t pan, src, dst; uint16_t pan, src, dst;
int c; int c;
@ -539,6 +567,9 @@ int main(int argc, char **argv)
} }
switch (argc-optind) { switch (argc-optind) {
case 4:
cmd = argv[optind+3];
/* fall through */
case 3: case 3:
pan = addr(*argv, argv[optind]); pan = addr(*argv, argv[optind]);
src = addr(*argv, argv[optind+1]); src = addr(*argv, argv[optind+1]);
@ -549,7 +580,7 @@ int main(int argc, char **argv)
} }
net = open_net(pan, src, dst); net = open_net(pan, src, dst);
tun = open_tun(); tun = open_tun(cmd);
while (1) while (1)
event(); event();