2 * netsniff-ng - the packet sniffing beast
3 * Copyright 2009, 2010 Daniel Borkmann.
4 * Subject to the GPL, version 2.
16 #include <sys/types.h>
18 #include <sys/types.h>
19 #include <sys/ioctl.h>
20 #include <sys/socket.h>
22 #include <linux/if_tun.h>
28 int open_or_die(const char *file
, int flags
)
30 int ret
= open(file
, flags
);
32 panic("Cannot open file %s! %s.\n", file
, strerror(errno
));
37 int open_or_die_m(const char *file
, int flags
, mode_t mode
)
39 int ret
= open(file
, flags
, mode
);
41 panic("Cannot open or create file %s! %s.", file
, strerror(errno
));
45 void create_or_die(const char *file
, mode_t mode
)
47 int fd
= open_or_die_m(file
, O_WRONLY
| O_CREAT
, mode
);
51 void pipe_or_die(int pipefd
[2], int flags
)
53 int ret
= pipe2(pipefd
, flags
);
55 panic("Cannot create pipe2 event fd! %s.\n", strerror(errno
));
58 int tun_open_or_die(char *name
, int type
)
65 panic("No name provided for tundev!\n");
67 fd
= open_or_die("/dev/net/tun", O_RDWR
);
69 memset(&ifr
, 0, sizeof(ifr
));
71 strlcpy(ifr
.ifr_name
, name
, IFNAMSIZ
);
73 ret
= ioctl(fd
, TUNSETIFF
, &ifr
);
75 panic("ioctl screwed up! %s.\n", strerror(errno
));
77 ret
= fcntl(fd
, F_SETFL
, fcntl(fd
, F_GETFL
) | O_NONBLOCK
);
79 panic("fctnl screwed up! %s.\n", strerror(errno
));
81 flags
= device_get_flags(name
);
82 flags
|= IFF_UP
| IFF_RUNNING
;
83 device_set_flags(name
, flags
);
88 ssize_t
read_or_die(int fd
, void *buf
, size_t len
)
90 ssize_t ret
= read(fd
, buf
, len
);
94 panic("Cannot read from descriptor! %s.\n", strerror(errno
));
100 ssize_t
write_or_die(int fd
, const void *buf
, size_t len
)
102 ssize_t ret
= write(fd
, buf
, len
);
106 panic("Cannot write to descriptor! %s.", strerror(errno
));
112 extern volatile sig_atomic_t sigint
;
114 ssize_t
read_exact(int fd
, void *buf
, size_t len
, int mayexit
)
116 ssize_t num
= 0, written
;
118 while (len
> 0 && !sigint
) {
119 if ((written
= read(fd
, buf
, len
)) < 0) {
120 if (errno
== EAGAIN
&& num
> 0)
137 ssize_t
write_exact(int fd
, void *buf
, size_t len
, int mayexit
)
139 ssize_t num
= 0, written
;
141 while (len
> 0 && !sigint
) {
142 if ((written
= write(fd
, buf
, len
)) < 0) {
143 if (errno
== EAGAIN
&& num
> 0)
160 static int fd_rnd
= -1;
162 static void randombytes(unsigned char *x
, unsigned long long xlen
)
168 fd_rnd
= open("/dev/urandom", O_RDONLY
);
181 ret
= read(fd_rnd
, x
, ret
);
192 /* Note: it's not really secure, but the name only suggests it's better to use
193 * than rand(3) when transferring bytes over the network in non-security
194 * critical structure members. secrand() is only used to fill up salts actually.
200 randombytes((void *) &ret
, sizeof(ret
));
205 static char const *priov
[] = {
206 [LOG_EMERG
] = "EMERG:",
207 [LOG_ALERT
] = "ALERT:",
208 [LOG_CRIT
] = "CRIT:",
210 [LOG_WARNING
] = "WARNING:",
211 [LOG_NOTICE
] = "NOTICE:",
212 [LOG_INFO
] = "INFO:",
213 [LOG_DEBUG
] = "DEBUG:",
216 static ssize_t
cookie_writer(void *cookie
, char const *data
, size_t leng
)
218 int prio
= LOG_DEBUG
, len
;
221 len
= strlen(priov
[prio
]);
222 } while (memcmp(data
, priov
[prio
], len
) && --prio
>= 0);
231 while (*data
== ' ') {
236 syslog(prio
, "%.*s", (int) leng
, data
);
241 static cookie_io_functions_t cookie_log
= {
242 .write
= cookie_writer
,
245 void to_std_log(FILE **fp
)
247 setvbuf(*fp
= fopencookie(NULL
, "w", cookie_log
), NULL
, _IOLBF
, 0);