2 * netsniff-ng - the packet sniffing beast
3 * By Daniel Borkmann <daniel@netsniff-ng.org>
4 * Copyright 2009, 2010 Daniel Borkmann.
5 * Subject to the GPL, version 2.
15 #include <sys/types.h>
17 #include <sys/types.h>
18 #include <sys/ioctl.h>
19 #include <sys/socket.h>
21 #include <linux/if_tun.h>
27 int open_or_die(const char *file
, int flags
)
29 int ret
= open(file
, flags
);
31 panic("Cannot open file!\n");
35 int open_or_die_m(const char *file
, int flags
, mode_t mode
)
37 int ret
= open(file
, flags
, mode
);
39 panic("Cannot open or create file!");
43 int tun_open_or_die(char *name
, int type
)
47 fd
= open("/dev/net/tun", O_RDWR
);
49 panic("Cannot open /dev/net/tun!\n");
50 memset(&ifr
, 0, sizeof(ifr
));
53 strlcpy(ifr
.ifr_name
, name
, IFNAMSIZ
);
54 ret
= ioctl(fd
, TUNSETIFF
, &ifr
);
56 panic("ioctl screwed up!\n");
57 ret
= fcntl(fd
, F_SETFL
, fcntl(fd
, F_GETFL
) | O_NONBLOCK
);
59 panic("fctnl screwed up!\n");
63 ssize_t
read_or_die(int fd
, void *buf
, size_t len
)
65 ssize_t ret
= read(fd
, buf
, len
);
69 panic("Cannot read from descriptor!\n");
74 ssize_t
write_or_die(int fd
, const void *buf
, size_t len
)
76 ssize_t ret
= write(fd
, buf
, len
);
80 panic("Cannot write to descriptor!");
86 extern sig_atomic_t sigint
;
88 ssize_t
read_exact(int fd
, void *buf
, size_t len
, int mayexit
)
90 register ssize_t num
= 0, written
;
91 while (len
> 0 && !sigint
) {
92 if ((written
= read(fd
, buf
, len
)) < 0) {
93 if (errno
== EAGAIN
&& num
> 0)
109 ssize_t
write_exact(int fd
, void *buf
, size_t len
, int mayexit
)
111 register ssize_t num
= 0, written
;
112 while (len
> 0 && !sigint
) {
113 if ((written
= write(fd
, buf
, len
)) < 0) {
114 if (errno
== EAGAIN
&& num
> 0)
130 void check_for_root_maybe_die(void)
132 if (geteuid() != 0 || geteuid() != getuid())
133 panic("Uhhuh, not root?!\n");