2 * transsip - the telephony network
3 * By Daniel Borkmann <daniel@transsip.org>
4 * Copyright 2011 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>
23 #include "write_or_die.h"
27 extern sig_atomic_t quit
;
29 void fsync_or_die(int fd
, const char *msg
)
32 puke_and_die(EXIT_FAILURE
, "%s: fsync error", msg
);
35 int open_or_die(const char *file
, int flags
)
37 int ret
= open(file
, flags
);
39 puke_and_die(EXIT_FAILURE
, "Open error");
43 int open_or_die_m(const char *file
, int flags
, mode_t mode
)
45 int ret
= open(file
, flags
, mode
);
47 puke_and_die(EXIT_FAILURE
, "Open error");
51 int tun_open_or_die(char *name
)
56 fd
= open("/dev/net/tun", O_RDWR
);
58 panic("Cannot open /dev/net/tun!\n");
60 memset(&ifr
, 0, sizeof(ifr
));
61 ifr
.ifr_flags
= IFF_TUN
| IFF_NO_PI
;
64 strlcpy(ifr
.ifr_name
, name
, IFNAMSIZ
);
66 ret
= ioctl(fd
, TUNSETIFF
, &ifr
);
68 panic("ioctl screwed up!\n");
70 ret
= fcntl(fd
, F_SETFL
, fcntl(fd
, F_GETFL
) | O_NONBLOCK
);
72 panic("fctnl screwed up!\n");
77 ssize_t
read_or_die(int fd
, void *buf
, size_t len
)
79 ssize_t ret
= read(fd
, buf
, len
);
83 puke_and_die(EXIT_FAILURE
, "Read error");
89 ssize_t
read_exact(int fd
, void *buf
, size_t len
, int mayexit
)
91 register ssize_t num
= 0, written
;
93 while (len
> 0 && !quit
) {
94 if ((written
= read(fd
, buf
, len
)) < 0) {
95 if (errno
== EAGAIN
&& num
> 0)
114 ssize_t
write_exact(int fd
, void *buf
, size_t len
, int mayexit
)
116 register ssize_t num
= 0, written
;
118 while (len
> 0 && !quit
) {
119 if ((written
= write(fd
, buf
, len
)) < 0) {
120 if (errno
== EAGAIN
&& num
> 0)
139 ssize_t
write_or_die(int fd
, const void *buf
, size_t len
)
141 ssize_t ret
= write(fd
, buf
, len
);
145 puke_and_die(EXIT_FAILURE
, "Write error");
151 ssize_t
write_or_whine_pipe(int fd
, const void *buf
, size_t len
,
154 ssize_t ret
= write(fd
, buf
, len
);
158 whine("%s: write error (%s)!\n", msg
, strerror(errno
));
165 ssize_t
write_or_whine(int fd
, const void *buf
, size_t len
,
168 ssize_t ret
= write(fd
, buf
, len
);
170 whine("%s: write error (%s)!\n", msg
, strerror(errno
));