chiark
/
gitweb
/
~mdw
/
tripe
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
server/tun-slip.c, server/tripe-admin.5.in: Handle write errors.
[tripe]
/
server
/
tun-linux.c
diff --git
a/server/tun-linux.c
b/server/tun-linux.c
index 3cfa5d72d03778362fc59eef55163f606e7d8b04..2794ca8ccb11d063137ccbc7fa4d409c7350f8a4 100644
(file)
--- a/
server/tun-linux.c
+++ b/
server/tun-linux.c
@@
-1,13
+1,11
@@
/* -*-c-*-
/* -*-c-*-
- *
- * $Id$
*
* Tunnel interface based on Linux TUN/TAP driver
*
* (c) 2003 Straylight/Edgeware
*/
*
* Tunnel interface based on Linux TUN/TAP driver
*
* (c) 2003 Straylight/Edgeware
*/
-/*----- Licensing notice --------------------------------------------------*
+/*----- Licensing notice --------------------------------------------------*
*
* This file is part of Trivial IP Encryption (TrIPE).
*
*
* This file is part of Trivial IP Encryption (TrIPE).
*
@@
-15,12
+13,12
@@
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
- *
+ *
* TrIPE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* TrIPE is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
+ *
* You should have received a copy of the GNU General Public License
* along with TrIPE; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
* You should have received a copy of the GNU General Public License
* along with TrIPE; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
@@
-46,8
+44,7
@@
struct tunnel {
const tunnel_ops *ops; /* Pointer to operations */
sel_file f; /* Selector for TUN/TAP device */
struct peer *p; /* Pointer to my peer */
const tunnel_ops *ops; /* Pointer to operations */
sel_file f; /* Selector for TUN/TAP device */
struct peer *p; /* Pointer to my peer */
- char ifn[IFNAMSIZ]; /* Interface name buffer */
-};
+};
/* --- @t_read@ --- *
*
/* --- @t_read@ --- *
*
@@
-68,7
+65,8
@@
static void t_read(int fd, unsigned mode, void *v)
n = read(fd, buf_i, sizeof(buf_i));
if (n < 0) {
n = read(fd, buf_i, sizeof(buf_i));
if (n < 0) {
- a_warn("TUN", "%s", t->ifn, "read-error", "?ERRNO", A_END);
+ a_warn("TUN", "%s", p_ifname(t->p), "linux",
+ "read-error", "?ERRNO", A_END);
return;
}
IF_TRACING(T_TUNNEL, {
return;
}
IF_TRACING(T_TUNNEL, {
@@
-94,55
+92,27
@@
static void t_init(void) { return; }
/* --- @t_create@ --- *
*
* Arguments: @peer *p@ = pointer to peer block
/* --- @t_create@ --- *
*
* Arguments: @peer *p@ = pointer to peer block
+ * @int fd@ = file descriptor of tunnel device
+ * @char **ifn@ = where to put the interface name
*
* Returns: A tunnel block if it worked, or null on failure.
*
* Use: Initializes a new tunnel.
*/
*
* Returns: A tunnel block if it worked, or null on failure.
*
* Use: Initializes a new tunnel.
*/
-static tunnel *t_create(peer *p)
+static tunnel *t_create(peer *p
, int fd, char **ifn
)
{
{
- int fd;
- int f;
- struct ifreq iff;
tunnel *t;
tunnel *t;
- if ((fd = open("/dev/net/tun", O_RDWR)) < 0) {
- a_warn("TUN", "-", "linux",
- "open-error", "/dev/net/tun", "?ERRNO",
- A_END);
- return (0);
- }
fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC);
fdflags(fd, O_NONBLOCK, O_NONBLOCK, FD_CLOEXEC, FD_CLOEXEC);
- memset(&iff, 0, sizeof(iff));
- iff.ifr_name[0] = 0;
- iff.ifr_flags = IFF_TUN | IFF_NO_PI;
- if ((f = ioctl(fd, TUNSETIFF, &iff)) < 0) {
- a_warn("TUN", "-", "linux", "config-error", "?ERRNO", A_END);
- close(fd);
- return (0);
- }
t = CREATE(tunnel);
t->ops = &tun_linux;
t->p = p;
sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t);
sel_addfile(&t->f);
t = CREATE(tunnel);
t->ops = &tun_linux;
t->p = p;
sel_initfile(&sel, &t->f, fd, SEL_READ, t_read, t);
sel_addfile(&t->f);
- iff.ifr_name[IFNAMSIZ - 1] = 0;
- strcpy(t->ifn, iff.ifr_name);
- T( trace(T_TUNNEL, "tun-linux: attached interface %s to peer `%s'",
- t->ifn, p_name(p)); )
return (t);
}
return (t);
}
-/* --- @t_ifname@ --- *
- *
- * Arguments: @tunnel *t@ = pointer to tunnel block
- *
- * Returns: A pointer to the tunnel's interface name.
- */
-
-static const char *t_ifname(tunnel *t) { return (t->ifn); }
-
/* --- @t_inject@ --- *
*
* Arguments: @tunnel *t@ = pointer to tunnel block
/* --- @t_inject@ --- *
*
* Arguments: @tunnel *t@ = pointer to tunnel block
@@
-172,17
+142,14
@@
static void t_inject(tunnel *t, buf *b)
*/
static void t_destroy(tunnel *t)
*/
static void t_destroy(tunnel *t)
-{
- sel_rmfile(&t->f);
- close(t->f.fd);
- DESTROY(t);
-}
+ { sel_rmfile(&t->f); close(t->f.fd); DESTROY(t); }
const tunnel_ops tun_linux = {
"linux",
const tunnel_ops tun_linux = {
"linux",
+ TUNF_PRIVOPEN,
t_init,
t_create,
t_init,
t_create,
-
t_ifname
,
+
0
,
t_inject,
t_destroy
};
t_inject,
t_destroy
};